[Pkg-cli-apps-commits] [SCM] banshee branch, upstream, updated. upstream/1.5.1.git2260a87-2-ga946a5b

Chow Loong Jin hyperair at gmail.com
Tue Dec 1 21:11:40 UTC 2009


The following commit has been merged in the upstream branch:
commit a946a5bcb2eb4d456ebf715b58b823f0468e7268
Author: Chow Loong Jin <hyperair at gmail.com>
Date:   Wed Dec 2 04:21:17 2009 +0800

    Imported Upstream version 1.5.2

diff --git a/ChangeLog b/ChangeLog
index 10e697a..c3ca02a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
-2009-10-13  The Banshee Project  <http://banshee-project.org>
+2009-11-20  The Banshee Project  <http://banshee-project.org>
 
-	Banshee 1.5.1
+	Banshee 1.5.2
 
 	You probably are looking for the useful change summary detailed
 	in the NEWS file, perfect for downstream maintainers.
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index d3c5b40..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,237 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007 Free Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
-
-     Running `configure' might take a while.  While running, it prints
-     some messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-  6. Often, you can also type `make uninstall' to remove the installed
-     files again.
-
-Compilers and Options
-=====================
-
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
-Installation Names
-==================
-
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug.  Until the bug is fixed you can use this workaround:
-
-     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/Makefile.in b/Makefile.in
index 9fc8de2..691aaff 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -36,7 +38,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
 	$(top_srcdir)/build/m4/shave/shave-libtool.in \
 	$(top_srcdir)/build/m4/shave/shave.in $(top_srcdir)/configure \
-	AUTHORS COPYING INSTALL NEWS config.guess config.sub depcomp \
+	AUTHORS COPYING NEWS config.guess config.sub depcomp \
 	install-sh ltmain.sh missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -75,6 +78,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = build/m4/shave/shave build/m4/shave/shave-libtool
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -86,6 +90,9 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
@@ -93,9 +100,34 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
 am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
 GZIP_ENV = --best
 distuninstallcheck_listfiles = find . -type f -print
@@ -161,6 +193,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -180,6 +214,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -193,29 +229,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -424,15 +441,15 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
-	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
 		&& exit 0; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -448,9 +465,10 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC
 	$(SHELL) ./config.status --recheck
 
 $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
 
 config.h: stamp-h1
 	@if test ! -f $@; then \
@@ -462,7 +480,7 @@ stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
 	@rm -f stamp-h1
 	cd $(top_builddir) && $(SHELL) ./config.status config.h
 $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
-	cd $(top_srcdir) && $(AUTOHEADER)
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
 	rm -f stamp-h1
 	touch $@
 
@@ -480,7 +498,7 @@ clean-libtool:
 	-rm -rf .libs _libs
 
 distclean-libtool:
-	-rm -f libtool
+	-rm -f libtool config.lt
 
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
@@ -506,7 +524,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -540,16 +558,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -557,14 +575,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -576,7 +594,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
@@ -585,36 +603,41 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
-	test -d $(distdir) || mkdir $(distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	list='$(DISTFILES)'; \
@@ -630,29 +653,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -660,11 +698,12 @@ distdir: $(DISTFILES)
 	$(MAKE) $(AM_MAKEFLAGS) \
 	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
 	  dist-hook
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
 	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
+	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__remove_distdir)
@@ -676,6 +715,10 @@ dist-lzma: distdir
 	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
 	$(am__remove_distdir)
 
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__remove_distdir)
@@ -706,6 +749,8 @@ distcheck: dist
 	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lzma*) \
 	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
@@ -717,9 +762,11 @@ distcheck: dist
 	mkdir $(distdir)/_build
 	mkdir $(distdir)/_inst
 	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
 	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
@@ -741,13 +788,15 @@ distcheck: dist
 	  && rm -rf "$$dc_destdir" \
 	  && $(MAKE) $(AM_MAKEFLAGS) dist \
 	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
 	$(am__remove_distdir)
 	@(echo "$(distdir) archives ready for distribution: "; \
 	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
 	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
+	@$(am__cd) '$(distuninstallcheck_dir)' \
 	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
 	   || { echo "ERROR: files left after uninstall:" ; \
 	        if test -n "$(DESTDIR)"; then \
@@ -790,6 +839,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -812,6 +862,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -820,18 +872,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -855,26 +917,26 @@ ps-am:
 uninstall-am:
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip uninstall-am
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+	ctags-recursive install-am install-strip tags-recursive \
+	uninstall-am
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am am--refresh check check-am clean clean-generic \
 	clean-libtool clean-local ctags ctags-recursive dist dist-all \
 	dist-bzip2 dist-gzip dist-hook dist-lzma dist-shar dist-tarZ \
-	dist-zip distcheck distclean distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-hook
+	dist-xz dist-zip distcheck distclean distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-hook
 
 
 # Important targets
@@ -940,6 +1002,7 @@ hg:
 	mono --debug tester.exe; \
 	rm tester.*; \
 	popd; 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/NEWS b/NEWS
index ff046c4..55ab0b4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,5 @@
 ===============================================================================
-WELCOME TO BANSHEE 1.5.1 - Released October 13, 2009
+WELCOME TO BANSHEE 1.5.2 - Released November 20, 2009
 ===============================================================================
 
   * Banshee is a multimedia management and playback application for GNOME.
@@ -10,87 +10,55 @@ WELCOME TO BANSHEE 1.5.1 - Released October 13, 2009
     experience automatic cover art fetching as you listen; and easily browse,
     search, and control your media collection."
 
-  * Learn More: http://banshee-project.org/download/archives/1.5.1
+  * Learn More: http://banshee-project.org/download/archives/1.5.2
 
 
 ===============================================================================
 NEW AWESOME FEATURES AND ENHANCEMENTS
 ===============================================================================
 
-    Banshee 1.5.1 brings many big changes, new features, and fixes!
+    Banshee 1.5.2 brings many big changes, new features, and fixes!
 
     New Features:
 
-      * Play Queue Auto DJ keeps the tunes coming
-      * Shuffle by album and artist
-      * Shuffle by weighted rating and score mode
-      * Add tooltips for ellipsized ListView text
-      * Keep the playing song visible in the track list
-      * Add support for WebOS devices
-      * Add support for the Samsung Galaxy Android Phone
+      * The Internet Archive extension
+      * The iTunes importer
+      * Metadata ratings and playcount import and export
+      * Add support for Pulse and Droid phones
+      * Use new Last.fm API
 
     Enhancements:
 
-      * When user picks new sort column, default to sort ascending
-      * Drop the " Library" suffix on the Music and Video sources
-      * Add thin highlight to ListView selection for 3D effect
-      * Keyboard shortcut (ESC) to clear the search box (BGO #558938)
-      * Expose LAME's "preset" option (BGO #563303)
-      * Added a --gconf-base-key for running sandboxed (BGO #585546)
-      * Trim URL pasted from clipboard to podcast dialog (BGO  #585679)
-      * Allow selection of multiple folders on import (BGO#586946)
-      * Support playlists on Android G1 devices (BGO #583335)
-      * Better support for devices running Rockbox
-      * Set video sync folder for Android and WebOS devices
-      * Made the error message label selectable (BGO #589741)
-      * Save and load the Gtk.AccelMap (BGO #579013)
-      * Added taglib/oga mimetype to the vorbis audio profile (BGO #586999)
-      * Auto-completion for composer, conductor, grouping and copyright (BGO #592129)
-      * Added the 'comment' search filter (BGO #380524)
-      * Selectable song properties (BGO #586106)
-      * Show a tooltip in track editor when the property is truncated (BGO #589782)
+      * Many accessibility enhancements
+      * When sorting by score also sort by playcount (bgo#598431)
+      * Add WICD support (bgo#596918)
+      * Add the USB id for the Palm Pre in developer mode
+      * Improve the import media dialog (bgo#559013)
+      * Allow seeking in DAAP streams
+      * Tooltip for the AutoDJ source combobox (bgo#598504)
+      * Improve recognition of Android devices
+      * Recognize Samsung Galaxy device in debug mode
+      * PlaybackError query field (bgo#590946)
+      * Additional tokens for file system organization (bgo#489861)
+      * Remember direction when sorting the list view (bgo#590869)
+      * Cleaner track change notification popup (bgo#565453)
+      * Move Last.fm settings to the preferences dialog
+      * Double click toggles fullscreen in Now Playing (bgo#577971)
 
     Notable bug fixes:
 
-      * Fix blank MimeTypes for tracks ripped before 1.4 (BGO #536590)
-      * Fix a Bit Rate column sizing glitch (BGO #584587)
-      * Fix browser positioning when Banshee is maximised (BGO #575834)
-      * Fix compilation metadata reading and writing (BGO #563283)
-      * Work with new notification-daemon (BGO #565876)
-      * Avoid needlessly syncing iPods twice
-      * Deterministically sort sources to avoid fluttering
-      * Look for Rhythmbox db at both new and old paths
-      * Fix bug with scrobbling after skipping a track (BGO #584614)
-      * Fix crash in equalizer (BGO #548912)
-      * Fix an exception on startup when DBus is disabled (BGO #573050)
-      * Fix off-by-one-day date querying bug (BGO #546844)
-      * Fix a UI/spacing glitch in the Smart Playlist Editor (BGO #571288)
-      * Don't hide the track info popup while it has focus (BGO #544592)
-      * Prevent endless "Searching for CD metadata..." (BGO #527788)
-      * Fix Last.fm now-playing for non-decimal track lengths (BGO #586460)
-      * Dispose the SqliteCommand after it's executed (BGO #586498)
-      * Fix notification area popup positioning on multi-monitor systems (BGO #586589)
-      * Fix the playing indicator when song in list more than once (BGO #585798)
-      * Fix crash when opening the profile conf dialog (BGO #587308)
-      * Fix crash stopping jobs on shutdown (BGO #587373)
-      * Fix notification area popup flashing (BGO #587703)
-      * Trim filename dots and spaces to be NTFS compliant (BGO #588350)
-      * Stop playing from audio CD when it's ejected (BGO #475094)
-      * Don't update DateUpdated stamp when transient fields change (BGO #585896)
-      * Fix DAP content page title not changing when device renamed (BGO #589290)
-      * Set the Podcast flag on import based on genre (BGO #589831)
-      * Fix hang when slider dragged to track change (BGO #539395).
-      * Prevent slider jumping around after seeking in stream (BGO #591016)
-      * Fix Last.fm logos on dark themes (BGO #588094)
-      * --query-X option sometimes returned an error (BGO #591291)
-      * Build and runtime fixes for FreeBSD
-      * Fix editor always prompting to save podcasts (BGO #584880)
-      * Fix rounding when updating the track score
-      * Fix initial track score calculation (BGO #594568)
-      * Fix playback buttons' a11y (BGO #595294)
-      * Fix crasher on PPC (BGO #547218)
-
-      * 131 bugs were fixed since 1.5.0
+      * Fix the playcount update (bgo#563021)
+      * Correct default button in message dialogs (bgo#599495)
+      * Hide shuffle menu when shuffling is disabled (bgo#599465)
+      * Fix bug with AutoDJ updating LastPlayed erroneously (bgo#594701)
+      * Fix next playback source (bgo#599834)
+      * Fix adding tracks to the play queue (bgo#600498)
+      * Fix up iPod podcast support (bgo#434237)
+      * Fix cover art pick up for multi-disc albums (bgo#591982)
+      * Fix the play queue when StopWhenFinished is on (bgo#563021)
+      * Fix race when saving track metadata (bgo#598321)
+
+      * 49 bugs were fixed since 1.5.1
 
 
 ===============================================================================
@@ -100,9 +68,9 @@ SOURCES / PACKAGES
 Sources
 -------
 
-    * Banshee 1.5.1 Tarballs:
-      http://download.banshee-project.org/banshee/stable/1.5.1/banshee-1-1.5.1.tar.bz2
-      http://download.banshee-project.org/banshee/stable/1.5.1/banshee-1-1.5.1.tar.gz
+    * Banshee 1.5.2 Tarballs:
+      http://download.banshee-project.org/banshee/stable/1.5.2/banshee-1-1.5.2.tar.bz2
+      http://download.banshee-project.org/banshee/stable/1.5.2/banshee-1-1.5.2.tar.gz
 
 Packages
 --------
@@ -118,13 +86,15 @@ Packages
 
     Binaries for Mac OS X 10.4 and 10.5:
 
-    * http://download.banshee-project.org/banshee/stable/1.5.1/banshee-1-1.5.1.macosx.intel.dmg
+    * There is no build for OS X for Banshee 1.5.2 due to a time crunch and
+      technical difficulties with the latest Mono releases for OS X.  We plan to
+      have this resolved in time for the 1.5.3 release.
 
 ChangeLogs & Checksums
 ----------------------
 
-    * http://download.banshee-project.org/banshee/stable/1.5.1/banshee-1-1.5.1.changes
-    * http://download.banshee-project.org/banshee/stable/1.5.1/banshee-1-1.5.1.sha1sum
+    * http://download.banshee-project.org/banshee/stable/1.5.2/banshee-1-1.5.2.changes
+    * http://download.banshee-project.org/banshee/stable/1.5.2/banshee-1-1.5.2.sha1sum
 
 
 ===============================================================================
@@ -139,14 +109,14 @@ DEPENDENCIES
     * NDesk DBus (ndesk-dbus) 0.5
     * NDesk DBus GLib (ndesk-dbus-glib) 0.3
     * Mono.Addins (mono-addins) 0.3.1
-    * TagLib# (taglib-sharp) 2.0.3.1 (2.0.3.2 recommended)
+    * TagLib# (taglib-sharp) 2.0.3.2
 
     * Required to build default feature stack:
       * libmtp >= 0.2.0
         * Note to packagers: since libmtp has different .so files for
           different versions, you need to require in your package the same
           version of libmtp you used to build Banshee.
-      * ipod-sharp >= 0.8.1 (0.8.2 recommended)
+      * ipod-sharp >= 0.8.5
       * mono-zeroconf >= 0.8.0
       * boo >= 0.8.1
 
@@ -186,7 +156,7 @@ REPORT BUGS - HELP THE PROJECT - GROW THE COMMUNITY
     hesitate to file bugs!
 
     * http://banshee-project.org/contribute/file-bugs
-    * http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&version=1.5.1
+    * http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&version=1.5.2
 
 
 ===============================================================================
@@ -199,48 +169,44 @@ Contributors For This Release
     The following people directly contributed to the release of this version
     of Banshee. Without their help, there would be no release!
 
-      Aaron Bockover, Alex Bennee, Alex Launi, Alexander Kojevnikov,
-      Andrea Cimitan, Benjamín Valero Espinosa, Bertrand Lorentz,
-      Chow Loong Jin, Christopher James Halse Rogers, David Stone,
-      Eitan Isaacson, Elena Grassi, Florent Thoumie, Gabriel Burt,
-      Haitao Feng, Jack Deslippe, Jeff Wheeler, Jensen Somers, Johannes Kuhn,
-      Michael Martin-Smucker, Neil Loknath, Nils Naumann, Olivier Duff,
-      Paul Lange, Pratik Patel, Romain Tartière, Sandy Armstrong,
-      Tobias Mueller, Travis Glenn Hansen
+      Aaron Bockover, Alexander Kojevnikov, Benjamín Valero Espinosa,
+      Bertrand Lorentz, Chow Loong Jin, Eitan Isaacson, Gabriel Burt,
+      Götz Waschk, Jason Taylor, Jérémie Laval, Michael Martin-Smucker,
+      Neil Loknath, Nicholas Parker, Pratik Patel, Sandy Armstrong
 
     The following people contributed updated translations to this release.
     Without them, our project's reach would be much more limited.
 
-      A S Alam, António Lima, Aron Xu, Benjamín Valero Espinosa,
-      Christian Kirbach, Daniel Nylander, Denis ARNAUD, Fran Diéguez,
-      Gabor Kelemen, Gianvito Cavasoli, Gintautas Miliauskas, Ilkka Tuohela,
-      Inaki Larranaga Murgoitio, Jordi Mas, Jorge González,
-      Mario Blättermann, Miloš Popović, Piotr Drąg, Timur Zhamakeev,
-      Tomasz Dominikowski, Wolfgang Stöggl, Yaron Shahrabani,
-      Žygimantas Beručka
+      Andrej Žnidaršič, Benjamín Valero Espinosa, Daniel Nylander,
+      Gianvito Cavasoli, Mario Blättermann, Sweta Kothari, Tao Wei
 
 Contributors In Past Releases
 -----------------------------
 
     Aaron Bockover, Gabriel Burt, Alexander Kojevnikov, Bertrand Lorentz,
-    John Millikin, Scott Peterson, Alan McGovern, Alex Kloss, Alex Launi,
-    Alexander Hixon, Alexandros Frantzis, Alp Toker, Andreas Neustifter,
-    Andrés G. Aragoneses, Andrew Conkling, Andy Midgette, Arthur Carli,
-    Aydemir Ulaş Şahin, Ben Maurer, Benjamín Valero Espinosa, Bill Dawson,
-    Bob Copeland, Bojan Rajkovic, Brad Taylor, Brandon Perry, Brian Lucas,
-    Brian Nickel, Brian Teague, Chris Howie, Chris Jones, Chris Lahey,
+    John Millikin, Scott Peterson, Alan McGovern, Alex Bennee, Alex Kloss,
+    Alex Launi, Alexander Hixon, Alexandros Frantzis, Alp Toker,
+    Andrea Cimitan, Andreas Neustifter, Andrew Conkling, Andrés G. Aragoneses,
+    Andy Midgette, Arthur Carli, Aydemir Ulaş Şahin, Ben Maurer,
+    Benjamín Valero Espinosa, Bertrand Lorentz, Bill Dawson, Bob Copeland,
+    Bojan Rajkovic, Brad Taylor, Brandon Perry, Brian Lucas, Brian Nickel,
+    Brian Teague, Chow Loong Jin, Chris Howie, Chris Jones, Chris Lahey,
     Chris Toshok, Chris Turchin, Christian Krause, Christoph Burgdorf,
-    Christopher Halse Rogers, Cody Russell, Cosmin Banu, Dan Wilson,
-    Dan Winship, Daniel Munkton, Daniel Siegel, David Spreen,
-    Diego E. Pettenò, Eoin Hennessy, Eric Butler, Erik Schmidt, Fabian Jost,
-    Fredrik Hedberg, Félix Velasco, Hans Petter Jansson, Iain Lane,
-    Igor Guerrero Fonseca, Ilya Konstantinov, Ivan N. Zlatev, James Willcox,
-    Jan Arne Petersen, Jason Conti, Jeff Tickle, Jo Shields, Jorge Castro,
-    Juri Pakaste, Ken Vandine, Larry Ewing, Lauri Kotilainen, Matt Enright,
-    Michael Kaiser, Michael Monreal, Miguel de Icaza, Mike Urbanski,
-    Moritz Schallaböck, Nathan Palmer, Neil Loknath, Nicholas Doyle,
-    Nicholas Parker, Nicolò Chieffo, Oscar Forero, Pacho Ramos,
+    Christopher James Halse Rogers, Cody Russell, Cosmin Banu, Dan Wilson,
+    Dan Winship, Daniel Munkton, Daniel Siegel, David Spreen, David Stone,
+    Diego E. Pettenò, Eitan Isaacson, Elena Grassi, Eoin Hennessy,
+    Eric Butler, Erik Schmidt, Fabian Jost, Florent Thoumie, Fredrik Hedberg,
+    Félix Velasco, Götz Waschk, Haitao Feng, Hans Petter Jansson, Iain Lane,
+    Igor Guerrero Fonseca, Ilya Konstantinov, Ivan N. Zlatev, Jack Deslippe,
+    James Willcox, Jan Arne Petersen, Jason Conti, Jason Taylor, Jeff Tickle,
+    Jeff Wheeler, Jensen Somers, Jérémie Laval, Jo Shields, Johannes Kuhn,
+    Jorge Castro, Juri Pakaste, Ken Vandine, Larry Ewing, Lauri Kotilainen,
+    Matt Enright, Michael Kaiser, Michael Martin-Smucker, Michael Monreal,
+    Miguel de Icaza, Mike Urbanski, Moritz Schallaböck, Nathan Palmer,
+    Neil Loknath, Nicholas Doyle, Nicholas Parker, Nicolò Chieffo,
+    Nils Naumann, Olivier Duff, Oscar Forero, Pacho Ramos,
     Patrick van Staveren, Paul Lange, Pepijn van de Geer, Peter de Kraker,
-    Przemysław Grzegorczyk, Roderich Schupp, Ruben Vermeersch,
-    Sandy Armstrong, Sebastian Dröge, Tim Yamin, Todd Berman, Trey Ethridge,
+    Pratik Patel, Przemysław Grzegorczyk, Roderich Schupp, Romain Tartière,
+    Ruben Vermeersch, Sandy Armstrong, Sebastian Dröge, Tim Yamin,
+    Tobias Mueller, Todd Berman, Travis Glenn Hansen, Trey Ethridge,
     Valentin Sawadski, Will Farrington, William Pettersson, Wouter Bolsterlee
diff --git a/aclocal.m4 b/aclocal.m4
index 25116ed..4eb70c0 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -13,7 +13,7 @@
 
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(AC_AUTOCONF_VERSION, [2.63],,
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
 [m4_warning([this file was generated for autoconf 2.63.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
@@ -55,10 +55,11 @@ AC_DEFUN([AM_GCONF_SOURCE_2],
   AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files])
 
   AC_ARG_ENABLE(schemas-install,
-     [  --disable-schemas-install	Disable the schemas installation],
+  	AC_HELP_STRING([--disable-schemas-install],
+		       [Disable the schemas installation]),
      [case ${enableval} in
        yes|no) ;;
-       *) AC_MSG_ERROR(bad value ${enableval} for --enable-schemas-install) ;;
+       *) AC_MSG_ERROR([bad value ${enableval} for --enable-schemas-install]) ;;
       esac])
   AM_CONDITIONAL([GCONF_SCHEMAS_INSTALL], [test "$enable_schemas_install" != no])
 ])
@@ -158,8 +159,9 @@ main ()
 {
   int major, minor, micro;
   char *tmp_version;
+  int ignored;
 
-  system ("touch conf.glibtest");
+  ignored = system ("touch conf.glibtest");
 
   /* HP/UX 9 (%@#!) writes to sscanf strings */
   tmp_version = g_strdup("$min_glib_version");
@@ -750,25 +752,25 @@ INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcar
     INTLTOOL_SERVICE_RULE='%.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
    INTLTOOL_POLICY_RULE='%.policy:    %.policy.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
 
-AC_SUBST(INTLTOOL_DESKTOP_RULE)
-AC_SUBST(INTLTOOL_DIRECTORY_RULE)
-AC_SUBST(INTLTOOL_KEYS_RULE)
-AC_SUBST(INTLTOOL_PROP_RULE)
-AC_SUBST(INTLTOOL_OAF_RULE)
-AC_SUBST(INTLTOOL_PONG_RULE)
-AC_SUBST(INTLTOOL_SERVER_RULE)
-AC_SUBST(INTLTOOL_SHEET_RULE)
-AC_SUBST(INTLTOOL_SOUNDLIST_RULE)
-AC_SUBST(INTLTOOL_UI_RULE)
-AC_SUBST(INTLTOOL_XAM_RULE)
-AC_SUBST(INTLTOOL_KBD_RULE)
-AC_SUBST(INTLTOOL_XML_RULE)
-AC_SUBST(INTLTOOL_XML_NOMERGE_RULE)
-AC_SUBST(INTLTOOL_CAVES_RULE)
-AC_SUBST(INTLTOOL_SCHEMAS_RULE)
-AC_SUBST(INTLTOOL_THEME_RULE)
-AC_SUBST(INTLTOOL_SERVICE_RULE)
-AC_SUBST(INTLTOOL_POLICY_RULE)
+_IT_SUBST(INTLTOOL_DESKTOP_RULE)
+_IT_SUBST(INTLTOOL_DIRECTORY_RULE)
+_IT_SUBST(INTLTOOL_KEYS_RULE)
+_IT_SUBST(INTLTOOL_PROP_RULE)
+_IT_SUBST(INTLTOOL_OAF_RULE)
+_IT_SUBST(INTLTOOL_PONG_RULE)
+_IT_SUBST(INTLTOOL_SERVER_RULE)
+_IT_SUBST(INTLTOOL_SHEET_RULE)
+_IT_SUBST(INTLTOOL_SOUNDLIST_RULE)
+_IT_SUBST(INTLTOOL_UI_RULE)
+_IT_SUBST(INTLTOOL_XAM_RULE)
+_IT_SUBST(INTLTOOL_KBD_RULE)
+_IT_SUBST(INTLTOOL_XML_RULE)
+_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE)
+_IT_SUBST(INTLTOOL_CAVES_RULE)
+_IT_SUBST(INTLTOOL_SCHEMAS_RULE)
+_IT_SUBST(INTLTOOL_THEME_RULE)
+_IT_SUBST(INTLTOOL_SERVICE_RULE)
+_IT_SUBST(INTLTOOL_POLICY_RULE)
 
 # Check the gettext tools to make sure they are GNU
 AC_PATH_PROG(XGETTEXT, xgettext)
@@ -785,12 +787,17 @@ if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then
     AC_MSG_ERROR([GNU gettext tools not found; required for intltool])
 fi
 
-AC_PATH_PROG(INTLTOOL_PERL, [perl])
+AC_PATH_PROG(INTLTOOL_PERL, perl)
 if test -z "$INTLTOOL_PERL"; then
-   AC_MSG_ERROR([perl not found; required for intltool])
+   AC_MSG_ERROR([perl not found])
 fi
-if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then
-   AC_MSG_ERROR([perl 5.x required for intltool])
+AC_MSG_CHECKING([for perl >= 5.8.1])
+$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1
+if test $? -ne 0; then
+   AC_MSG_ERROR([perl 5.8.1 is required for intltool])
+else
+   IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`"
+   AC_MSG_RESULT([$IT_PERL_VERSION])
 fi
 if test "x$2" != "xno-xml"; then
    AC_MSG_CHECKING([for XML::Parser])
@@ -846,7 +853,7 @@ dnl The following CONFIG_COMMANDS should be exetuted at the very end
 dnl of config.status.
 AC_CONFIG_COMMANDS_PRE([
   AC_CONFIG_COMMANDS([$1/stamp-it], [
-    if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" ]; then
+    if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then
        AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.])
     fi
     rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp"
@@ -868,6 +875,17 @@ AC_CONFIG_COMMANDS_PRE([
 ])dnl
 ])
 
+# _IT_SUBST(VARIABLE)
+# -------------------
+# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST
+#
+AC_DEFUN([_IT_SUBST],
+[
+AC_SUBST([$1])
+m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])])
+]
+)
+
 # deprecated macros
 AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL])
 # A hint is needed for aclocal from Automake <= 1.9.4:
@@ -9008,7 +9026,7 @@ else
 fi[]dnl
 ])# PKG_CHECK_MODULES
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9020,10 +9038,10 @@ fi[]dnl
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.10'
+[am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.10.1], [],
+m4_if([$1], [1.11], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -9037,12 +9055,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # AM_SET_CURRENT_AUTOMAKE_VERSION
 # -------------------------------
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.10.1])dnl
+[AM_AUTOMAKE_VERSION([1.11])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
@@ -9099,14 +9117,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 8
+# serial 9
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
@@ -9119,6 +9137,7 @@ AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
 _AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
 if $2; then
   $1_TRUE=
   $1_FALSE='#'
@@ -9132,14 +9151,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 9
+# serial 10
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -9196,6 +9215,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
   if test "$am_compiler_list" = ""; then
      am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
   fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
   for depmode in $am_compiler_list; do
     # Setup a source with many dependencies, because some compilers
     # like to wrap large dependency lists on column 80 (with \), and
@@ -9213,7 +9242,17 @@ AC_CACHE_CHECK([dependency style of $depcc],
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
     case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
     nosideeffect)
       # after this tag, mechanisms are not by side-effect, so they'll
       # only be used when explicitly requested
@@ -9223,19 +9262,23 @@ AC_CACHE_CHECK([dependency style of $depcc],
 	break
       fi
       ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
     none) break ;;
     esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
     if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       source=sub/conftest.c object=$am__obj \
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
          >/dev/null 2>conftest.err &&
        grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
       # icc doesn't choke on unknown options, it will just issue warnings
       # or remarks (even with -Werror).  So we grep stderr for any message
@@ -9292,57 +9335,68 @@ _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-#serial 3
+#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-    dirpart=`AS_DIRNAME("$mf")`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`AS_DIRNAME(["$file"])`
-    AS_MKDIR_P([$dirpart/$fdir])
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
   done
-done
+}
 ])# _AM_OUTPUT_DEPENDENCY_COMMANDS
 
 
@@ -9374,13 +9428,13 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
 # Do all the work for Automake.                             -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008 Free Software Foundation, Inc.
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 13
+# serial 16
 
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
@@ -9397,7 +9451,7 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.60])dnl
+[AC_PREREQ([2.62])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -9448,8 +9502,8 @@ AM_MISSING_PROG(AUTOCONF, autoconf)
 AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
 AM_MISSING_PROG(AUTOHEADER, autoheader)
 AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
 AC_REQUIRE([AM_PROG_MKDIR_P])dnl
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
@@ -9457,24 +9511,37 @@ AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-	      		     [_AM_PROG_TAR([v7])])])
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-                  [_AM_DEPENDENCIES(CC)],
-                  [define([AC_PROG_CC],
-                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                  [_AM_DEPENDENCIES(CXX)],
-                  [define([AC_PROG_CXX],
-                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                  [_AM_DEPENDENCIES(OBJC)],
-                  [define([AC_PROG_OBJC],
-                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
 ])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
 ])
 
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
 
 # When config.status generates a header, we must update the stamp-h file.
 # This file resides in the same directory as the config header
@@ -9497,7 +9564,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9508,7 +9575,14 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
 AC_SUBST(install_sh)])
 
 # Copyright (C) 2003, 2005  Free Software Foundation, Inc.
@@ -9535,27 +9609,38 @@ AC_SUBST([am__leading_dot])])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
+# serial 5
 
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
 AC_DEFUN([AM_MAINTAINER_MODE],
-[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
-  dnl maintainer-mode is disabled by default
-  AC_ARG_ENABLE(maintainer-mode,
-[  --enable-maintainer-mode  enable make rules and dependencies not useful
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t at _MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
 			  (and sometimes confusing) to the casual installer],
-      USE_MAINTAINER_MODE=$enableval,
-      USE_MAINTAINER_MODE=no)
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
   AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
   MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST(MAINT)dnl
+  AC_SUBST([MAINT])dnl
 ]
 )
 
@@ -9563,13 +9648,13 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
+# serial 4
 
 # AM_MAKE_INCLUDE()
 # -----------------
@@ -9578,7 +9663,7 @@ AC_DEFUN([AM_MAKE_INCLUDE],
 [am_make=${MAKE-make}
 cat > confinc << 'END'
 am__doit:
-	@echo done
+	@echo this is the am__doit target
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
@@ -9588,24 +9673,24 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
 # Now try BSD make style include.
 if test "$am__include" = "#"; then
    echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
 fi
 AC_SUBST([am__include])
 AC_SUBST([am__quote])
@@ -9615,14 +9700,14 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# serial 6
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -9639,7 +9724,14 @@ AC_SUBST($1)])
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 AC_REQUIRE_AUX_FILE([missing])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
 # Use eval to expand $SHELL
 if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
@@ -9677,13 +9769,13 @@ esac
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
+# serial 4
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -9700,7 +9792,7 @@ AC_DEFUN([_AM_SET_OPTION],
 # ----------------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
 
 # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
 # -------------------------------------------
@@ -9727,14 +9819,14 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
+# serial 5
 
 # AM_SANITY_CHECK
 # ---------------
@@ -9743,16 +9835,29 @@ AC_DEFUN([AM_SANITY_CHECK],
 # Just in case
 sleep 1
 echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
 # Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
    if test "$[*]" = "X"; then
       # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
+      set X `ls -t "$srcdir/configure" conftest.file`
    fi
    rm -f conftest.file
    if test "$[*]" != "X $srcdir/configure conftest.file" \
@@ -9805,18 +9910,25 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006  Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 2
+
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
 # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
 # This macro is traced by Automake.
 AC_DEFUN([_AM_SUBST_NOTMAKE])
 
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
 # Check how to create a tarball.                            -*- Autoconf -*-
 
 # Copyright (C) 2004, 2005  Free Software Foundation, Inc.
@@ -9928,6 +10040,7 @@ m4_include([build/m4/banshee/dap-ipod.m4])
 m4_include([build/m4/banshee/dap-karma.m4])
 m4_include([build/m4/banshee/dap-mtp.m4])
 m4_include([build/m4/banshee/dbus.m4])
+m4_include([build/m4/banshee/gio.m4])
 m4_include([build/m4/banshee/gnome-sharp.m4])
 m4_include([build/m4/banshee/gstreamer.m4])
 m4_include([build/m4/banshee/gtk-sharp.m4])
diff --git a/build/Makefile.in b/build/Makefile.in
index 516ecfd..0d35d3d 100644
--- a/build/Makefile.in
+++ b/build/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -51,6 +53,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -70,8 +73,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(bansheedir)"
-bansheeSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(banshee_SCRIPTS)
 SOURCES =
 DIST_SOURCES =
@@ -84,10 +108,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -149,6 +201,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -168,6 +222,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -181,29 +237,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,14 +414,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  build/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  build/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -402,25 +439,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-bansheeSCRIPTS: $(banshee_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bansheedir)" || $(MKDIR_P) "$(DESTDIR)$(bansheedir)"
-	@list='$(banshee_SCRIPTS)'; for p in $$list; do \
+	@list='$(banshee_SCRIPTS)'; test -n "$(bansheedir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(bansheeSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bansheedir)/$$f'"; \
-	    $(bansheeSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bansheedir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bansheedir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bansheedir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-bansheeSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(banshee_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bansheedir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bansheedir)/$$f"; \
-	done
+	@list='$(banshee_SCRIPTS)'; test -n "$(bansheedir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bansheedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bansheedir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -452,7 +505,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -486,16 +539,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -503,14 +556,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -522,7 +575,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -531,29 +584,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -574,29 +632,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -630,6 +703,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -649,6 +723,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -657,18 +733,28 @@ install-data-am: install-bansheeSCRIPTS
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -689,8 +775,8 @@ ps-am:
 
 uninstall-am: uninstall-bansheeSCRIPTS
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -720,6 +806,7 @@ $(TRANSLATOR_EXTRACTOR_ASSEMBLY): TranslatorExtractor.cs
 
 $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs
 	$(MCS) -out:$@ $<
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/build/build.environment.mk b/build/build.environment.mk
index 76df206..b4d71ae 100644
--- a/build/build.environment.mk
+++ b/build/build.environment.mk
@@ -18,6 +18,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -124,11 +125,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -144,6 +146,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
diff --git a/build/build.rules.mk b/build/build.rules.mk
index baaffc4..d429751 100644
--- a/build/build.rules.mk
+++ b/build/build.rules.mk
@@ -22,6 +22,10 @@ if ENABLE_TESTS
     ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
 endif
 
+if ENABLE_ATK
+    ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
+endif
+
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 
@@ -56,7 +60,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
diff --git a/build/m4/Makefile.in b/build/m4/Makefile.in
index d0c678b..0c1ac31 100644
--- a/build/m4/Makefile.in
+++ b/build/m4/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -132,6 +136,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -151,6 +157,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -164,29 +172,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -348,14 +337,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  build/m4/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  build/m4/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/m4/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/m4/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -373,6 +362,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -402,13 +392,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -436,6 +430,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -455,6 +450,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -463,18 +460,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -508,6 +515,7 @@ uninstall-am:
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
 	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/build/m4/banshee/dap-ipod.m4 b/build/m4/banshee/dap-ipod.m4
index 3031029..a83e4c0 100644
--- a/build/m4/banshee/dap-ipod.m4
+++ b/build/m4/banshee/dap-ipod.m4
@@ -1,6 +1,6 @@
 AC_DEFUN([BANSHEE_CHECK_DAP_IPOD],
 [
-	IPODSHARP_REQUIRED=0.8.1
+	IPODSHARP_REQUIRED=0.8.5
 
 	AC_ARG_ENABLE(ipod, AC_HELP_STRING([--disable-ipod], [Disable iPod DAP support]), , enable_ipod="yes")
 
@@ -18,7 +18,8 @@ AC_DEFUN([BANSHEE_CHECK_DAP_IPOD],
 	if test "x$enable_ipodsharp" = "xyes"; then
 		asms="`$PKG_CONFIG --variable=Libraries ipod-sharp` `$PKG_CONFIG --variable=Libraries ipod-sharp-ui`"
 		for asm in $asms; do
-			IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm $asm.mdb"
+			IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm"
+			[ -r "$asm.mdb" ] && IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm.mdb"
 		done
 		AC_SUBST(IPODSHARP_ASSEMBLIES)
 		AC_SUBST(IPODSHARP_LIBS)
diff --git a/build/m4/banshee/gio.m4 b/build/m4/banshee/gio.m4
new file mode 100644
index 0000000..e475465
--- /dev/null
+++ b/build/m4/banshee/gio.m4
@@ -0,0 +1,17 @@
+AC_DEFUN([BANSHEE_CHECK_GIO_SHARP],
+[
+	GNOMESHARP_REQUIRED=2.8
+
+    enable_gio=no
+
+	PKG_CHECK_MODULES(GTKSHARP_BEANS,
+		gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED,
+        enable_gio=yes, enable_gio=no)
+
+	PKG_CHECK_MODULES(GIOSHARP,
+		gio-sharp-2.0 >= $GNOMESHARP_REQUIRED,
+        enable_gio="$enable_gio", enable_gio=no)
+
+	AM_CONDITIONAL(ENABLE_GIO, test "x$enable_gio" = "xyes")
+])
+
diff --git a/build/m4/shamrock/nunit.m4 b/build/m4/shamrock/nunit.m4
index d2bec4f..4d57d00 100644
--- a/build/m4/shamrock/nunit.m4
+++ b/build/m4/shamrock/nunit.m4
@@ -2,21 +2,28 @@ AC_DEFUN([SHAMROCK_CHECK_NUNIT],
 [
 	NUNIT_REQUIRED=2.4.7
 
-	PKG_CHECK_MODULES(NUNIT, nunit >= $NUNIT_REQUIRED, 
-		do_tests="yes", do_tests="no")
-	
-	AC_SUBST(NUNIT_LIBS)
-	AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes")
+	AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests], [Enable NUnit tests]),
+		enable_tests=$enableval, enable_tests="no")
 
-	if test "x$do_tests" = "xno"; then
-        PKG_CHECK_MODULES(NUNIT, mono-nunit >= 2.4, 
-            do_tests="yes", do_tests="no")
-        
-        AC_SUBST(NUNIT_LIBS)
-        AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes")
+	if test "x$enable_tests" = "xno"; then
+		do_tests=no
+		AM_CONDITIONAL(ENABLE_TESTS, false)
+	else
+		PKG_CHECK_MODULES(NUNIT, nunit >= $NUNIT_REQUIRED,
+			do_tests="yes", do_tests="no")
 
-        if test "x$do_tests" = "xno"; then
-            AC_MSG_WARN([Could not find nunit: tests will not be available.])
-        fi
+		AC_SUBST(NUNIT_LIBS)
+		AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes")
+
+		if test "x$do_tests" = "xno"; then
+			PKG_CHECK_MODULES(NUNIT, mono-nunit >= 2.4,
+				do_tests="yes", do_tests="no")
+
+			AC_SUBST(NUNIT_LIBS)
+			AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes")
+
+			if test "x$do_tests" = "xno"; then
+				AC_MSG_WARN([Could not find nunit: tests will not be available])			fi
+		fi
 	fi
 ])
diff --git a/build/pkg-config/Makefile.in b/build/pkg-config/Makefile.in
index fc32d96..d6377e2 100644
--- a/build/pkg-config/Makefile.in
+++ b/build/pkg-config/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -76,9 +80,23 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
-pkgconfigDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(pkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -142,6 +160,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -161,6 +181,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -174,29 +196,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -357,14 +360,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  build/pkg-config/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  build/pkg-config/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/pkg-config/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/pkg-config/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -382,6 +385,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -391,20 +395,23 @@ clean-libtool:
 install-pkgconfigDATA: $(pkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
-	@list='$(pkgconfig_DATA)'; for p in $$list; do \
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(pkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
-	  $(pkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-pkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(pkgconfigdir)/$$f"; \
-	done
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -428,13 +435,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -466,6 +477,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -485,6 +497,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -493,18 +507,28 @@ install-data-am: install-pkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -542,6 +566,7 @@ uninstall-am: uninstall-pkgconfigDATA
 
 %.pc: %.pc.in
 	sed "s,\@VERSION\@,$(VERSION),g; s,\@prefix\@,$(prefix),g; s,\@libdir\@,$(libdir),g" < $< > $@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/config.guess b/config.guess
index e6b5d5b..9521fc4 100755
--- a/config.guess
+++ b/config.guess
@@ -4,7 +4,7 @@
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
 #   Free Software Foundation, Inc.
 
-timestamp='2008-01-08'
+timestamp='2009-04-27'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -334,6 +334,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	case `/usr/bin/uname -p` in
 	    sparc) echo sparc-icl-nx7; exit ;;
 	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
     sun4H:SunOS:5.*:*)
 	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
@@ -341,7 +344,20 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
@@ -806,7 +822,7 @@ EOF
 	    x86)
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
-	    EM64T | authenticamd)
+	    EM64T | authenticamd | genuineintel)
 		echo x86_64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	    IA64)
@@ -943,7 +959,10 @@ EOF
         esac
 	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu${LIBC}
+ 	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
@@ -995,9 +1014,6 @@ EOF
 	  a.out-i386-linux)
 		echo "${UNAME_MACHINE}-${VENDOR}-linux-gnuaout"
 		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-${VENDOR}-linux-gnucoff"
-		exit ;;
 	  "")
 		# Either a pre-BFD a.out linker (linux-gnuoldld) or
 		# one that does not give us useful --help.
@@ -1060,16 +1076,16 @@ EOF
 	echo ${UNAME_MACHINE}-pc-os2-emx
 	exit ;;
     i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
+	echo ${UNAME_MACHINE}-${VENDOR}-stop
 	exit ;;
     i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
+	echo ${UNAME_MACHINE}-${VENDOR}-atheos
 	exit ;;
     i*86:syllable:*:*)
 	echo ${UNAME_MACHINE}-pc-syllable
 	exit ;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
+	echo i386-${VENDOR}-lynxos${UNAME_RELEASE}
 	exit ;;
     i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
@@ -1089,7 +1105,7 @@ EOF
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	echo ${UNAME_MACHINE}-${VENDOR}-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
 	exit ;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
@@ -1112,8 +1128,11 @@ EOF
     pc:*:*:*)
 	# Left here for compatibility:
         # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
         exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
@@ -1125,7 +1144,7 @@ EOF
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
 	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	  echo i860-${VENDOR}-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
 	fi
 	exit ;;
     mini*:CTIX:SYS*5:*)
@@ -1151,20 +1170,30 @@ EOF
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
         /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
           && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	echo m68k-${VENDOR}-lynxos${UNAME_RELEASE}
 	exit ;;
     mc68030:UNIX_System_V:4.*:*)
 	echo m68k-atari-sysv4
 	exit ;;
     TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	echo sparc-${VENDOR}-lynxos${UNAME_RELEASE}
 	exit ;;
     rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	echo rs6000-${VENDOR}-lynxos${UNAME_RELEASE}
 	exit ;;
     PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	echo powerpc-${VENDOR}-lynxos${UNAME_RELEASE}
 	exit ;;
     SM[BE]S:UNIX_SV:*:*)
 	echo mips-dde-sysv${UNAME_RELEASE}
@@ -1214,7 +1243,7 @@ EOF
 	if [ -d /usr/nec ]; then
 	        echo mips-nec-sysv${UNAME_RELEASE}
 	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
+	        echo mips-${VENDOR}-sysv${UNAME_RELEASE}
 	fi
         exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
@@ -1226,6 +1255,9 @@ EOF
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
 	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1292,13 +1324,13 @@ EOF
 	else
 	    UNAME_MACHINE="$cputype"
 	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
+	echo ${UNAME_MACHINE}-${VENDOR}-plan9
 	exit ;;
     *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
+	echo pdp10-${VENDOR}-tops10
 	exit ;;
     *:TENEX:*:*)
-	echo pdp10-unknown-tenex
+	echo pdp10-${VENDOR}-tenex
 	exit ;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
 	echo pdp10-dec-tops20
@@ -1307,16 +1339,16 @@ EOF
 	echo pdp10-xkl-tops20
 	exit ;;
     *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
+	echo pdp10-${VENDOR}-tops20
 	exit ;;
     *:ITS:*:*)
-	echo pdp10-unknown-its
+	echo pdp10-${VENDOR}-its
 	exit ;;
     SEI:*:*:SEIUX)
         echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	echo ${UNAME_MACHINE}-${VENDOR}-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
     	UNAME_MACHINE=`(uname -p) 2>/dev/null`
@@ -1334,6 +1366,9 @@ EOF
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
 	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1494,9 +1529,9 @@ This script, last modified $timestamp, has failed to recognize
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff --git a/config.sub b/config.sub
index 6759825..a39437d 100755
--- a/config.sub
+++ b/config.sub
@@ -4,7 +4,7 @@
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
 #   Free Software Foundation, Inc.
 
-timestamp='2008-01-16'
+timestamp='2009-04-17'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -122,6 +122,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
   uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -249,13 +250,16 @@ case $basic_machine in
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep \
+	| maxq | mb | microblaze | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
+	| mips64octeon | mips64octeonel \
 	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
@@ -268,6 +272,7 @@ case $basic_machine in
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
+	| moxie \
 	| mt \
 	| msp430 \
 	| nios | nios2 \
@@ -277,7 +282,7 @@ case $basic_machine in
 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -286,7 +291,7 @@ case $basic_machine in
 	| v850 | v850e \
 	| we32k \
 	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
+	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
 	m6811 | m68hc11 | m6812 | m68hc12)
@@ -329,14 +334,17 @@ case $basic_machine in
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
+	| mips64octeon-* | mips64octeonel-* \
 	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
@@ -358,20 +366,20 @@ case $basic_machine in
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
 	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
 	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
 	| tron-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
-	| z8k-*)
+	| z8k-* | z80-*)
 		;;
 	# Recognize the basic CPU types without company name, with glob match.
 	xtensa*)
@@ -439,6 +447,10 @@ case $basic_machine in
 		basic_machine=m68k-apollo
 		os=-bsd
 		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -459,6 +471,10 @@ case $basic_machine in
 		basic_machine=c90-cray
 		os=-unicos
 		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
 	convex-c1)
 		basic_machine=c1-convex
 		os=-bsd
@@ -526,6 +542,10 @@ case $basic_machine in
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
 	djgpp)
 		basic_machine=i586-pc
 		os=-msdosdjgpp
@@ -1128,6 +1148,10 @@ case $basic_machine in
 		basic_machine=z8k-unknown
 		os=-sim
 		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
 	none)
 		basic_machine=none-none
 		os=-none
@@ -1166,7 +1190,7 @@ case $basic_machine in
 	we32k)
 		basic_machine=we32k-att
 		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
 		basic_machine=sh-unknown
 		;;
 	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
@@ -1238,8 +1262,9 @@ case $os in
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
+	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1248,7 +1273,7 @@ case $os in
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* \
@@ -1388,6 +1413,9 @@ case $os in
 	-zvmoe)
 		os=-zvmoe
 		;;
+	-dicos*)
+		os=-dicos
+		;;
 	-none)
 		;;
 	*)
diff --git a/configure b/configure
index c9ba329..41e613e 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for banshee-1 1.5.1.
+# Generated by GNU Autoconf 2.63 for banshee-1 1.5.2.
 #
 # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=banshee>.
 #
@@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='banshee-1'
 PACKAGE_TARNAME='banshee-1'
-PACKAGE_VERSION='1.5.1'
-PACKAGE_STRING='banshee-1 1.5.1'
+PACKAGE_VERSION='1.5.2'
+PACKAGE_STRING='banshee-1 1.5.2'
 PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=banshee'
 
 # Factoring default headers for most tests.
@@ -785,7 +785,9 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='LTLIBOBJS
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
 LIBOBJS
 Q
 V
@@ -850,6 +852,8 @@ ENABLE_MTP_TRUE
 LIBMTP_SO_MAP
 LIBMTP_LIBS
 LIBMTP_CFLAGS
+ENABLE_ATK_FALSE
+ENABLE_ATK_TRUE
 ENABLE_GNOME_FALSE
 ENABLE_GNOME_TRUE
 GCONF_SCHEMAS_INSTALL_FALSE
@@ -873,14 +877,20 @@ GTKSHARP_LIBS
 GTKSHARP_CFLAGS
 TAGLIB_SHARP_LIBS
 TAGLIB_SHARP_CFLAGS
-ENABLE_TESTS_FALSE
-ENABLE_TESTS_TRUE
 NUNIT_LIBS
 NUNIT_CFLAGS
+ENABLE_TESTS_FALSE
+ENABLE_TESTS_TRUE
 HAVE_MOONLIGHT_FALSE
 HAVE_MOONLIGHT_TRUE
 MOONLIGHT_LIBS
 MOONLIGHT_CFLAGS
+ENABLE_GIO_FALSE
+ENABLE_GIO_TRUE
+GIOSHARP_LIBS
+GIOSHARP_CFLAGS
+GTKSHARP_BEANS_LIBS
+GTKSHARP_BEANS_CFLAGS
 HAVE_WEBKIT_FALSE
 HAVE_WEBKIT_TRUE
 WEBKIT_LIBS
@@ -1115,11 +1125,13 @@ enable_boo
 enable_docs
 enable_webkit
 enable_moonlight
+enable_tests
 enable_osx
 enable_gnome
 with_gconf_source
 with_gconf_schema_file_dir
 enable_schemas_install
+enable_custom_widget_a11y
 enable_mtp
 enable_ipod
 enable_karma
@@ -1177,6 +1189,10 @@ BOO_CFLAGS
 BOO_LIBS
 WEBKIT_CFLAGS
 WEBKIT_LIBS
+GTKSHARP_BEANS_CFLAGS
+GTKSHARP_BEANS_LIBS
+GIOSHARP_CFLAGS
+GIOSHARP_LIBS
 MOONLIGHT_CFLAGS
 MOONLIGHT_LIBS
 NUNIT_CFLAGS
@@ -1757,7 +1773,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures banshee-1 1.5.1 to adapt to many kinds of systems.
+\`configure' configures banshee-1 1.5.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1831,7 +1847,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of banshee-1 1.5.1:";;
+     short | recursive ) echo "Configuration of banshee-1 1.5.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1857,9 +1873,13 @@ Optional Features:
   --enable-webkit         Enable experimental Wikipedia extension -
                           unfinished, likely broken
   --enable-moonlight      Enable Moonlight-enhanced effects [default=auto]
+  --enable-tests          Enable NUnit tests
   --enable-osx            Enable OSX support
   --disable-gnome         Disable GNOME support
-  --disable-schemas-install	Disable the schemas installation
+  --disable-schemas-install
+                          Disable the schemas installation
+  --enable-custom-widget-a11y
+                          Enable custom widget accessibility
   --disable-mtp           Disable MTP DAP support
   --disable-ipod          Disable iPod DAP support
   --enable-karma          Enable Rio Karma DAP support
@@ -1957,6 +1977,14 @@ Some influential environment variables:
   WEBKIT_CFLAGS
               C compiler flags for WEBKIT, overriding pkg-config
   WEBKIT_LIBS linker flags for WEBKIT, overriding pkg-config
+  GTKSHARP_BEANS_CFLAGS
+              C compiler flags for GTKSHARP_BEANS, overriding pkg-config
+  GTKSHARP_BEANS_LIBS
+              linker flags for GTKSHARP_BEANS, overriding pkg-config
+  GIOSHARP_CFLAGS
+              C compiler flags for GIOSHARP, overriding pkg-config
+  GIOSHARP_LIBS
+              linker flags for GIOSHARP, overriding pkg-config
   MOONLIGHT_CFLAGS
               C compiler flags for MOONLIGHT, overriding pkg-config
   MOONLIGHT_LIBS
@@ -2078,7 +2106,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-banshee-1 configure 1.5.1
+banshee-1 configure 1.5.2
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -2092,7 +2120,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by banshee-1 $as_me 1.5.1, which was
+It was created by banshee-1 $as_me 1.5.2, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -2461,7 +2489,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-am__api_version='1.10'
+am__api_version='1.11'
 
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -2592,16 +2620,33 @@ $as_echo_n "checking whether build environment is sane... " >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5
+$as_echo "$as_me: error: unsafe absolute working directory name" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5
+$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+
 # Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
    if test "$*" = "X"; then
       # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
+      set X `ls -t "$srcdir/configure" conftest.file`
    fi
    rm -f conftest.file
    if test "$*" != "X $srcdir/configure conftest.file" \
@@ -2645,7 +2690,14 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
 
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
 # Use eval to expand $SHELL
 if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
@@ -2655,6 +2707,115 @@ else
 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
 { $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
 if test -z "$MKDIR_P"; then
@@ -2809,7 +2970,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='banshee-1'
- VERSION='1.5.1'
+ VERSION='1.5.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2837,108 +2998,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 # Always define AMTAR for backward compatibility.
@@ -3032,6 +3091,7 @@ $as_echo "$am_cv_prog_tar_ustar" >&6; }
 
 
 
+
 { $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
     # Check whether --enable-maintainer-mode was given.
@@ -3081,7 +3141,7 @@ ac_config_commands="$ac_config_commands depfiles"
 am_make=${MAKE-make}
 cat > confinc << 'END'
 am__doit:
-	@echo done
+	@echo this is the am__doit target
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
@@ -3092,24 +3152,24 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
 # Now try BSD make style include.
 if test "$am__include" = "#"; then
    echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
 fi
 
 
@@ -4098,6 +4158,11 @@ else
   if test "$am_compiler_list" = ""; then
      am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
   fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
   for depmode in $am_compiler_list; do
     # Setup a source with many dependencies, because some compilers
     # like to wrap large dependency lists on column 80 (with \), and
@@ -4115,7 +4180,17 @@ else
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
     case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
     nosideeffect)
       # after this tag, mechanisms are not by side-effect, so they'll
       # only be used when explicitly requested
@@ -4125,19 +4200,23 @@ else
 	break
       fi
       ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
     none) break ;;
     esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
     if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       source=sub/conftest.c object=$am__obj \
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
          >/dev/null 2>conftest.err &&
        grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
       # icc doesn't choke on unknown options, it will just issue warnings
       # or remarks (even with -Werror).  So we grep stderr for any message
@@ -4371,6 +4450,82 @@ INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcar
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 # Check the gettext tools to make sure they are GNU
 # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
@@ -4588,14 +4743,21 @@ fi
 
 
 if test -z "$INTLTOOL_PERL"; then
-   { { $as_echo "$as_me:$LINENO: error: perl not found; required for intltool" >&5
-$as_echo "$as_me: error: perl not found; required for intltool" >&2;}
+   { { $as_echo "$as_me:$LINENO: error: perl not found" >&5
+$as_echo "$as_me: error: perl not found" >&2;}
    { (exit 1); exit 1; }; }
 fi
-if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then
-   { { $as_echo "$as_me:$LINENO: error: perl 5.x required for intltool" >&5
-$as_echo "$as_me: error: perl 5.x required for intltool" >&2;}
+{ $as_echo "$as_me:$LINENO: checking for perl >= 5.8.1" >&5
+$as_echo_n "checking for perl >= 5.8.1... " >&6; }
+$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1
+if test $? -ne 0; then
+   { { $as_echo "$as_me:$LINENO: error: perl 5.8.1 is required for intltool" >&5
+$as_echo "$as_me: error: perl 5.8.1 is required for intltool" >&2;}
    { (exit 1); exit 1; }; }
+else
+   IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`"
+   { $as_echo "$as_me:$LINENO: result: $IT_PERL_VERSION" >&5
+$as_echo "$IT_PERL_VERSION" >&6; }
 fi
 if test "x" != "xno-xml"; then
    { $as_echo "$as_me:$LINENO: checking for XML::Parser" >&5
@@ -5469,13 +5631,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:5472: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:5634: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5475: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:5637: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:5478: output\"" >&5)
+  (eval echo "\"\$as_me:5640: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -6680,7 +6842,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 6683 "configure"' > conftest.$ac_ext
+  echo '#line 6845 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -8533,11 +8695,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8536: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8698: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8540: \$? = $ac_status" >&5
+   echo "$as_me:8702: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8872,11 +9034,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8875: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:9037: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8879: \$? = $ac_status" >&5
+   echo "$as_me:9041: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8977,11 +9139,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8980: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:9142: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8984: \$? = $ac_status" >&5
+   echo "$as_me:9146: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -9032,11 +9194,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:9035: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:9197: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:9039: \$? = $ac_status" >&5
+   echo "$as_me:9201: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -11832,7 +11994,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11835 "configure"
+#line 11997 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11928,7 +12090,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11931 "configure"
+#line 12093 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12256,7 +12418,7 @@ API_VERSION=1.5
 
 ASM_VERSION=1.5.0.0
 
-DISPLAY_VERSION="1.6 Beta 2"
+DISPLAY_VERSION="1.6 Beta 3"
 
 
 
@@ -13105,6 +13267,11 @@ else
   if test "$am_compiler_list" = ""; then
      am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
   fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
   for depmode in $am_compiler_list; do
     # Setup a source with many dependencies, because some compilers
     # like to wrap large dependency lists on column 80 (with \), and
@@ -13122,7 +13289,17 @@ else
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
     case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
     nosideeffect)
       # after this tag, mechanisms are not by side-effect, so they'll
       # only be used when explicitly requested
@@ -13132,19 +13309,23 @@ else
 	break
       fi
       ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
     none) break ;;
     esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
     if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       source=sub/conftest.c object=$am__obj \
        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
          >/dev/null 2>conftest.err &&
        grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
       # icc doesn't choke on unknown options, it will just issue warnings
       # or remarks (even with -Werror).  So we grep stderr for any message
@@ -13573,8 +13754,9 @@ main ()
 {
   int major, minor, micro;
   char *tmp_version;
+  int ignored;
 
-  system ("touch conf.glibtest");
+  ignored = system ("touch conf.glibtest");
 
   /* HP/UX 9 (%@#!) writes to sscanf strings */
   tmp_version = g_strdup("$min_glib_version");
@@ -16280,6 +16462,157 @@ fi
 
 
 
+	GNOMESHARP_REQUIRED=2.8
+
+    enable_gio=no
+
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for GTKSHARP_BEANS" >&5
+$as_echo_n "checking for GTKSHARP_BEANS... " >&6; }
+
+if test -n "$GTKSHARP_BEANS_CFLAGS"; then
+    pkg_cv_GTKSHARP_BEANS_CFLAGS="$GTKSHARP_BEANS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-beans-2.0 >= \$GNOMESHARP_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTKSHARP_BEANS_CFLAGS=`$PKG_CONFIG --cflags "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTKSHARP_BEANS_LIBS"; then
+    pkg_cv_GTKSHARP_BEANS_LIBS="$GTKSHARP_BEANS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-beans-2.0 >= \$GNOMESHARP_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTKSHARP_BEANS_LIBS=`$PKG_CONFIG --libs "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTKSHARP_BEANS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED" 2>&1`
+        else
+	        GTKSHARP_BEANS_PKG_ERRORS=`$PKG_CONFIG --print-errors "gtk-sharp-beans-2.0 >= $GNOMESHARP_REQUIRED" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTKSHARP_BEANS_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                enable_gio=no
+elif test $pkg_failed = untried; then
+	enable_gio=no
+else
+	GTKSHARP_BEANS_CFLAGS=$pkg_cv_GTKSHARP_BEANS_CFLAGS
+	GTKSHARP_BEANS_LIBS=$pkg_cv_GTKSHARP_BEANS_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	enable_gio=yes
+fi
+
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for GIOSHARP" >&5
+$as_echo_n "checking for GIOSHARP... " >&6; }
+
+if test -n "$GIOSHARP_CFLAGS"; then
+    pkg_cv_GIOSHARP_CFLAGS="$GIOSHARP_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gio-sharp-2.0 >= \$GNOMESHARP_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GIOSHARP_CFLAGS=`$PKG_CONFIG --cflags "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GIOSHARP_LIBS"; then
+    pkg_cv_GIOSHARP_LIBS="$GIOSHARP_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gio-sharp-2.0 >= \$GNOMESHARP_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GIOSHARP_LIBS=`$PKG_CONFIG --libs "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GIOSHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED" 2>&1`
+        else
+	        GIOSHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors "gio-sharp-2.0 >= $GNOMESHARP_REQUIRED" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GIOSHARP_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                enable_gio=no
+elif test $pkg_failed = untried; then
+	enable_gio=no
+else
+	GIOSHARP_CFLAGS=$pkg_cv_GIOSHARP_CFLAGS
+	GIOSHARP_LIBS=$pkg_cv_GIOSHARP_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	enable_gio="$enable_gio"
+fi
+
+	 if test "x$enable_gio" = "xyes"; then
+  ENABLE_GIO_TRUE=
+  ENABLE_GIO_FALSE='#'
+else
+  ENABLE_GIO_TRUE='#'
+  ENABLE_GIO_FALSE=
+fi
+
+
+
+
 	# Check whether --enable-moonlight was given.
 if test "${enable_moonlight+set}" = set; then
   enableval=$enable_moonlight;
@@ -16436,6 +16769,25 @@ fi
 
 	NUNIT_REQUIRED=2.4.7
 
+	# Check whether --enable-tests was given.
+if test "${enable_tests+set}" = set; then
+  enableval=$enable_tests; enable_tests=$enableval
+else
+  enable_tests="no"
+fi
+
+
+	if test "x$enable_tests" = "xno"; then
+		do_tests=no
+		 if false; then
+  ENABLE_TESTS_TRUE=
+  ENABLE_TESTS_FALSE='#'
+else
+  ENABLE_TESTS_TRUE='#'
+  ENABLE_TESTS_FALSE=
+fi
+
+	else
 
 pkg_failed=no
 { $as_echo "$as_me:$LINENO: checking for NUNIT" >&5
@@ -16505,7 +16857,7 @@ $as_echo "yes" >&6; }
 fi
 
 
-	 if test "x$do_tests" = "xyes"; then
+		 if test "x$do_tests" = "xyes"; then
   ENABLE_TESTS_TRUE=
   ENABLE_TESTS_FALSE='#'
 else
@@ -16514,7 +16866,7 @@ else
 fi
 
 
-	if test "x$do_tests" = "xno"; then
+		if test "x$do_tests" = "xno"; then
 
 pkg_failed=no
 { $as_echo "$as_me:$LINENO: checking for NUNIT" >&5
@@ -16584,7 +16936,7 @@ $as_echo "yes" >&6; }
 fi
 
 
-         if test "x$do_tests" = "xyes"; then
+			 if test "x$do_tests" = "xyes"; then
   ENABLE_TESTS_TRUE=
   ENABLE_TESTS_FALSE='#'
 else
@@ -16593,10 +16945,10 @@ else
 fi
 
 
-        if test "x$do_tests" = "xno"; then
-            { $as_echo "$as_me:$LINENO: WARNING: Could not find nunit: tests will not be available." >&5
-$as_echo "$as_me: WARNING: Could not find nunit: tests will not be available." >&2;}
-        fi
+			if test "x$do_tests" = "xno"; then
+				{ $as_echo "$as_me:$LINENO: WARNING: Could not find nunit: tests will not be available" >&5
+$as_echo "$as_me: WARNING: Could not find nunit: tests will not be available" >&2;}			fi
+		fi
 	fi
 
 
@@ -17512,6 +17864,22 @@ fi
 
 fi
 
+# Check whether --enable-custom-widget-a11y was given.
+if test "${enable_custom_widget_a11y+set}" = set; then
+  enableval=$enable_custom_widget_a11y; enable_atk="yes"
+else
+  enable_atk="no"
+fi
+
+ if test "x$enable_atk" = "xyes"; then
+  ENABLE_ATK_TRUE=
+  ENABLE_ATK_FALSE='#'
+else
+  ENABLE_ATK_TRUE='#'
+  ENABLE_ATK_FALSE=
+fi
+
+
 
 	LIBMTP_REQUIRED=0.2.0
 
@@ -17733,7 +18101,7 @@ fi
 
 
 
-	IPODSHARP_REQUIRED=0.8.1
+	IPODSHARP_REQUIRED=0.8.5
 
 	# Check whether --enable-ipod was given.
 if test "${enable_ipod+set}" = set; then
@@ -17830,7 +18198,8 @@ $as_echo "$as_me: error: ipod-sharp was not found or is not up to date. Please i
 	if test "x$enable_ipodsharp" = "xyes"; then
 		asms="`$PKG_CONFIG --variable=Libraries ipod-sharp` `$PKG_CONFIG --variable=Libraries ipod-sharp-ui`"
 		for asm in $asms; do
-			IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm $asm.mdb"
+			IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm"
+			 -r "$asm.mdb"  && IPODSHARP_ASSEMBLIES="$IPODSHARP_ASSEMBLIES $asm.mdb"
 		done
 
 
@@ -20153,7 +20522,7 @@ fi
 
 
 
-ac_config_files="$ac_config_files Makefile build/Makefile build/m4/Makefile build/m4/shave/shave build/m4/shave/shave-libtool build/pkg-config/Makefile data/Makefile data/org.bansheeproject.Banshee.service data/org.bansheeproject.CollectionIndexer.service data/audio-profiles/Makefile data/desktop-files/Makefile data/icon-theme-hicolor/Makefile docs/Makefile docs/Hyena/Makefile docs/Banshee/Makefile po/Makefile.in tests/Makefile tests/Analyzer/Makefile tests/Performance/Makefile extras/Makefile libbanshee/Makefile gstreamer/Makefile gstreamer/equalizer/Makefile src/Makefile src/AssemblyInfo.cs src/Clients/Makefile src/Clients/Beroe/Makefile src/Clients/Booter/Makefile src/Clients/Booter/banshee-1 src/Clients/Halie/Makefile src/Clients/Muinshee/Makefile src/Clients/Nereid/Makefile src/Core/Makefile src/Core/Banshee.CollectionIndexer/Makefile src/Core/Banshee.Core/Makefile src/Core/Banshee.Services/Makefile src/Core/Banshee.ThickClient/Makefile src/Core/Banshee.Widgets/Makefile src/Backends/Makefile src/Backends/Banshee.Gnome/Makefile src/Backends/Banshee.GStreamer/Makefile src/Backends/Banshee.Hal/Makefile src/Backends/Banshee.Unix/Makefile src/Backends/Banshee.Osx/Makefile src/Backends/Banshee.NowPlaying.X11/Makefile src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile src/Libraries/Makefile src/Libraries/Hyena/Makefile src/Libraries/Hyena.Gui/Makefile src/Libraries/Lastfm/Makefile src/Libraries/Lastfm.Gui/Makefile src/Libraries/Migo/Makefile src/Libraries/Mono.Data.Sqlite/Makefile src/Libraries/Mono.Media/Makefile src/Libraries/Mtp/Makefile src/Libraries/Mtp/Mtp.dll.config src/Libraries/MusicBrainz/Makefile src/Dap/Makefile src/Dap/Banshee.Dap/Makefile src/Dap/Banshee.Dap.Ipod/Makefile src/Dap/Banshee.Dap.MassStorage/Makefile src/Dap/Banshee.Dap.Mtp/Makefile src/Dap/Banshee.Dap.Karma/Makefile src/Extensions/Makefile src/Extensions/Banshee.AudioCd/Makefile src/Extensions/Banshee.Bookmarks/Makefile src/Extensions/Banshee.BooScript/Makefile src/Extensions/Banshee.Bpm/Makefile src/Extensions/Banshee.CoverArt/Makefile src/Extensions/Banshee.Daap/Makefile src/Extensions/Banshee.FileSystemQueue/Makefile src/Extensions/Banshee.InternetRadio/Makefile src/Extensions/Banshee.Lastfm/Makefile src/Extensions/Banshee.MiniMode/Makefile src/Extensions/Banshee.Moblin/Makefile src/Extensions/Banshee.MultimediaKeys/Makefile src/Extensions/Banshee.NotificationArea/Makefile src/Extensions/Banshee.NowPlaying/Makefile src/Extensions/Banshee.PlayQueue/Makefile src/Extensions/Banshee.PlayerMigration/Makefile src/Extensions/Banshee.Podcasting/Makefile src/Extensions/Banshee.SqlDebugConsole/Makefile src/Extensions/Banshee.Sample/Makefile src/Extensions/Banshee.Torrent/Makefile src/Extensions/Banshee.RemoteAudio/Makefile src/Extensions/Banshee.Wikipedia/Makefile"
+ac_config_files="$ac_config_files Makefile build/Makefile build/m4/Makefile build/m4/shave/shave build/m4/shave/shave-libtool build/pkg-config/Makefile data/Makefile data/org.bansheeproject.Banshee.service data/org.bansheeproject.CollectionIndexer.service data/audio-profiles/Makefile data/desktop-files/Makefile data/icon-theme-hicolor/Makefile docs/Makefile docs/Hyena/Makefile docs/Banshee/Makefile po/Makefile.in tests/Makefile tests/Analyzer/Makefile tests/Performance/Makefile extras/Makefile libbanshee/Makefile gstreamer/Makefile gstreamer/equalizer/Makefile src/Makefile src/AssemblyInfo.cs src/Clients/Makefile src/Clients/Beroe/Makefile src/Clients/Booter/Makefile src/Clients/Booter/banshee-1 src/Clients/Halie/Makefile src/Clients/Muinshee/Makefile src/Clients/Nereid/Makefile src/Core/Makefile src/Core/Banshee.CollectionIndexer/Makefile src/Core/Banshee.Core/Makefile src/Core/Banshee.Services/Makefile src/Core/Banshee.ThickClient/Makefile src/Core/Banshee.Widgets/Makefile src/Backends/Makefile src/Backends/Banshee.Gio/Makefile src/Backends/Banshee.Gnome/Makefile src/Backends/Banshee.GStreamer/Makefile src/Backends/Banshee.Hal/Makefile src/Backends/Banshee.Unix/Makefile src/Backends/Banshee.Osx/Makefile src/Backends/Banshee.NowPlaying.X11/Makefile src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile src/Libraries/Makefile src/Libraries/Hyena/Makefile src/Libraries/Hyena.Gui/Makefile src/Libraries/Lastfm/Makefile src/Libraries/Lastfm.Gui/Makefile src/Libraries/Migo/Makefile src/Libraries/Mono.Data.Sqlite/Makefile src/Libraries/Mono.Media/Makefile src/Libraries/Mtp/Makefile src/Libraries/Mtp/Mtp.dll.config src/Libraries/MusicBrainz/Makefile src/Dap/Makefile src/Dap/Banshee.Dap/Makefile src/Dap/Banshee.Dap.Ipod/Makefile src/Dap/Banshee.Dap.MassStorage/Makefile src/Dap/Banshee.Dap.Mtp/Makefile src/Dap/Banshee.Dap.Karma/Makefile src/Extensions/Makefile src/Extensions/Banshee.AudioCd/Makefile src/Extensions/Banshee.Bookmarks/Makefile src/Extensions/Banshee.BooScript/Makefile src/Extensions/Banshee.Bpm/Makefile src/Extensions/Banshee.CoverArt/Makefile src/Extensions/Banshee.Daap/Makefile src/Extensions/Banshee.FileSystemQueue/Makefile src/Extensions/Banshee.InternetArchive/Makefile src/Extensions/Banshee.InternetRadio/Makefile src/Extensions/Banshee.Lastfm/Makefile src/Extensions/Banshee.MiniMode/Makefile src/Extensions/Banshee.Moblin/Makefile src/Extensions/Banshee.MultimediaKeys/Makefile src/Extensions/Banshee.NotificationArea/Makefile src/Extensions/Banshee.NowPlaying/Makefile src/Extensions/Banshee.PlayQueue/Makefile src/Extensions/Banshee.PlayerMigration/Makefile src/Extensions/Banshee.Podcasting/Makefile src/Extensions/Banshee.SqlDebugConsole/Makefile src/Extensions/Banshee.Sample/Makefile src/Extensions/Banshee.Torrent/Makefile src/Extensions/Banshee.RemoteAudio/Makefile src/Extensions/Banshee.Wikipedia/Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -20252,6 +20621,14 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
 if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
   { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -20375,6 +20752,13 @@ $as_echo "$as_me: error: conditional \"HAVE_WEBKIT\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${ENABLE_GIO_TRUE}" && test -z "${ENABLE_GIO_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_GIO\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"ENABLE_GIO\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${HAVE_MOONLIGHT_TRUE}" && test -z "${HAVE_MOONLIGHT_FALSE}"; then
   { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_MOONLIGHT\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -20403,6 +20787,13 @@ $as_echo "$as_me: error: conditional \"ENABLE_TESTS\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"ENABLE_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${ENABLE_OSX_TRUE}" && test -z "${ENABLE_OSX_FALSE}"; then
   { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_OSX\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -20438,6 +20829,13 @@ $as_echo "$as_me: error: conditional \"ENABLE_GNOME\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${ENABLE_ATK_TRUE}" && test -z "${ENABLE_ATK_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_ATK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"ENABLE_ATK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${ENABLE_MTP_TRUE}" && test -z "${ENABLE_MTP_FALSE}"; then
   { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_MTP\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -20865,7 +21263,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by banshee-1 $as_me 1.5.1, which was
+This file was extended by banshee-1 $as_me 1.5.2, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20928,7 +21326,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-banshee-1 config.status 1.5.1
+banshee-1 config.status 1.5.2
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -21350,6 +21748,7 @@ do
     "src/Core/Banshee.ThickClient/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/Banshee.ThickClient/Makefile" ;;
     "src/Core/Banshee.Widgets/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/Banshee.Widgets/Makefile" ;;
     "src/Backends/Makefile") CONFIG_FILES="$CONFIG_FILES src/Backends/Makefile" ;;
+    "src/Backends/Banshee.Gio/Makefile") CONFIG_FILES="$CONFIG_FILES src/Backends/Banshee.Gio/Makefile" ;;
     "src/Backends/Banshee.Gnome/Makefile") CONFIG_FILES="$CONFIG_FILES src/Backends/Banshee.Gnome/Makefile" ;;
     "src/Backends/Banshee.GStreamer/Makefile") CONFIG_FILES="$CONFIG_FILES src/Backends/Banshee.GStreamer/Makefile" ;;
     "src/Backends/Banshee.Hal/Makefile") CONFIG_FILES="$CONFIG_FILES src/Backends/Banshee.Hal/Makefile" ;;
@@ -21382,6 +21781,7 @@ do
     "src/Extensions/Banshee.CoverArt/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.CoverArt/Makefile" ;;
     "src/Extensions/Banshee.Daap/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.Daap/Makefile" ;;
     "src/Extensions/Banshee.FileSystemQueue/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.FileSystemQueue/Makefile" ;;
+    "src/Extensions/Banshee.InternetArchive/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.InternetArchive/Makefile" ;;
     "src/Extensions/Banshee.InternetRadio/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.InternetRadio/Makefile" ;;
     "src/Extensions/Banshee.Lastfm/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.Lastfm/Makefile" ;;
     "src/Extensions/Banshee.MiniMode/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Banshee.MiniMode/Makefile" ;;
@@ -22052,18 +22452,28 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
 
 
   case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-    dirpart=`$as_dirname -- "$mf" ||
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
 $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$mf" : 'X\(//\)[^/]' \| \
 	 X"$mf" : 'X\(//\)$' \| \
@@ -22086,28 +22496,28 @@ $as_echo X"$mf" |
 	    q
 	  }
 	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`$as_dirname -- "$file" ||
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
 $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$file" : 'X\(//\)[^/]' \| \
 	 X"$file" : 'X\(//\)$' \| \
@@ -22130,7 +22540,7 @@ $as_echo X"$file" |
 	    q
 	  }
 	  s/.*/./; q'`
-    { as_dir=$dirpart/$fdir
+      { as_dir=$dirpart/$fdir
   case $as_dir in #(
   -*) as_dir=./$as_dir;;
   esac
@@ -22171,10 +22581,11 @@ $as_echo X"$as_dir" |
   } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
   done
-done
+}
  ;;
     "libtool":C)
 
@@ -22815,7 +23226,7 @@ _LT_EOF
         sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
       esac ;;
     "po/stamp-it":C)
-    if  ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" ; then
+    if  ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then
        { { $as_echo "$as_me:$LINENO: error: po/Makefile.in.in was not created by intltoolize." >&5
 $as_echo "$as_me: error: po/Makefile.in.in was not created by intltoolize." >&2;}
    { (exit 1); exit 1; }; }
@@ -22899,6 +23310,7 @@ ${PACKAGE}-${VERSION}
   Operating System/Desktop Environment:
     GNOME Support:     ${enable_gnome}
     Builtin Equalizer: ${enable_builtin_equalizer}
+    GIO Support:       ${enable_gio} (requires gtk-sharp-beans and gio-sharp)
     OSX Support:       ${enable_osx}
 
   Digital Audio Player (DAP) Support:
@@ -22915,6 +23327,7 @@ ${PACKAGE}-${VERSION}
 
   Build/Development:
     Unit Tests:        ${do_tests} (requires nunit >= ${NUNIT_REQUIRED})
+    Custom a11y:       ${enable_atk} (requires gtk-sharp 2.12 from svn)
     Release Build:     ${enable_release}
     Vendor Build ID:   ${vendor_build_id}
 
diff --git a/configure.ac b/configure.ac
index 7c291a2..68ed40c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ dnl Granularly define the version components
 dnl Remember to also update the Display Version
 m4_define([banshee_version_major], [1])
 m4_define([banshee_version_minor], [5])
-m4_define([banshee_version_micro], [1])
+m4_define([banshee_version_micro], [2])
 
 dnl set to 0 when doing an official release
 m4_define([banshee_version_pre_release], [0])
@@ -23,7 +23,7 @@ m4_define([banshee_version],
 
 dnl this can sometimes differ manually
 m4_define([banshee_display_version],
-	["1.6 Beta 2"])
+	["1.6 Beta 3"])
 
 m4_define([banshee_api_version],
 	[banshee_version_major.banshee_version_minor])
@@ -95,6 +95,9 @@ SHAMROCK_CHECK_MONODOC
 dnl webkit (optional through --enable-webkit)
 BANSHEE_CHECK_WEBKIT
 
+dnl gtk#-beans and gio#
+BANSHEE_CHECK_GIO_SHARP
+
 dnl Moonlight (optional through --enable-moonlight)
 BANSHEE_CHECK_MOONLIGHT
 
@@ -127,6 +130,11 @@ else
 	AM_CONDITIONAL(ENABLE_GNOME, false)
 fi
 
+AC_ARG_ENABLE(custom-widget-a11y, 
+	AC_HELP_STRING([--enable-custom-widget-a11y], [Enable custom widget accessibility]), 
+	enable_atk="yes", enable_atk="no")
+AM_CONDITIONAL(ENABLE_ATK, test "x$enable_atk" = "xyes")
+
 dnl DAP support (each module is optional)
 BANSHEE_CHECK_DAP_MTP
 BANSHEE_CHECK_DAP_IPOD
@@ -240,6 +248,7 @@ src/Core/Banshee.ThickClient/Makefile
 src/Core/Banshee.Widgets/Makefile
 
 src/Backends/Makefile
+src/Backends/Banshee.Gio/Makefile
 src/Backends/Banshee.Gnome/Makefile
 src/Backends/Banshee.GStreamer/Makefile
 src/Backends/Banshee.Hal/Makefile
@@ -275,6 +284,7 @@ src/Extensions/Banshee.Bpm/Makefile
 src/Extensions/Banshee.CoverArt/Makefile
 src/Extensions/Banshee.Daap/Makefile
 src/Extensions/Banshee.FileSystemQueue/Makefile
+src/Extensions/Banshee.InternetArchive/Makefile
 src/Extensions/Banshee.InternetRadio/Makefile
 src/Extensions/Banshee.Lastfm/Makefile
 src/Extensions/Banshee.MiniMode/Makefile
@@ -313,6 +323,7 @@ ${PACKAGE}-${VERSION}
   Operating System/Desktop Environment:
     GNOME Support:     ${enable_gnome}
     Builtin Equalizer: ${enable_builtin_equalizer}
+    GIO Support:       ${enable_gio} (requires gtk-sharp-beans and gio-sharp)
     OSX Support:       ${enable_osx}
 
   Digital Audio Player (DAP) Support:
@@ -329,6 +340,7 @@ ${PACKAGE}-${VERSION}
 
   Build/Development:
     Unit Tests:        ${do_tests} (requires nunit >= ${NUNIT_REQUIRED})
+    Custom a11y:       ${enable_atk} (requires gtk-sharp 2.12 from svn)
     Release Build:     ${enable_release}
     Vendor Build ID:   ${vendor_build_id}
 
diff --git a/data/Makefile.in b/data/Makefile.in
index 2c48feb..8250d94 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -52,6 +54,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -72,6 +75,7 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = org.bansheeproject.Banshee.service \
 	org.bansheeproject.CollectionIndexer.service
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -86,16 +90,58 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(dbusservicedir)"
-dbusserviceDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(dbusservice_DATA)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -157,6 +203,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -176,6 +224,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -189,29 +239,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -386,14 +417,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  data/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  data/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -411,6 +442,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 org.bansheeproject.Banshee.service: $(top_builddir)/config.status $(srcdir)/org.bansheeproject.Banshee.service.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 org.bansheeproject.CollectionIndexer.service: $(top_builddir)/config.status $(srcdir)/org.bansheeproject.CollectionIndexer.service.in
@@ -424,20 +456,23 @@ clean-libtool:
 install-dbusserviceDATA: $(dbusservice_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(dbusservicedir)" || $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)"
-	@list='$(dbusservice_DATA)'; for p in $$list; do \
+	@list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dbusserviceDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(dbusservicedir)/$$f'"; \
-	  $(dbusserviceDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(dbusservicedir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbusservicedir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(dbusservicedir)" || exit $$?; \
 	done
 
 uninstall-dbusserviceDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(dbusservice_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(dbusservicedir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(dbusservicedir)/$$f"; \
-	done
+	@list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(dbusservicedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(dbusservicedir)" && rm -f $$files
 
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
@@ -463,7 +498,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -497,16 +532,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -514,14 +549,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -533,7 +568,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -542,29 +577,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -585,29 +625,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -640,6 +695,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -660,6 +716,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -668,18 +726,28 @@ install-data-am: install-dbusserviceDATA
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -700,8 +768,8 @@ ps-am:
 
 uninstall-am: uninstall-dbusserviceDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -718,6 +786,7 @@ uninstall-am: uninstall-dbusserviceDATA
 	ps ps-am tags tags-recursive uninstall uninstall-am \
 	uninstall-dbusserviceDATA
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/data/audio-profiles/Makefile.in b/data/audio-profiles/Makefile.in
index 3df3173..5500b97 100644
--- a/data/audio-profiles/Makefile.in
+++ b/data/audio-profiles/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -76,9 +80,23 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(audioprofilesdir)"
-audioprofilesDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(audioprofiles_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -142,6 +160,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -161,6 +181,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -174,29 +196,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -366,14 +369,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  data/audio-profiles/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  data/audio-profiles/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/audio-profiles/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/audio-profiles/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -391,6 +394,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -400,20 +404,23 @@ clean-libtool:
 install-audioprofilesDATA: $(audioprofiles_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(audioprofilesdir)" || $(MKDIR_P) "$(DESTDIR)$(audioprofilesdir)"
-	@list='$(audioprofiles_DATA)'; for p in $$list; do \
+	@list='$(audioprofiles_DATA)'; test -n "$(audioprofilesdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(audioprofilesDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(audioprofilesdir)/$$f'"; \
-	  $(audioprofilesDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(audioprofilesdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(audioprofilesdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(audioprofilesdir)" || exit $$?; \
 	done
 
 uninstall-audioprofilesDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(audioprofiles_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(audioprofilesdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(audioprofilesdir)/$$f"; \
-	done
+	@list='$(audioprofiles_DATA)'; test -n "$(audioprofilesdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(audioprofilesdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(audioprofilesdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -437,13 +444,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -474,6 +485,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -494,6 +506,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -502,18 +516,28 @@ install-data-am: install-audioprofilesDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -553,6 +577,7 @@ uninstall-am: uninstall-audioprofilesDATA
 
 all: $(audioprofiles_DATA)
 	mkdir -p $(top_builddir)/bin/share/$(PACKAGE)/audio-profiles && cp $(audioprofiles_DATA) $(top_builddir)/bin/share/$(PACKAGE)/audio-profiles
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/data/desktop-files/Makefile.in b/data/desktop-files/Makefile.in
index 045499f..2afe26d 100644
--- a/data/desktop-files/Makefile.in
+++ b/data/desktop-files/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -76,9 +80,23 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(desktopdir)"
-desktopDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(desktop_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -142,6 +160,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -161,6 +181,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -174,29 +196,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -369,14 +372,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  data/desktop-files/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  data/desktop-files/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/desktop-files/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/desktop-files/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -394,6 +397,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -403,20 +407,23 @@ clean-libtool:
 install-desktopDATA: $(desktop_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)"
-	@list='$(desktop_DATA)'; for p in $$list; do \
+	@list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(desktopDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(desktopdir)/$$f'"; \
-	  $(desktopDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(desktopdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \
 	done
 
 uninstall-desktopDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(desktop_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(desktopdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(desktopdir)/$$f"; \
-	done
+	@list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(desktopdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(desktopdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -440,13 +447,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -478,6 +489,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -497,6 +509,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -505,18 +519,28 @@ install-data-am: install-desktopDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -556,6 +580,7 @@ uninstall-am: uninstall-desktopDATA
 	./update-desktop-file.sh "$<" "$(VERSION)" "$(UPDATE_MIME_FILES)" > "$@"
 
 @INTLTOOL_DESKTOP_RULE@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/data/desktop-files/banshee-1.desktop.mime b/data/desktop-files/banshee-1.desktop.mime
index dc72d75..f39d020 100644
--- a/data/desktop-files/banshee-1.desktop.mime
+++ b/data/desktop-files/banshee-1.desktop.mime
@@ -27,6 +27,7 @@ application/x-extension-mp4
 application/x-flac
 application/x-flash-video
 application/x-id3
+application/x-linguist
 application/x-matroska
 application/x-miro
 application/x-musepack
diff --git a/data/icon-theme-hicolor/Makefile.in b/data/icon-theme-hicolor/Makefile.in
index 0995ec5..928382a 100644
--- a/data/icon-theme-hicolor/Makefile.in
+++ b/data/icon-theme-hicolor/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -132,6 +136,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -151,6 +157,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -164,29 +172,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -361,14 +350,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  data/icon-theme-hicolor/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  data/icon-theme-hicolor/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/icon-theme-hicolor/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/icon-theme-hicolor/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -386,6 +375,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -415,13 +405,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -449,6 +443,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -468,6 +463,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -476,18 +473,28 @@ install-data-am: install-data-local
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -509,7 +516,6 @@ ps-am:
 uninstall-am:
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-
 .MAKE: install-am install-strip uninstall-am
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
@@ -540,6 +546,7 @@ install-data-local:
 
 uninstall-hook: 
 	@-$(install_icon_exec) -u $(theme_icons)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/depcomp b/depcomp
index e5f9736..df8eea7 100755
--- a/depcomp
+++ b/depcomp
@@ -1,10 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2007-03-29.01
+scriptversion=2009-04-28.21; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
-# Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,9 +17,7 @@ scriptversion=2007-03-29.01
 # 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
-# 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -87,6 +85,15 @@ if test "$depmode" = dashXmstdout; then
    depmode=dashmstdout
 fi
 
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
 case "$depmode" in
 gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
@@ -192,14 +199,14 @@ sgi)
 ' < "$tmpdepfile" \
     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
     tr '
-' ' ' >> $depfile
-    echo >> $depfile
+' ' ' >> "$depfile"
+    echo >> "$depfile"
 
     # The second pass generates a dummy entry for each header file.
     tr ' ' '
 ' < "$tmpdepfile" \
    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
+   >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -328,7 +335,12 @@ hp2)
   if test -f "$tmpdepfile"; then
     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
     # Add `dependent.h:' lines.
-    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
   else
     echo "#dummy" > "$depfile"
   fi
@@ -404,7 +416,7 @@ dashmstdout)
 
   # Remove the call to Libtool.
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
@@ -455,32 +467,39 @@ makedepend)
   "$@" || exit $?
   # Remove any Libtool call
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
   fi
   # X makedepend
   shift
-  cleared=no
-  for arg in "$@"; do
+  cleared=no eat=no
+  for arg
+  do
     case $cleared in
     no)
       set ""; shift
       cleared=yes ;;
     esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
     case "$arg" in
     -D*|-I*)
       set fnord "$@" "$arg"; shift ;;
     # Strip any option that makedepend may not understand.  Remove
     # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
     -*|$object)
       ;;
     *)
       set fnord "$@" "$arg"; shift ;;
     esac
   done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
   touch "$tmpdepfile"
   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
   rm -f "$depfile"
@@ -500,7 +519,7 @@ cpp)
 
   # Remove the call to Libtool.
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
@@ -538,13 +557,27 @@ cpp)
 
 msvisualcpp)
   # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
+  # always write the preprocessed file to stdout.
   "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
   IFS=" "
   for arg
   do
     case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
 	set fnord "$@"
 	shift
@@ -557,16 +590,23 @@ msvisualcpp)
 	;;
     esac
   done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
   echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 none)
   exec "$@"
   ;;
@@ -585,5 +625,6 @@ exit 0
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/docs/Banshee/Makefile.in b/docs/Banshee/Makefile.in
index 97c612b..665b7ac 100644
--- a/docs/Banshee/Makefile.in
+++ b/docs/Banshee/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -51,6 +53,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -70,6 +73,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -77,9 +81,23 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(monodocdir)"
-monodocDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(monodoc_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -143,6 +161,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -162,6 +182,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -175,29 +197,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -380,14 +383,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  docs/Banshee/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  docs/Banshee/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Banshee/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign docs/Banshee/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -405,6 +408,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -414,20 +418,23 @@ clean-libtool:
 install-monodocDATA: $(monodoc_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(monodocdir)" || $(MKDIR_P) "$(DESTDIR)$(monodocdir)"
-	@list='$(monodoc_DATA)'; for p in $$list; do \
+	@list='$(monodoc_DATA)'; test -n "$(monodocdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(monodocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodocdir)/$$f'"; \
-	  $(monodocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodocdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(monodocdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(monodocdir)" || exit $$?; \
 	done
 
 uninstall-monodocDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(monodoc_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(monodocdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(monodocdir)/$$f"; \
-	done
+	@list='$(monodoc_DATA)'; test -n "$(monodocdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(monodocdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(monodocdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -451,13 +458,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -488,6 +499,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -508,6 +520,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -516,18 +530,28 @@ install-data-am: install-monodocDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -583,6 +607,7 @@ uninstall-am: uninstall-monodocDATA
 
 merge:
 	monodoc --merge-changes $$HOME/.config/monodoc/changeset.xml .
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/docs/Hyena/Makefile.in b/docs/Hyena/Makefile.in
index 1b2b292..4834a33 100644
--- a/docs/Hyena/Makefile.in
+++ b/docs/Hyena/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -51,6 +53,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -70,6 +73,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -77,9 +81,23 @@ am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(monodocdir)"
-monodocDATA_INSTALL = $(INSTALL_DATA)
 DATA = $(monodoc_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -143,6 +161,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -162,6 +182,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -175,29 +197,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -378,14 +381,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  docs/Hyena/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  docs/Hyena/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Hyena/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign docs/Hyena/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -403,6 +406,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -412,20 +416,23 @@ clean-libtool:
 install-monodocDATA: $(monodoc_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(monodocdir)" || $(MKDIR_P) "$(DESTDIR)$(monodocdir)"
-	@list='$(monodoc_DATA)'; for p in $$list; do \
+	@list='$(monodoc_DATA)'; test -n "$(monodocdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(monodocDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(monodocdir)/$$f'"; \
-	  $(monodocDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(monodocdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(monodocdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(monodocdir)" || exit $$?; \
 	done
 
 uninstall-monodocDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(monodoc_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(monodocdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(monodocdir)/$$f"; \
-	done
+	@list='$(monodoc_DATA)'; test -n "$(monodocdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(monodocdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(monodocdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -449,13 +456,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -486,6 +497,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -506,6 +518,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -514,18 +528,28 @@ install-data-am: install-monodocDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -581,6 +605,7 @@ uninstall-am: uninstall-monodocDATA
 
 merge:
 	monodoc --merge-changes $$HOME/.config/monodoc/changeset.xml .
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 0c3a07d..09f38f1 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -359,14 +376,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  docs/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  docs/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign docs/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -384,6 +401,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -415,7 +433,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -449,16 +467,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -466,14 +484,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -485,7 +503,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -494,29 +512,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -537,29 +560,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -589,6 +627,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -608,6 +647,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -616,18 +657,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -648,8 +699,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -665,6 +716,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/extras/Makefile.in b/extras/Makefile.in
index 4295354..f38643e 100644
--- a/extras/Makefile.in
+++ b/extras/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -132,6 +136,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -151,6 +157,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -164,29 +172,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -345,14 +334,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  extras/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  extras/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extras/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign extras/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -370,6 +359,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -399,13 +389,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -433,6 +427,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -452,6 +447,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -460,18 +457,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -505,6 +512,7 @@ uninstall-am:
 	maintainer-clean-generic mostlyclean mostlyclean-generic \
 	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/gstreamer/Makefile.in b/gstreamer/Makefile.in
index 6ddf022..980e750 100644
--- a/gstreamer/Makefile.in
+++ b/gstreamer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = equalizer
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -357,14 +374,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  gstreamer/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  gstreamer/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gstreamer/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign gstreamer/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -382,6 +399,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -413,7 +431,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -447,16 +465,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -464,14 +482,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -483,7 +501,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -492,29 +510,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -535,29 +558,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -587,6 +625,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -606,6 +645,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -614,18 +655,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -646,8 +697,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -663,6 +714,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/gstreamer/equalizer/Makefile.in b/gstreamer/equalizer/Makefile.in
index ccac73a..0a38395 100644
--- a/gstreamer/equalizer/Makefile.in
+++ b/gstreamer/equalizer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -52,6 +54,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -71,14 +74,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(plugindir)"
-pluginLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libgstequalizer_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
@@ -92,6 +110,7 @@ libgstequalizer_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
+am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -168,6 +187,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -187,6 +208,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -200,29 +223,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -394,14 +398,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/..
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  gstreamer/equalizer/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  gstreamer/equalizer/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gstreamer/equalizer/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign gstreamer/equalizer/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -419,23 +423,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
 	test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)"
-	@list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+	list2=; for p in $$list; do \
 	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(plugindir)/$$f'"; \
-	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(plugindir)/$$f"; \
+	    list2="$$list2 $$p"; \
 	  else :; fi; \
-	done
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \
+	}
 
 uninstall-pluginLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@list='$(plugin_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$p'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$p"; \
+	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \
 	done
 
 clean-pluginLTLIBRARIES:
@@ -460,38 +469,38 @@ distclean-compile:
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c $<
 
 .c.obj:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
 libgstequalizer_la-gstiirequalizer.lo: gstiirequalizer.c
- at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo
+ at am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='gstiirequalizer.c' object='libgstequalizer_la-gstiirequalizer.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c
+ at am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c
 
 libgstequalizer_la-gstiirequalizer10bands.lo: gstiirequalizer10bands.c
- at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer10bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo
+ at am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer10bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='gstiirequalizer10bands.c' object='libgstequalizer_la-gstiirequalizer10bands.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c
+ at am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -504,14 +513,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -519,29 +528,34 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -562,13 +576,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -599,6 +617,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -621,6 +640,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -629,18 +650,28 @@ install-data-am: install-pluginLTLIBRARIES
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -679,6 +710,7 @@ uninstall-am: uninstall-pluginLTLIBRARIES
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags uninstall uninstall-am uninstall-pluginLTLIBRARIES
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/install-sh b/install-sh
index a5897de..6781b98 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2006-12-25.00
+scriptversion=2009-04-28.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -515,5 +515,6 @@ done
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/libbanshee/Makefile.in b/libbanshee/Makefile.in
index 844a081..5b4957b 100644
--- a/libbanshee/Makefile.in
+++ b/libbanshee/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -18,8 +19,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -55,6 +57,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -74,14 +77,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(bansheelibdir)"
-bansheelibLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(bansheelib_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libbanshee_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@@ -107,6 +125,7 @@ libbanshee_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
+am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -184,6 +203,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -203,6 +224,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -216,29 +239,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -429,14 +433,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  libbanshee/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  libbanshee/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libbanshee/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign libbanshee/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -454,23 +458,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-bansheelibLTLIBRARIES: $(bansheelib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
 	test -z "$(bansheelibdir)" || $(MKDIR_P) "$(DESTDIR)$(bansheelibdir)"
-	@list='$(bansheelib_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(bansheelib_LTLIBRARIES)'; test -n "$(bansheelibdir)" || list=; \
+	list2=; for p in $$list; do \
 	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(bansheelibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(bansheelibdir)/$$f'"; \
-	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(bansheelibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(bansheelibdir)/$$f"; \
+	    list2="$$list2 $$p"; \
 	  else :; fi; \
-	done
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bansheelibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bansheelibdir)"; \
+	}
 
 uninstall-bansheelibLTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bansheelib_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bansheelibdir)/$$p'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bansheelibdir)/$$p"; \
+	@list='$(bansheelib_LTLIBRARIES)'; test -n "$(bansheelibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bansheelibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bansheelibdir)/$$f"; \
 	done
 
 clean-bansheelibLTLIBRARIES:
@@ -507,21 +516,21 @@ distclean-compile:
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c $<
 
 .c.obj:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
@@ -537,14 +546,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -552,29 +561,34 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -595,13 +609,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -633,6 +651,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -655,6 +674,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -663,18 +684,28 @@ install-data-am: install-bansheelibLTLIBRARIES
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -720,6 +751,7 @@ all: $(top_builddir)/bin/libbanshee.so
 $(top_builddir)/bin/libbanshee.so: libbanshee.la
 	mkdir -p $(top_builddir)/bin
 	cp -f .libs/libbanshee.so $@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/missing b/missing
index 1c8ff70..28055d2 100755
--- a/missing
+++ b/missing
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2006-05-10.23
+scriptversion=2009-04-28.21; # UTC
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
-#   Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
@@ -18,9 +18,7 @@ scriptversion=2006-05-10.23
 # 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
-# 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -89,6 +87,9 @@ Supported PROGRAM values:
   tar          try tar, gnutar, gtar, then tar without non-portable flags
   yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
 
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
 Send bug reports to <bug-automake at gnu.org>."
     exit $?
     ;;
@@ -106,15 +107,22 @@ Send bug reports to <bug-automake at gnu.org>."
 
 esac
 
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
 # Now exit if we have it, but it failed.  Also exit now if we
 # don't have it and --version was passed (most likely to detect
-# the program).
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
 case $1 in
-  lex|yacc)
+  lex*|yacc*)
     # Not GNU programs, they don't have --version.
     ;;
 
-  tar)
+  tar*)
     if test -n "$run"; then
        echo 1>&2 "ERROR: \`tar' requires --run"
        exit 1
@@ -138,7 +146,7 @@ esac
 
 # If it does not exist, or fails to run (possibly an outdated version),
 # try to emulate it.
-case $1 in
+case $program in
   aclocal*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
@@ -148,7 +156,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     touch aclocal.m4
     ;;
 
-  autoconf)
+  autoconf*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
          you modified \`${configure_ac}'.  You might want to install the
@@ -157,7 +165,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     touch configure
     ;;
 
-  autoheader)
+  autoheader*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
          you modified \`acconfig.h' or \`${configure_ac}'.  You might want
@@ -187,7 +195,7 @@ WARNING: \`$1' is $msg.  You should only need it if
 	   while read f; do touch "$f"; done
     ;;
 
-  autom4te)
+  autom4te*)
     echo 1>&2 "\
 WARNING: \`$1' is needed, but is $msg.
          You might have modified some files without having the
@@ -210,7 +218,7 @@ WARNING: \`$1' is needed, but is $msg.
     fi
     ;;
 
-  bison|yacc)
+  bison*|yacc*)
     echo 1>&2 "\
 WARNING: \`$1' $msg.  You should only need it if
          you modified a \`.y' file.  You may need the \`Bison' package
@@ -240,7 +248,7 @@ WARNING: \`$1' $msg.  You should only need it if
     fi
     ;;
 
-  lex|flex)
+  lex*|flex*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
          you modified a \`.l' file.  You may need the \`Flex' package
@@ -263,7 +271,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     fi
     ;;
 
-  help2man)
+  help2man*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
 	 you modified a dependency of a manual page.  You may need the
@@ -277,11 +285,11 @@ WARNING: \`$1' is $msg.  You should only need it if
     else
 	test -z "$file" || exec >$file
 	echo ".ab help2man is required to generate this page"
-	exit 1
+	exit $?
     fi
     ;;
 
-  makeinfo)
+  makeinfo*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
          you modified a \`.texi' or \`.texinfo' file, or any other file
@@ -310,7 +318,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     touch $file
     ;;
 
-  tar)
+  tar*)
     shift
 
     # We have already tried tar in the generic part.
@@ -363,5 +371,6 @@ exit 0
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
index 57ef267..c7e8302 100644
--- a/po/Makefile.in.in
+++ b/po/Makefile.in.in
@@ -21,7 +21,7 @@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 PACKAGE = @PACKAGE@
 VERSION = @VERSION@
 
-SHELL = /bin/sh
+SHELL = @SHELL@
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
@@ -56,7 +56,7 @@ ALL_LINGUAS = @ALL_LINGUAS@
 
 PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi)
 
-USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep ^$$lang$$`"; then printf "$$lang "; fi; done; fi)
+USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep '^$$lang$$' $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep '^$$lang$$'`"; then printf "$$lang "; fi; done; fi)
 
 USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 08c9903..1d5a182 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -62,6 +62,7 @@ src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs
 src/Core/Banshee.Services/Banshee.Preferences/Page.cs
 src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs
 src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
+src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs
 src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
 src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
 src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
@@ -75,6 +76,7 @@ src/Core/Banshee.Services/Banshee.Web/Browser.cs
 src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs
 src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs
+src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
 src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs
 src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
 src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
@@ -84,6 +86,7 @@ src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs
+src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
@@ -109,6 +112,7 @@ src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
 src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs
 src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs
 src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs
+src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs
 src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs
 src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs
 src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs
@@ -122,6 +126,7 @@ src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
 src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs
 src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade
 src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs
+src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs
 src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs
 src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs
 src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
@@ -161,6 +166,17 @@ src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs
 src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
 src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
 src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs
+src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs
+src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs
+src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
+src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs
 src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs
 src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
 src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
@@ -178,12 +194,16 @@ src/Extensions/Banshee.Lastfm/Resources/lastfm.glade
 src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs
 src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs
 src/Extensions/Banshee.MiniMode/Resources/minimode.glade
+src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs
+src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs
 src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs
 src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs
 src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs
 src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
 src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs
 src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
+src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs
+src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs
 src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
 src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs
 src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs
@@ -193,6 +213,7 @@ src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs
+src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs
 src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs
@@ -207,6 +228,7 @@ src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs
 src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs
 src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/ContextPage.cs
 src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/WikipediaView.cs
+src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs
 src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
 src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs
 src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs
@@ -218,6 +240,7 @@ src/Libraries/Hyena.Gui/Hyena.Query.Gui/RelativeTimeSpanQueryValueEntry.cs
 src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
 src/Libraries/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs
 src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs
+src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs
 src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
 src/Libraries/Hyena/Hyena.Query/NullQueryValue.cs
 src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
diff --git a/po/de.po b/po/de.po
index da3f4bd..e1326ab 100644
--- a/po/de.po
+++ b/po/de.po
@@ -17,9 +17,9 @@ msgstr ""
 "Project-Id-Version: banshee 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=banshee&component=general\n"
-"POT-Creation-Date: 2009-09-23 01:37+0000\n"
-"PO-Revision-Date: 2009-09-19 19:50+0200\n"
-"Last-Translator: Christian Kirbach <Christian.Kirbach at googlemail.com>\n"
+"POT-Creation-Date: 2009-10-13 14:43+0000\n"
+"PO-Revision-Date: 2009-10-17 17:03+0100\n"
+"Last-Translator: Mario Blättermann <mariobl at gnome.org>\n"
 "Language-Team: German <gnome-de at gnome.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -39,8 +39,8 @@ msgid ""
 "Free Lossless Audio Codec (FLAC) is an open source codec that compresses but "
 "does not degrade audio quality."
 msgstr ""
-"Free Lossless Audio Codec (FLAC) ist ein quelloffener Codec, der "
-"komprimiert, aber die Audioqualität nicht verschlechtert."
+"Free Lossless Audio Codec (FLAC) ist ein quelloffener Codec, der komprimiert, "
+"aber die Audioqualität nicht verschlechtert."
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:1
 #: ../data/audio-profiles/mp3-xing.xml.in.h:1
@@ -137,8 +137,8 @@ msgid ""
 "Vorbis is an open source, lossy audio codec with high quality output at a "
 "lower file size than MP3."
 msgstr ""
-"Vorbis ist ein verlustbehafteter Open Source Audio-Codec mit "
-"hochqualitativer Ausgabe bei kleineren Dateigrößen als MP3."
+"Vorbis ist ein verlustbehafteter Open Source Audio-Codec mit hochqualitativer "
+"Ausgabe bei kleineren Dateigrößen als MP3."
 
 #: ../data/audio-profiles/wavpack.xml.in.h:1
 msgid ""
@@ -416,8 +416,7 @@ msgstr "Wiedergabeoptionen"
 
 # CHECK
 #: ../src/Clients/Booter/Booter/Entry.cs:158
-msgid ""
-"Play the next track, optionally restarting if the 'restart' value is set"
+msgid "Play the next track, optionally restarting if the 'restart' value is set"
 msgstr ""
 "Den nächsten Titel abspielen, optional neu starten, falls das »restart«-Feld "
 "gesetzt ist"
@@ -426,8 +425,8 @@ msgstr ""
 msgid ""
 "Play the previous track, optionally restarting if the 'restart value is set"
 msgstr ""
-"Den vorherigen Titel abspielen, optional neu starten, falls das »restart«-"
-"Feld gesetzt ist"
+"Den vorherigen Titel abspielen, optional neu starten, falls das »restart«-Feld "
+"gesetzt ist"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:160
 msgid "Automatically start playing any tracks enqueued on the command line"
@@ -465,8 +464,7 @@ msgstr "Die Wiedergabelautstärke einstellen (0-100)"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:168
 msgid "Seek to a specific point (seconds, float)"
-msgstr ""
-"Zu einer bestimmten Position springen (in Sekunden, als Fließkommazahl)"
+msgstr "Zu einer bestimmten Position springen (in Sekunden, als Fließkommazahl)"
 
 # CHECK
 #: ../src/Clients/Booter/Booter/Entry.cs:171
@@ -508,16 +506,19 @@ msgstr "Adresse"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "Interpret"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "Albumtitel"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "Stücktitel"
 
@@ -545,6 +546,7 @@ msgstr "CD-Nummer"
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "Jahr"
 
@@ -682,6 +684,7 @@ msgid "_Search:"
 msgstr "_Suchen:"
 
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "Interpret, Album oder Titel"
 
@@ -689,6 +692,7 @@ msgstr "Interpret, Album oder Titel"
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "Genre"
 
@@ -700,6 +704,7 @@ msgstr "Kommentar"
 
 #. Translators: this is a verb (command), not a noun (things)
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:178
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
 #, csharp-format
 msgid "Filter Results"
 msgstr "Ergebnisse filtern"
@@ -1036,11 +1041,11 @@ msgstr "Initialisierung läuft"
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:137
 msgid ""
-"Files are currently being converted to another format. Would you like to "
-"stop this?"
+"Files are currently being converted to another format. Would you like to stop "
+"this?"
 msgstr ""
-"Dateien werden momentan in ein anderes Format umgewandelt. Möchten Sie "
-"diesen Vorgang stoppen?"
+"Dateien werden momentan in ein anderes Format umgewandelt. Möchten Sie diesen "
+"Vorgang stoppen?"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs:51
 msgid "Saving Metadata to File"
@@ -1055,8 +1060,8 @@ msgid ""
 "Enable this option to save tags and other metadata inside supported audio "
 "files."
 msgstr ""
-"Diese Option aktivieren, um Tags und andere Metadaten innerhalb "
-"unterstützter Audio-Dateien zu speichern."
+"Diese Option aktivieren, um Tags und andere Metadaten innerhalb unterstützter "
+"Audio-Dateien zu speichern."
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:54
 msgid "_Update file and folder names"
@@ -1080,8 +1085,7 @@ msgid ""
 "audio files whenever the rating is changed."
 msgstr ""
 "Aktivieren Sie diese Option, um Bewertungs- und Wiedergabeanzahl-Metadaten "
-"innerhalb unterstützter Audio-Dateien bei Änderung der Bewertung zu "
-"speichern."
+"innerhalb unterstützter Audio-Dateien bei Änderung der Bewertung zu speichern."
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:131
 msgid "Import _ratings"
@@ -1926,9 +1930,9 @@ msgid ""
 "Closing Banshee now will cancel any currently running tasks. They cannot be "
 "resumed automatically the next time Banshee is run."
 msgstr ""
-"Das Beenden von Banshee wird die momentan laufenden Vorgänge abbrechen. "
-"Diese können beim nächsten Start von Banshee nicht automatisch "
-"wiederaufgenommen werden."
+"Das Beenden von Banshee wird die momentan laufenden Vorgänge abbrechen. Diese "
+"können beim nächsten Start von Banshee nicht automatisch wiederaufgenommen "
+"werden."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:58
 msgid "Quit anyway"
@@ -2047,8 +2051,7 @@ msgstr "_Erweiterungen verwalten"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:84
 msgid "Manage extensions to add new features to Banshee"
-msgstr ""
-"Die Erweiterungen verwalten, um Banshee um neue Fähigkeiten zu ergänzen"
+msgstr "Die Erweiterungen verwalten, um Banshee um neue Fähigkeiten zu ergänzen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:88
 msgid "_Tools"
@@ -2238,8 +2241,7 @@ msgstr "_Alben zufällig wiedergeben"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:97
 msgid "Play all songs from an album, then randomly choose another album"
-msgstr ""
-"Alle Titel eines Albums wiedergeben, dann ein zufälliges anderes wählen"
+msgstr "Alle Titel eines Albums wiedergeben, dann ein zufälliges anderes wählen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:101
 msgid "Shuffle by _Rating"
@@ -2389,8 +2391,8 @@ msgstr "_Zur Wiedergabeliste hinzufügen"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:84
 msgid "Append selected items to playlist or create new playlist from selection"
 msgstr ""
-"Ausgewählte Elemente zur Wiedergabeliste hinzufügen oder neue "
-"Wiedergabeliste aus der Auswahl erstellen"
+"Ausgewählte Elemente zur Wiedergabeliste hinzufügen oder neue Wiedergabeliste "
+"aus der Auswahl erstellen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:89
 msgid "Create new playlist from selected tracks"
@@ -2488,8 +2490,8 @@ msgstr "Album-Interpret einer Kom_pilation:"
 msgid ""
 "Check this if this track is part of an album with tracks by various artists"
 msgstr ""
-"Markieren Sie dies, wenn der Titel Teil eines Albums mit Titeln "
-"verschiedenen Interpreten ist"
+"Markieren Sie dies, wenn der Titel Teil eines Albums mit Titeln verschiedenen "
+"Interpreten ist"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:59
 msgid ""
@@ -2802,8 +2804,8 @@ msgstr "Alle _Feldwerte abgleichen"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:272
 msgid ""
-"Apply the values of all common fields set for this track to all of the "
-"tracks selected in this editor"
+"Apply the values of all common fields set for this track to all of the tracks "
+"selected in this editor"
 msgstr ""
 "Die Werte aller gemeinsamen Felder in diesem Titel auf alle im Editor "
 "ausgewählten Titel anwenden."
@@ -2927,8 +2929,7 @@ msgstr "Diese Operation arbeitet noch. Möchten Sie sie stoppen?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:144
 #, csharp-format
-msgid ""
-"The '{0}' operation is still performing work. Would you like to stop it?"
+msgid "The '{0}' operation is still performing work. Would you like to stop it?"
 msgstr "Die »{0}« Operation arbeitet noch. Möchten Sie diese stoppen?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:148
@@ -3138,11 +3139,11 @@ msgstr "Kontakt wird aufgebaut …"
 msgid "Buffering"
 msgstr "Puffern"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
 msgid "Muted"
 msgstr "Stummgeschaltet"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
 msgid "Full Volume"
 msgstr "Volle Lautstärke"
 
@@ -3361,7 +3362,7 @@ msgid "Capacity"
 msgstr "Kapazität"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "Seriennummer"
 
@@ -3423,8 +3424,8 @@ msgid ""
 "Banshee and iTunes with the same iPod is not recommended."
 msgstr ""
 "Sie haben diesen iPod mit einer Version von iTunes verwendet, die "
-"Informationen in einer Version der Titel-Datenbank speichert, die zu neu "
-"ist, als dass Banshee diese erkennen könnte.\n"
+"Informationen in einer Version der Titel-Datenbank speichert, die zu neu ist, "
+"als dass Banshee diese erkennen könnte.\n"
 "\n"
 "Banshee kann die Datenbank neu aufbauen, dabei könnten jedoch Einstellungen "
 "verloren gehen. Es wird nicht empfohlen, Banshee und iTunes mit demselben "
@@ -3469,9 +3470,8 @@ msgid ""
 "\n"
 "Are you sure you want to rebuild your iPod database?"
 msgstr ""
-"Der Neuaufbau Ihrer iPod-Datenbank kann einige Zeit in Anspruch nehmen. "
-"Bitte beachten Sie auch, dass alle Wiedergabelisten auf Ihrem iPod verloren "
-"gehen.\n"
+"Der Neuaufbau Ihrer iPod-Datenbank kann einige Zeit in Anspruch nehmen. Bitte "
+"beachten Sie auch, dass alle Wiedergabelisten auf Ihrem iPod verloren gehen.\n"
 "\n"
 "Sind Sie sicher, dass Sie einen Neuaufbau Ihrer iPod-Datenbank wünschen?"
 
@@ -3518,15 +3518,14 @@ msgid "Ringtones"
 msgstr "Klingeltöne"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:117
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "MTP-Unterstützung ignoriert das Gerät"
 
 # CHECK: 2x »Gerät« vermeidbar?
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:118
-msgid ""
-"Banshee's MTP audio player support can only handle one device at a time."
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
+msgid "Banshee's MTP audio player support can only handle one device at a time."
 msgstr ""
 "Banshees Unterstützung für MTP-Wiedergabegeräte ist nicht für mehrere Geräte "
 "gleichzeitig nutzbar."
@@ -3556,19 +3555,19 @@ msgstr ""
 "Ein MTP-Gerät wurde erkannt, aber Banshee konnte keine Unterstützung dafür "
 "laden."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:145
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "Version"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:147
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "Batteriestand"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
 #. track currently being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:163
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "{0} - {1} von {2} wird geladen"
@@ -3748,8 +3747,7 @@ msgstr "A_nschlag"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:106
 msgid "Have Banshee attempt to auto-detect the BPM of this song"
-msgstr ""
-"Banshee soll versuchen, den BPM-Wert des Titels automatisch zu erkennen"
+msgstr "Banshee soll versuchen, den BPM-Wert des Titels automatisch zu erkennen"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:108
 msgid "Play this song"
@@ -3768,8 +3766,7 @@ msgstr "BPM-Werte für alle Titel _automatisch erkennen"
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:149
 msgid "Detect BPM for all songs that don't already have a value set"
 msgstr ""
-"BPM-Werte für alle Titel erkennen, für die diese Werte noch nicht gesetzt "
-"sind"
+"BPM-Werte für alle Titel erkennen, für die diese Werte noch nicht gesetzt sind"
 
 #: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:58
 msgid "Downloading Cover Art"
@@ -4437,6 +4434,11 @@ msgstr "Aktuelle Quelle:"
 msgid "Full Mode"
 msgstr "Vollansicht"
 
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:42
+#| msgid "_Media"
+msgid "Media"
+msgstr "Medien"
+
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "_Benachrichtigungen anzeigen"
@@ -4462,11 +4464,11 @@ msgstr ""
 msgid "Now Playing"
 msgstr "Jetzt wiedergegeben"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:462
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "Dieses Element überspringen"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:468
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "Benachrichtigung kann nicht angezeigt werden"
 
@@ -4525,8 +4527,8 @@ msgid ""
 "not able to infer the location of this directory. Please locate it."
 msgstr ""
 "Die iTunes-Bibliothek verweist auf Ihren Musikordner mit »{0}«, aber Banshee "
-"war nicht imstande, den Ort dieses Ordners zu bestimmen. Bitte machen Sie "
-"ihn ausfindig."
+"war nicht imstande, den Ort dieses Ordners zu bestimmen. Bitte machen Sie ihn "
+"ausfindig."
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
 msgid "iTunes Media Player"
@@ -4610,11 +4612,11 @@ msgstr "Wiedergabe-Warteschlange"
 msgid "Remove From Play Queue"
 msgstr "Aus der Warteschlange entfernen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:747
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:755
 msgid "Number of _played songs to show"
 msgstr "Anzahl _gespielter Titel, die angezeigt werden sollen"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:753
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:761
 msgid "Number of _upcoming songs to show"
 msgstr "Anzahl _kommender Titel, die angezeigt werden sollen"
 
@@ -5077,8 +5079,7 @@ msgstr "Es gibt nicht genügend Nachbarn für diese Station."
 
 # CHECK: streaming system
 #: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:446
-msgid ""
-"The streaming system is offline for maintenance, please try again later."
+msgid "The streaming system is offline for maintenance, please try again later."
 msgstr ""
 "Das Streaming-System ist gerade nicht verfügbar. Bitte versuchen Sie es "
 "später noch einmal."
@@ -5174,9 +5175,8 @@ msgstr "Unbekannter Podcast"
 #~ "Are you sure you want to permanently delete this item?Are you sure you "
 #~ "want to permanently delete the selected {0} items?"
 #~ msgstr ""
-#~ "Sind Sie sicher, dass Sie dieses Element dauerhaft löschen möchen?Sind "
-#~ "Sie sicher, dass Sie diese {0} ausgewählten Elemente dauerhaft löschen "
-#~ "möchen?"
+#~ "Sind Sie sicher, dass Sie dieses Element dauerhaft löschen möchen?Sind Sie "
+#~ "sicher, dass Sie diese {0} ausgewählten Elemente dauerhaft löschen möchen?"
 
 #~ msgid ""
 #~ "Are you sure you want to remove the selected item from your {1}?Are you "
diff --git a/po/es.po b/po/es.po
index 8dad1bb..e6b9a2e 100644
--- a/po/es.po
+++ b/po/es.po
@@ -15,8 +15,8 @@ msgstr ""
 "Project-Id-Version: banshee.HEAD\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=banshee&component=general\n"
-"POT-Creation-Date: 2009-09-14 17:16+0000\n"
-"PO-Revision-Date: 2009-09-20 15:27+0200\n"
+"POT-Creation-Date: 2009-10-28 22:48+0000\n"
+"PO-Revision-Date: 2009-10-29 23:46+0100\n"
 "Last-Translator: Jorge González <jorgegonz at svn.gnome.org>\n"
 "Language-Team: Español <gnome-es-list at gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -437,7 +437,6 @@ msgid "Pause playback"
 msgstr "Pausar la reproducción"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:163
-#| msgid "Pause playback"
 msgid "Toggle playback"
 msgstr "Conmutar la reproducción"
 
@@ -499,16 +498,19 @@ msgstr "URI"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "Nombre del artista"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "Título del álbum"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "Título de la pista"
 
@@ -536,6 +538,7 @@ msgstr "Número de disco"
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "Año"
 
@@ -649,7 +652,7 @@ msgid "Add an album to the playlist"
 msgstr "Añadir un álbum a la lista de reproducción"
 
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:76
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
 msgid "Banshee Media Player"
@@ -669,6 +672,7 @@ msgid "_Search:"
 msgstr "_Buscar:"
 
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "Artista, álbum o título"
 
@@ -676,6 +680,7 @@ msgstr "Artista, álbum o título"
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "Género"
 
@@ -806,7 +811,7 @@ msgid "Scanning for media"
 msgstr "Examinando contenido multimedia"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1206
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1250
 msgid "Scanning..."
 msgstr "Examinando…"
 
@@ -846,13 +851,13 @@ msgid ""
 msgstr ""
 "Espere mientras se migra su antigua base de datos Banshee al nuevo formato."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1203
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1247
 msgid "Refreshing Metadata"
 msgstr "Actualizando metadatos"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Directory"
-msgstr "Directorio personal"
+msgid "Home Folder"
+msgstr "Carpeta personal"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
 msgid "Remove From Library"
@@ -888,76 +893,76 @@ msgstr "_Nombre del archivo"
 msgid "Miscellaneous"
 msgstr "Miscelánea"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr "Canciones puntuadas con cuatro o cinco estrellas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "Favoritos recientes"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr "Canciones escuchadas a menudo en la última semana"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
 msgid "Recently Added"
 msgstr "Añadidas recientemente"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "Canciones importadas durante la última semana"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "No oídas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
 msgstr "Canciones que han sido omitidas o no reproducidas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "Favoritos abandonados"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:110
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
 msgid "Favorites not played in over two months"
 msgstr "Favoritos no reproducidos en más de dos meses"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "Menos favoritos"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr "Canciones puntuadas con una o dos estrellas u omitidas frecuentemente"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "700 MB de favoritos"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr "Un CD de datos lleno de canciones favoritas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "80 minutos de favoritos"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:126
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr "Un CD de sonido lleno de canciones favoritas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr "No puntuadas"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:132
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr "Canciones que no han sido puntuadas"
 
@@ -1077,18 +1082,18 @@ msgid "There is no available network connection"
 msgstr "No hay ninguna red disponible"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:78
-msgid "Cannot connect to NetworkManager"
-msgstr "No se puede conectar con NetworkManager"
+msgid "Cannot connect to NetworkManager or Wicd"
+msgstr "No se puede conectar con NetworkManager o Wicd"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:79
 msgid "An available, working network connection will be assumed"
 msgstr "Se asumirá una conexión disponible y en funcionamiento"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:150
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:157
 msgid "_Disable features requiring Internet access"
 msgstr "Desactivar características que requieran acceso a _Internet"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:151
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:158
 msgid ""
 "Some features require a broadband Internet connection such as Last.fm or "
 "cover art fetching"
@@ -1207,6 +1212,7 @@ msgid "Least Often Played"
 msgstr "Reproducidos con menor frecuencia"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:58
 msgid "Most Recently Played"
 msgstr "Reproducidos más recientemente"
 
@@ -1706,7 +1712,7 @@ msgid "Close Error Report"
 msgstr "Cerrar el informe de error"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:82
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
 msgid "Error"
 msgstr "Error"
 
@@ -1846,12 +1852,10 @@ msgid "Hide context pane"
 msgstr "Ocultar el panel contextual"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:144
-#| msgid "Waiting for downloads to terminate..."
 msgid "Waiting for playback to begin..."
 msgstr "Esperando a que empiece la reproducción…"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:150
-#| msgid "Contacting..."
 msgid "Loading..."
 msgstr "Cargando…"
 
@@ -1943,6 +1947,11 @@ msgstr "No preguntar esto otra vez"
 msgid "Make Banshee the Default"
 msgstr "Hacer Banshee el predeterminado"
 
+#. Translators: verb
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+msgid "I_mport"
+msgstr "I_mportar"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs:39
 msgid "Select album cover image"
 msgstr "Seleccionar imagen de portada de álbum"
@@ -1964,7 +1973,7 @@ msgid "Browse..."
 msgstr "Examinar…"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs:98
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
 msgid "Open Location"
 msgstr "Abrir ubicación"
 
@@ -2084,19 +2093,15 @@ msgstr "Información de la _versión"
 msgid "View detailed version and configuration information"
 msgstr "Ver información detallada de la versión y la configuración"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:163
+#. Prompt user for location of the playlist.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:160
 msgid "Import Playlist"
 msgstr "Importar lista de reproducción"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:170
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:161
 msgid "Playlists"
 msgstr "Listas de reproducción"
 
-#. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:178
-msgid "I_mport"
-msgstr "I_mportar"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
 msgid "Play or pause the current item"
 msgstr "Reproducir o pausar el elemento actual"
@@ -2402,7 +2407,10 @@ msgstr "Bo_rrar de la unidad"
 msgid "Permanently delete selected item(s) from medium"
 msgstr "Borrar permanentemente lo(s) elemento(s) seleccionado(s) del soporte"
 
+#. Translators: this is a verb (command), not a noun (things)
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "_Buscar"
 
@@ -2921,48 +2929,61 @@ msgstr "Continuar «{0}»"
 msgid "Stopping..."
 msgstr "Parando…"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:45
 msgid "Import Files to Library"
 msgstr "Importar archivos a la colección"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:48
 msgid "Media Files"
 msgstr "Archivos multimedia"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:59
 msgid "Local Files"
 msgstr "Archivos locales"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
+msgid "C_hoose Files"
+msgstr "_Elegir archivos"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
 msgid "_Files to import:"
 msgstr "_Archivos que importar:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:82
 msgid "Select Files"
 msgstr "Seleccionar archivos"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:83
 msgid "(none selected)"
 msgstr "(ninguno seleccionado)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:43
 msgid "Import Folders to Library"
 msgstr "Importar carpetas a la colección"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:53
 msgid "Local Folders"
 msgstr "Carpetas locales"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
+msgid "C_hoose Folders"
+msgstr "_Elegir carpetas"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
 msgid "_Folders to import:"
 msgstr "_Carpetas que importar:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:81
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:76
 msgid "Select Folders"
 msgstr "Seleccionar carpetas"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:89
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+msgid "_Import"
+msgstr "_Importar"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
-msgid "Videos from Photos Folder"
+msgid "Videos From Photos Folder"
 msgstr "Vídeos de la carpeta Imágenes"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
@@ -2998,6 +3019,11 @@ msgstr "Seleccionar la ubicación de la colección"
 msgid "Reset"
 msgstr "Restablecer"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
+#, csharp-format
+msgid "Reset location to default ({0})"
+msgstr "Restablecer la ubicación a la predeterminada ({0})"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
 msgstr "No se pudieron mostrar las preferencias"
@@ -3044,46 +3070,38 @@ msgid "<big><b>Import Media to Library</b></big>"
 msgstr "<big><b>Importar contenido multimedia a la colección</b></big>"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
-msgid "Choose an import _source:"
-msgstr "Elija una _fuente para importar:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Create and save"
 msgstr "Crear y guardar"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Do not show this dialog again"
 msgstr "No mostrar este diálogo de nuevo"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
 msgid "Enter the address of the file you would like to open:"
 msgstr "Introduzca la dirección del archivo que quiere abrir:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
-msgid "I_mport Media Source"
-msgstr "I_mportar fuente multimedia"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+msgid "Import _from:"
+msgstr "Importar _desde:"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
-msgid "Import Media to Library"
-msgstr "Importar contenido multimedia a la colección"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Open in editor"
 msgstr "Abrir en el editor"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
 msgid "Playlist _Name: "
 msgstr "_Nombre de la lista de reproducción:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Predefined Smart Playlists"
 msgstr "Listas de reproducción inteligentes predefinidas"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:14
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
 msgid "Seek to Position"
 msgstr "Ir hasta la posición"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:15
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
 msgid ""
 "Your media library is empty. You may import new music and videos into your "
 "library now, or choose to do so later."
@@ -3111,11 +3129,11 @@ msgstr "Contactando…"
 msgid "Buffering"
 msgstr "Buffering"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
 msgid "Muted"
 msgstr "Silencio"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
 msgid "Full Volume"
 msgstr "A todo volumen"
 
@@ -3282,12 +3300,12 @@ msgstr "Podcasts"
 msgid "Eject {0}"
 msgstr "Expulsar {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:104
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:108
 #, csharp-format
 msgid "Ejecting {0}..."
 msgstr "Expulsando {0}…"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:111
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:115
 #, csharp-format
 msgid "Could not eject {0}: {1}"
 msgstr "No se pudo expulsar {0}: {1}"
@@ -3334,7 +3352,7 @@ msgid "Capacity"
 msgstr "Capacidad"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "Número de serie"
 
@@ -3490,12 +3508,12 @@ msgid "Ringtones"
 msgstr "Tonos de llamada"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:117
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "El soporte MTP ignora el dispositivo"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:118
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid ""
 "Banshee's MTP audio player support can only handle one device at a time."
 msgstr ""
@@ -3525,19 +3543,19 @@ msgstr ""
 "Se ha detectado un dispositivo MTP, pero Banshee no ha podido cargar el "
 "soporte para éste."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:145
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "Versión"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:147
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "Nivel de batería"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
 #. track currently being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:163
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "Cargando {0} - {1} de {2}"
@@ -4389,6 +4407,19 @@ msgstr "Fuente actual:"
 msgid "Full Mode"
 msgstr "Modo completo"
 
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:62
+msgid "Music Library"
+msgstr "Fonoteca"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:78
+msgid "Play Queue"
+msgstr "Reproducir la cola"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+msgid "Media"
+msgstr "Multimedia"
+
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "Mostrar _notificaciones"
@@ -4414,11 +4445,11 @@ msgstr ""
 msgid "Now Playing"
 msgstr "Reproduciendo ahora"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:462
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "Saltar este elemento"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:468
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "No se pudo mostrar la notificación"
 
@@ -4448,10 +4479,6 @@ msgstr "Reproductor de música Rhythmbox"
 msgid "iTunes Importer"
 msgstr "Importador de iTunes"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
-msgid "_Import"
-msgstr "_Importar"
-
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
 msgid "Import _playlists"
 msgstr "Importar _listas de reproducción"
@@ -4494,7 +4521,6 @@ msgstr ""
 "absoluto. ¿Desea intentar la importación de todos modos?"
 
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:47
-#| msgid "manual"
 msgid "manually"
 msgstr "manualmente"
 
@@ -4543,7 +4569,6 @@ msgid "Add More"
 msgstr "Añadir más"
 
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
-#| msgid "Refresh random tracks in the play queue"
 msgid "Add more random tracks to the play queue"
 msgstr "Añadir más aleatorias a la cola de reproducción"
 
@@ -4555,19 +4580,15 @@ msgstr "Quitar todas las pistas de la cola de reproducción"
 msgid "Clear the play queue when quitting"
 msgstr "Limpiar la cola de reproducción al salir"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:77
-msgid "Play Queue"
-msgstr "Reproducir la cola"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:86
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:87
 msgid "Remove From Play Queue"
 msgstr "Quitar de la cola de reproducción"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:747
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:752
 msgid "Number of _played songs to show"
 msgstr "Número de canciones _reproducidas para mostrar:"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:753
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:758
 msgid "Number of _upcoming songs to show"
 msgstr "Número de canciones pró_ximas a mostrar:"
 
@@ -4645,8 +4666,6 @@ msgstr "¿Cancelar todas las descargas de podcasts?"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:120
 #, csharp-format
-#| msgid "Transfering {0} file at {1} KB/s"
-#| msgid_plural "Transfering {0} of {2} files at {1} KB/s"
 msgid "Transferring {0} file at {1} KB/s"
 msgid_plural "Transferring {0} of {2} files at {1} KB/s"
 msgstr[0] "Transfiriendo {0} archivo a {1} KB/s"
@@ -5061,8 +5080,17 @@ msgstr "Conectado a Last.fm"
 msgid "Unknown Podcast"
 msgstr "Podcast desconocido"
 
-#~ msgid "Music Library"
-#~ msgstr "Fonoteca"
+#~ msgid "Home Directory"
+#~ msgstr "Directorio personal"
+
+#~ msgid "Choose an import _source:"
+#~ msgstr "Elija una _fuente para importar:"
+
+#~ msgid "I_mport Media Source"
+#~ msgstr "I_mportar fuente multimedia"
+
+#~ msgid "Import Media to Library"
+#~ msgstr "Importar contenido multimedia a la colección"
 
 #~ msgid "Video Library"
 #~ msgstr "Videoteca"
diff --git a/po/gu.po b/po/gu.po
index 6535888..0e1cc51 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -1,4 +1,4 @@
-# translation of gu.po to Gujarati
+# translation of banshee.master.gu.po to Gujarati
 # Copyright (C) 2006 The GNOME Foundation
 # This file is distributed under the same license as the banshee package.
 #
@@ -9,10 +9,10 @@
 # Sweta Kothari <swkothar at redhat.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: gu\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-04 03:57+0000\n"
-"PO-Revision-Date: 2009-05-04 17:56+0530\n"
+"Project-Id-Version: banshee.master.gu\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&component=general\n"
+"POT-Creation-Date: 2009-10-28 22:48+0000\n"
+"PO-Revision-Date: 2009-11-02 14:59+0530\n"
 "Last-Translator: Sweta Kothari <swkothar at redhat.com>\n"
 "Language-Team: Gujarati\n"
 "MIME-Version: 1.0\n"
@@ -72,24 +72,52 @@ msgid "Constant Bitrate"
 msgstr "અચળ બીટદર"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:6
+msgid "Extreme"
+msgstr ""
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:7
+#, fuzzy
+msgid "Insane"
+msgstr "વપરાશકર્તાનામ"
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:8
+msgid "LAME Preset"
+msgstr ""
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:9
 msgid "MP3 (LAME Encoder)"
 msgstr "MP3 (LAME Encoder)"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:7
+#: ../data/audio-profiles/mp3-lame.xml.in.h:10
+#| msgid "_Media"
+msgid "Medium"
+msgstr "મધ્યમ"
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:11
+#, fuzzy
+#| msgid "Reset"
+msgid "Preset"
+msgstr "ફરીથી ગોઠવવું"
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:12
+msgid "Standard"
+msgstr "મૂળભૂત"
+
+#: ../data/audio-profiles/mp3-lame.xml.in.h:13
 msgid "VBR Mode"
 msgstr "VBR સ્થિતિ"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:8
+#: ../data/audio-profiles/mp3-lame.xml.in.h:14
 msgid "VBR Quality"
 msgstr "VBR ગુણવત્તા"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:9
+#: ../data/audio-profiles/mp3-lame.xml.in.h:15
 msgid "Variable Bitrate"
 msgstr "ચલ બીટદર"
 
-#: ../data/audio-profiles/mp3-lame.xml.in.h:10
+#: ../data/audio-profiles/mp3-lame.xml.in.h:16
 #: ../data/audio-profiles/vorbis.xml.in.h:5
-#: ../data/audio-profiles/wavpack.xml.in.h:11
+#: ../data/audio-profiles/wavpack.xml.in.h:15
 #: ../data/audio-profiles/wma.xml.in.h:7
 msgid "Worst"
 msgstr "ખરાબ"
@@ -125,26 +153,44 @@ msgid "Default"
 msgstr "મૂળભૂત"
 
 #: ../data/audio-profiles/wavpack.xml.in.h:5
+#, fuzzy
+#| msgid "Default player engine"
+msgid "Default Compression"
+msgstr "મૂળભૂત પ્લેયર એંજીન"
+
+#: ../data/audio-profiles/wavpack.xml.in.h:6
 msgid "Extra processing"
 msgstr "વધારાની પ્રક્રિયા"
 
-#: ../data/audio-profiles/wavpack.xml.in.h:6
+#: ../data/audio-profiles/wavpack.xml.in.h:7
+msgid "Fast Compression"
+msgstr ""
+
+#: ../data/audio-profiles/wavpack.xml.in.h:8
+msgid "High Compression"
+msgstr ""
+
+#: ../data/audio-profiles/wavpack.xml.in.h:9
 msgid "Highest"
 msgstr "ઉચ્ચતમ"
 
-#: ../data/audio-profiles/wavpack.xml.in.h:7
+#: ../data/audio-profiles/wavpack.xml.in.h:10
 msgid "Lossy mode"
 msgstr "Lossy સ્થિતિ"
 
-#: ../data/audio-profiles/wavpack.xml.in.h:8
+#: ../data/audio-profiles/wavpack.xml.in.h:11
 msgid "Mode"
 msgstr "સ્થિતિ"
 
-#: ../data/audio-profiles/wavpack.xml.in.h:9
+#: ../data/audio-profiles/wavpack.xml.in.h:12
 msgid "Store MD5 sum in the file"
 msgstr "MD5 સરવાળાને ફાઈલમાં સંગ્રહો"
 
-#: ../data/audio-profiles/wavpack.xml.in.h:10
+#: ../data/audio-profiles/wavpack.xml.in.h:13
+msgid "Very High Compression"
+msgstr ""
+
+#: ../data/audio-profiles/wavpack.xml.in.h:14
 msgid "Wavpack"
 msgstr "Wavpack"
 
@@ -180,73 +226,85 @@ msgstr "ચલ બીટદર વાપરો"
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: ../data/banshee-1.desktop.in.in.h:1
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:72
-msgid "Banshee Media Player"
-msgstr "Banshee મીડિયા પ્લેયર"
-
-#: ../data/banshee-1.desktop.in.in.h:2
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:151
-msgid "Media Player"
-msgstr "મીડિયા પ્લેયર"
-
-#: ../data/banshee-1.desktop.in.in.h:3
-msgid "Play and organize your media collection"
-msgstr "તમારો મીડિયા સંગ્રહ વગાડો અને આયોજીત કરો"
-
-#: ../libbanshee/banshee-ripper.c:201
+#: ../libbanshee/banshee-bpmdetector.c:202 ../libbanshee/banshee-ripper.c:268
 msgid "Could not create pipeline"
 msgstr "પાઈપલાઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-ripper.c:207
+#: ../libbanshee/banshee-bpmdetector.c:208
+#| msgid "Could not create 'filesrc' plugin"
+msgid "Could not create filesrc element"
+msgstr "filesrc પ્લગઈન બનાવી શક્યા નહિં"
+
+#: ../libbanshee/banshee-bpmdetector.c:214
+#| msgid "Could not create 'decodebin' plugin"
+msgid "Could not create decodebin plugin"
+msgstr "decodebin પ્લગઈન બનાવી શક્યા નહિં"
+
+#: ../libbanshee/banshee-bpmdetector.c:220
+#| msgid "Could not create 'audioconvert' plugin"
+msgid "Could not create audioconvert plugin"
+msgstr "audioconvert પ્લગઈન બનાવી શક્યા નહિં"
+
+#: ../libbanshee/banshee-bpmdetector.c:226
+#| msgid "Could not create queue plugin"
+msgid "Could not create bpmdetect plugin"
+msgstr "bpmdetect પ્લગઈન બનાવી શક્યા નહિં"
+
+#: ../libbanshee/banshee-bpmdetector.c:232
+#| msgid "Could not create filesink plugin"
+msgid "Could not create fakesink plugin"
+msgstr "fakesink પ્લગઈન બનાવી શક્યા નહિં"
+
+#: ../libbanshee/banshee-bpmdetector.c:241
+#: ../libbanshee/banshee-bpmdetector.c:250 ../libbanshee/banshee-ripper.c:309
+msgid "Could not link pipeline elements"
+msgstr "પાઈપલાઈન ઘટકોની કડી કરી શક્યા નહિં"
+
+#: ../libbanshee/banshee-ripper.c:274
 msgid "Could not initialize element from cdda URI"
 msgstr "cdda URI માંથી ઘટકનો આરંભ કરી શક્યા નહિં"
 
-#: ../libbanshee/banshee-ripper.c:221
+#: ../libbanshee/banshee-ripper.c:288
 msgid "Could not create encoder pipeline"
 msgstr "એનકોડર પાઈપલાઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-ripper.c:227
+#: ../libbanshee/banshee-ripper.c:294
 msgid "Could not create queue plugin"
 msgstr "કતાર પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-ripper.c:235
+#: ../libbanshee/banshee-ripper.c:302
 msgid "Could not create filesink plugin"
 msgstr "filesink પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-ripper.c:242
-msgid "Could not link pipeline elements"
-msgstr "પાઈપલાઈન ઘટકોની કડી કરી શક્યા નહિં"
-
-#: ../libbanshee/banshee-transcoder.c:241
+#: ../libbanshee/banshee-transcoder.c:240
 msgid "Could not create 'filesrc' plugin"
 msgstr "'filesrc' પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:247
+#: ../libbanshee/banshee-transcoder.c:246
 msgid "Could not create 'decodebin' plugin"
 msgstr "'decodebin' પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:253
+#: ../libbanshee/banshee-transcoder.c:252
 msgid "Could not create 'filesink' plugin"
 msgstr "'filesink' પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:259
+#: ../libbanshee/banshee-transcoder.c:258
 msgid "Could not create 'sinkben' plugin"
 msgstr "'sinkben' પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:265
+#: ../libbanshee/banshee-transcoder.c:264
 msgid "Could not create 'audioconvert' plugin"
 msgstr "'audioconvert' પ્લગઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:271
+#: ../libbanshee/banshee-transcoder.c:270
 msgid "Could not create encoding pipeline"
 msgstr "એનકોડીંગ પાઈપલાઈન બનાવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:277
+#: ../libbanshee/banshee-transcoder.c:276
 msgid "Could not get sink pad from encoder"
 msgstr "એનકોડરમાંથી સીંક પેડ મેળવી શક્યા નહિં"
 
-#: ../libbanshee/banshee-transcoder.c:345
+#: ../libbanshee/banshee-transcoder.c:344
 msgid "Could not construct pipeline"
 msgstr "પાઈપલાઈન રચી શક્યા નહિં"
 
@@ -266,31 +324,39 @@ msgstr "CD લખી શક્યા નહિં"
 msgid "Brasero could not be started"
 msgstr "Brasero શરૂ કરી શક્યા નહિં"
 
-#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs:78
+#: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs:79
 msgid "Fullscreen video playback active"
 msgstr "સંપૂર્ણસ્ક્રીન વિડિઓ પ્લેબેક સક્રિય"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs:75
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs:89
 msgid "Could not find an encoder for ripping."
 msgstr "રીપ કરવા માટે એનકોડર પ્લગઈન શોધી શક્યા નહિં."
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs:91
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs:108
 msgid "Could not create CD ripping driver."
 msgstr "CD રીપીંગ ડ્રાઈવર બનાવી શક્યા નહિં."
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:131
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs:71
+#, fuzzy
+#| msgid "Could not create CD ripping driver."
+msgid "Could not create BPM detection driver."
+msgstr "CD રીપીંગ ડ્રાઈવર બનાવી શક્યા નહિં."
+
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:122
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:153
 msgid "Could not initialize GStreamer library"
 msgstr "GStreamer લાઈબ્રેરીનો આરંભ કરી શક્યા નહિં"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:259
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:262
 msgid "Unknown Error"
 msgstr "અજ્ઞાત ભૂલ"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:507
-msgid "_Enable ReplayGain Correction"
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:555
+#| msgid "_Enable ReplayGain Correction"
+msgid "_Enable ReplayGain correction"
 msgstr "ફરીવગાડોપ્રાપ્તિ સુધારો સક્રિય કરો (_E)"
 
-#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:508
+#: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:556
 msgid ""
 "For tracks that have ReplayGain data, automatically scale (normalize) "
 "playback volume."
@@ -300,137 +366,461 @@ msgstr ""
 msgid "Could not create transcoder"
 msgstr "ટ્રાન્સકોડર બનાવી શક્યા નહિં"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:88
-msgid "_Search:"
-msgstr "શોધો (_S):"
+#: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:87
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:125
+msgid "_Close"
+msgstr "બંધ કરો (_C)"
+
+#: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:88
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:126
+msgid "Close"
+msgstr "બંધ કરો"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:138
-msgid "All Columns"
-msgstr "બધા સ્તંભો"
+#: ../src/Clients/Booter/Booter/Entry.cs:146
+#| msgid "Disc Options"
+msgid "Help Options"
+msgstr "મદદસ્ક વિકલ્પો"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:139
-msgid "Track Title"
-msgstr "ટ્રેક શીર્ષક"
+#: ../src/Clients/Booter/Booter/Entry.cs:147
+msgid "Show this help"
+msgstr "આ મદદ ને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:148
+msgid "Show options for controlling playback"
+msgstr "પ્લેબેકનો નિયંત્રણ કરવા માટે વિકલ્પોને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:149
+msgid "Show options for querying the playing track"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:150
+msgid "Show options for querying the playing engine"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:151
+msgid "Show options for the user interface"
+msgstr "વપરાશકર્તા ઇન્ટરફેસ માટે વિકલ્પોને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:152
+msgid "Show options for developers and debugging"
+msgstr "વિકાસકર્તાઓ અને ડિબગીંગ માટે વિકલ્પોને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:153
+msgid "Show all option groups"
+msgstr "બધા વિકલ્પ જૂથોને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:154
+#| msgid "_Version Information..."
+msgid "Show version information"
+msgstr "આવૃત્તિ જાણકારી ને બતાવો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:157
+msgid "Playback Control Options"
+msgstr "પ્લેબેક નિયંત્રણ વિકલ્પો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:158
+msgid "Play the next track, optionally restarting if the 'restart' value is set"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:159
+msgid "Play the previous track, optionally restarting if the 'restart value is set"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:160
+msgid "Automatically start playing any tracks enqueued on the command line"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:161
+#, fuzzy
+#| msgid "_Playback"
+msgid "Start playback"
+msgstr "વગાડો (_P)"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:162
+#, fuzzy
+#| msgid "_Playback"
+msgid "Pause playback"
+msgstr "વગાડો (_P)"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:163
+msgid "Toggle playback"
+msgstr "ટોગલ પ્લેબેક"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:164
+msgid "Completely stop playback"
+msgstr "સંપૂર્ણ રીતે પ્લેબેકને બંધ કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:166
+msgid ""
+"Enable or disable playback stopping after the currently playing track (value "
+"should be either 'true' or 'false')"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:167
+msgid "Set the playback volume (0-100)"
+msgstr "પ્લેબેક વોલ્યુમને સુયોજિત કરો (0-100)"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:168
+#, fuzzy
+msgid "Seek to a specific point (seconds, float)"
+msgstr "વર્તમાન ગીતમાં ચોક્કસ સ્થાને પહોંચો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:171
+msgid "Player Engine Query Options"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:172
+msgid "Current player state"
+msgstr "હાલની પ્લેયર સ્થિતિ"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:173
+#, fuzzy
+#| msgid "Last Played"
+msgid "Last player state"
+msgstr "છેલ્લે રમેલ"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:174
+msgid "Query whether the player can be paused"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:175
+msgid "Query whether the player can seek"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:176
+#, fuzzy
+#| msgid "Play Count"
+msgid "Player volume"
+msgstr "રમત ગણતરી"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:177
+#, fuzzy
+msgid "Player position in currently playing track"
+msgstr "વર્તમાન વાગી રહેલ ગીતનું પુનરાવર્તન કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:180
+msgid "Playing Track Metadata Query Options"
+msgstr ""
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:140
+#: ../src/Clients/Booter/Booter/Entry.cs:181
+msgid "URI"
+msgstr "URI"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:182
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "કલાકાર નામ"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:141
+#: ../src/Clients/Booter/Booter/Entry.cs:183
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "આલ્બમ શીર્ષક"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:142
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:92
+#: ../src/Clients/Booter/Booter/Entry.cs:184
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
+msgid "Track Title"
+msgstr "ટ્રેક શીર્ષક"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:185
+msgid "Duration"
+msgstr "સમયગાળો"
+
+#. Translators: noun
+#: ../src/Clients/Booter/Booter/Entry.cs:186
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:140
+#| msgid "Number"
+msgid "Track Number"
+msgstr "ટ્રેક નંબર"
+
+#. Translators: noun
+#: ../src/Clients/Booter/Booter/Entry.cs:187
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:149
+msgid "Track Count"
+msgstr "ટ્રેક ગણતરી"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:188
+#| msgid "Number"
+msgid "Disc Number"
+msgstr "ડિસ્ક નંબર"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:189
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
+msgid "Year"
+msgstr "વર્ષ"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:190
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:235
+msgid "Rating"
+msgstr "ક્રમાંકન"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:191
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:327
+msgid "Score"
+msgstr "સ્કૉર"
+
+#. Translators: noun
+#: ../src/Clients/Booter/Booter/Entry.cs:192
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
+msgid "Bit Rate"
+msgstr "બીટ દર"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:195
+msgid "User Interface Options"
+msgstr "વપરાશકર્તા ઇન્ટરફેસ વિકલ્પો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:196
+msgid "Present the user interface on the active workspace"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:197
+msgid "Hide the user interface"
+msgstr "વપરાશકર્તા ઇન્ટરફેસને છુપાડો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:198
+msgid "Do not present the user interface, regardless of any other options"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:201
+msgid "Debugging and Development Options"
+msgstr "ડિબગીંગ અને વિકાસ વિકલ્પો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:202
+msgid "Enable general debugging features"
+msgstr "સામાન્ય ડિબગીંગ ગુણધર્મોને સક્રિય કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:203
+msgid "Enable debugging output of SQL queries"
+msgstr "SQL ક્વેરીઓનાં ડિબગીંગ આઉટપુટને સક્રિય કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:204
+msgid "Enable debugging output of Mono.Addins"
+msgstr "Mono.Addins નાં ડિબગીંગ આઉટપુટને સક્રિય કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:205
+msgid "Specify an alternate database to use"
+msgstr "વાપરવા માટે વૈકલ્પિક ડેટાબેઝને સ્પષ્ટ કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:206
+msgid "Specify an alternate key, default is /apps/banshee-1/"
+msgstr "વૈકલ્પિક કીને સ્પષ્ટ કરો, મૂળભૂત /apps/banshee-1/ છે"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:207
+msgid ""
+"Optimize instance for running uninstalled; most notably, this will create an "
+"alternate Mono.Addins database in the working directory"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:209
+msgid "Disable DBus support completely"
+msgstr "સંપૂર્ણ રીતે DBus આધારને નિષ્ક્રિય કરો"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:211
+#, csharp-format
+msgid "Skip loading a custom gtkrc file ({0}) if it exists"
+msgstr ""
+
+#: ../src/Clients/Booter/Booter/Entry.cs:242
+#, csharp-format
+#| msgid "The provided login credentials are invalid"
+msgid "The following help arguments are invalid: {0}"
+msgstr "નીચેની મદદ દલીલો અયોગ્ય છે: {0}"
+
+#: ../src/Clients/Muinshee/Muinshee/AlbumDialog.cs:77
+#| msgid "Album"
+msgid "Play Album"
+msgstr "આલ્બમ ને ચાલુ કરો"
+
+#: ../src/Clients/Muinshee/Muinshee/BaseDialog.cs:83
+msgid "En_queue"
+msgstr ""
+
+#: ../src/Clients/Muinshee/Muinshee/BaseDialog.cs:86
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:196
+msgid "_Play"
+msgstr "રમો (_P)"
+
+#: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:47
+#| msgid "Play Count"
+msgid "Play _Song"
+msgstr "ગીતને વગાડો (_S)"
+
+#: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:48
+msgid "Add a song to the playlist"
+msgstr "પ્લેલીસ્ટ માં ગીતને ઉમેરો"
+
+#: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:52
+#| msgid "Album"
+msgid "Play _Album"
+msgstr "આલ્બમ ને ચાલુ કરો (_A)"
+
+#: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:53
+#, fuzzy
+#| msgid "Add _to Playlist"
+msgid "Add an album to the playlist"
+msgstr "પ્લેલીસ્ટમાં ઉમેરો (_t)"
+
+#: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
+#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
+msgid "Banshee Media Player"
+msgstr "Banshee મીડિયા પ્લેયર"
+
+#: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:252
+#, fuzzy, csharp-format
+#| msgid "{0} minute"
+#| msgid_plural "{0} minutes"
+msgid "{0} remaining"
+msgstr "{0} મિનિટ"
+
+#: ../src/Clients/Muinshee/Muinshee/SongDialog.cs:53
+#| msgid "Play Count"
+msgid "Play Song"
+msgstr "ગીત ને વગાડો"
+
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:92
+msgid "_Search:"
+msgstr "શોધો (_S):"
+
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
+#| msgid "Album Title"
+msgid "Artist, Album, or Title"
+msgstr "કલાકાર, આલ્બમ, અથવા શીર્ષક"
+
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:155
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:188
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "જાતિ"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:143
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:107
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:180
-msgid "Year"
-msgstr "વર્ષ"
+#. Translators: noun
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:157
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
+msgid "Comment"
+msgstr "ટિપ્પણી"
 
 #. Translators: this is a verb (command), not a noun (things)
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:164
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:178
 #, csharp-format
 msgid "Filter Results"
 msgstr "ગાળક પરિણામો"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:87
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:64
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:94
-msgid "Artist"
-msgstr "કલાકાર"
+#: ../src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs:39
+#: ../src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs:37
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:100
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:131
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:91
+msgid "Unknown Artist"
+msgstr "અજાણ્યો કલાકાર"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs:41
+#: ../src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs:40
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:101
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:130
+msgid "Unknown Album"
+msgstr "અજાણ્યું આલ્બમ"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:84
+#| msgid "<b>Track _Artist:</b>"
+msgid "Track Artist"
+msgstr "ટ્રેક કલાકાર"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:97
+#. Alias for %album_artist%
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:89
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:95
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:105
+msgid "Album Artist"
+msgstr "આલ્બમ કલાકાર"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:100
+#| msgid "Album Artist"
+msgid "Album Artist Initial"
+msgstr "આલ્બમ કલાકાર શરૂઆત"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:110
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:63
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:112
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:115
 msgid "Album"
 msgstr "આલ્બમ"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:102
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:172
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:115
 msgid "Title"
 msgstr "શીર્ષક"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:112
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:125
 msgid "Count"
 msgstr "ગણો"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:117
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:130
 msgid "Number"
 msgstr "અંક"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:122
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:135
 msgid "Count (unsorted)"
 msgstr "ગણો (ક્રમમાં નહિં)"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:127
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:140
 msgid "Number (unsorted)"
 msgstr "અંક (ક્રમમાં નહિં)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:181
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:48
+msgid "Unknown Title"
+msgstr "અજ્ઞાત શીર્ષક"
+
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:235
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:92
 msgid "Various Artists"
 msgstr "વિવિધ કલાકારો"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:223
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs:86
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:86
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:159
-msgid "Unknown Artist"
-msgstr "અજાણ્યો કલાકાર"
-
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:232
-#: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs:91
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:87
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:158
-msgid "Unknown Album"
-msgstr "અજાણ્યું આલ્બમ"
+#. TODO turn this into a PrimarySource-owned delegate?
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:522
+#| msgid "_Restart Song"
+msgid "_Restart Podcast"
+msgstr "પોડકાસ્ટને પુન:શરૂ કરો (_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:241
-msgid "Unknown Title"
-msgstr "અજ્ઞાત શીર્ષક"
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:523
+msgid "_Restart Video"
+msgstr "વિડીયોને પુન:શરૂ કરો (_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:250
-#, fuzzy
-msgid "Unknown Genre"
-msgstr "અજ્ઞાત મિનિટો"
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:524
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
+msgid "_Restart Song"
+msgstr "ગીતનું પુનરાવર્તન કરો (_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:446
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:138
-msgid "Podcast"
-msgstr "પોડકાસ્ટ"
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:525
+msgid "_Restart Item"
+msgstr "વસ્તુને પુન:શરૂ કરો (_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:448
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:68
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:539
 #, fuzzy
-msgid "Video"
-msgstr "દેખાવ (_V)"
+msgid "_Jump to Playing Podcast"
+msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:450
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:540
 #, fuzzy
-msgid "Song"
-msgstr "ગીતો"
-
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:451
-msgid "Item"
-msgstr "વસ્તુ"
+msgid "_Jump to Playing Video"
+msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
 
-#: ../src/Core/Banshee.Core/Banshee.Streaming/SaveTrackMetadataJob.cs:42
-#, csharp-format
-msgid "Saving tags for {0}"
-msgstr "{0} માટે ટેગો સંગ્રહી રહ્યા છીએ"
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:541
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
+#, fuzzy
+msgid "_Jump to Playing Song"
+msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/MoveOnInfoSaveJob.cs:44
-#, fuzzy, csharp-format
-msgid "Renaming {0}"
-msgstr "{0} નું નામ બદલો"
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:542
+#, fuzzy
+msgid "_Jump to Playing Item"
+msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:68
 #, fuzzy, csharp-format
@@ -442,169 +832,206 @@ msgstr "{0} પ્રમાણે ટોચના ટ્રેકો"
 msgid "All Artists ({0})"
 msgstr "બધા કલાકારો ({0})"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:162
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:137
 msgid "Scanning for media"
 msgstr "મીડિયા માટે સ્કેન કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:214
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:903
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1250
 msgid "Scanning..."
 msgstr "સ્કેન કરી રહ્યા છીએ..."
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:230
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:203
 #, csharp-format
 msgid "Scanning ({0} files)..."
 msgstr "({0} ફાઇલો) ને સ્કેન કરી રહ્યા છે..."
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:266
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:237
 msgid "Importing Media"
 msgstr "મીડિયાને આયાત કરી રહ્યા છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:273
-#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:115
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:244
+#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:119
 msgid "The import process is currently running. Would you like to stop it?"
 msgstr "આયાત પ્રક્રિયા વર્તમાનમાં ચાલી રહી છે. શું તમે તેને અટકાવવા ઈચ્છો છો?"
 
-#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:279
-#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:77
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:179
+#: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:250
+#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:81
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:183
 #, csharp-format
 msgid "Importing {0} of {1}"
 msgstr "{1} માંનુ {0} આયાત કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:226
+#: ../src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs:78
+#, fuzzy, csharp-format
+#| msgid "Converting {0} of {1}"
+msgid "Rescanning {0} of {1}"
+msgstr "{1} માંનુ {0} ને રૂપાંતર કરી રહ્યા છે"
+
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:230
 msgid "Upgrading your Banshee Database"
 msgstr "તમારા Banshee ડેટાબેઝને સુધારી રહ્યા છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:227
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:231
 msgid "Please wait while your old Banshee database is migrated to the new format."
 msgstr "મહેરબાની કરીને થોભો જ્યારે જૂનું Banshee ડેટાબેજ એ નવા બંધારણમાં રૂપાંતર થયેલ છે."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:902
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1247
 msgid "Refreshing Metadata"
 msgstr "મેટાડેટાને તાજુ કરી રહ્યા છે"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Directory"
-msgstr "ઘર ડિરેક્ટરી"
+#, fuzzy
+#| msgid "Local Folder"
+msgid "Home Folder"
+msgstr "સ્થાનિક ફોલ્ડર"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:52
+#: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
 msgid "Remove From Library"
 msgstr "લાઈબ્રેરીમાંથી દૂર કરો"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:41
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:56
-msgid "Music Library"
-msgstr "મ્યુઝીક લાઈબ્રેરી"
+#. Translators: {0} is the library name, eg 'Music Library' or 'Podcasts'
+#: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:65
+#, fuzzy, csharp-format
+#| msgid "{0} hour"
+#| msgid_plural "{0} hours"
+msgid "{0} Folder"
+msgstr "{0} કલાક"
+
+#. Catalog.GetString ("Music Library")
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:46
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/MusicGroupSource.cs:38
+msgid "Music"
+msgstr "સંગીત"
+
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:62
+msgid "File System Organization"
+msgstr "ફાઈલ સિસ્ટમ આયોજન"
+
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:65
+msgid "Folder hie_rarchy"
+msgstr "ફોલ્ડર વંશવેલો (_r)"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:56
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:71
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:68
+msgid "File _name"
+msgstr "ફાઈલ નામ (_n)"
+
+#. Misc section
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:70
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:63
+msgid "Miscellaneous"
+msgstr "વિવિધ જાતનું"
+
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "મનગમતાઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:57
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:61
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "તાજેતરનાં મનગમતાઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:62
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:66
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
 msgid "Recently Added"
 msgstr "તાજેતરમાં ઉમેરાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:67
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "ગીતો એ છેલ્લા અઠવાડિયામાં આયાત થયેલ છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:71
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "નહિં સંભળાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:72
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:78
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "નકારાયેલ મનગમતાઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:79
-msgid "Favorites not played in over two weeks"
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
+msgid "Favorites not played in over two months"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:83
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "ઓછામાં ઓછા મનગમતાઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:84
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "મનગમતાનુ 700 MB"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:89
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:94
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "મનગમતાની 80 મિનિટો"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:95
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:100
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:101
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:54
+#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:56
 msgid "Importing Songs"
 msgstr "ગીતો આયાત કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:113
 #, csharp-format
 msgid "Importing From {0}"
 msgstr "{0} માંથી આયાત કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:41
-msgid "Video Library"
-msgstr "વિડિઓ લાઈબ્રેરી"
+#. Catalog.GetString ("Video Library")
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:43
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs:38
+msgid "Videos"
+msgstr "વિડિઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:54
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:64
 msgid "Produced By"
 msgstr "દ્દારા ઉત્પન્ન થયેલ છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:72
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:86
 msgid "Videos rated four and five stars"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:76
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:90
 #, fuzzy
 msgid "Unwatched"
 msgstr "નહિં સંભળાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:77
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:91
 msgid "Videos that haven't been played yet"
 msgstr "વિડિઓ કે જે હજુ વગાડાતો નથી"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:92
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:98
 msgid "Default player engine"
 msgstr "મૂળભૂત પ્લેયર એંજીન"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:99
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:105
 msgid ""
 "No player engines were found. Please ensure Banshee has been cleanly "
 "installed."
@@ -612,86 +1039,135 @@ msgstr ""
 "કોઈ પ્લેયર એંજીનો મળ્યા નહિં. મહેરબાની કરીને ખાતરી કરો કે Banshee સ્વચ્છ રીતે સ્થાપિત "
 "થયેલ છે."
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:279
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:321
 msgid "Problem with Player Engine"
 msgstr "પ્લેયર એંજીન સાથે સમસ્યા"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:129
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:134
 #, csharp-format
 msgid "Converting {0} of {1}"
 msgstr "{1} માંનુ {0} ને રૂપાંતર કરી રહ્યા છે"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:129
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:134
 msgid "Initializing"
 msgstr "આરંભ કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:130
+#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:137
 #, fuzzy
 msgid ""
 "Files are currently being converted to another format. Would you like to "
 "stop this?"
 msgstr "ફાઈલો વર્તમાનમાં અન્ય ઓડિયો બંધારણમાં રૂપાંતરિત થઈ ગયેલ છે. શું તમે આ અટકાવવા ઈચ્છો છો?"
 
-#: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:237
-msgid "Cannot Convert File"
-msgstr "ફાઈલને રૂપાંતરિત કરી શકાતી નથી"
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs:51
+#| msgid "Write _metadata to files"
+msgid "Saving Metadata to File"
+msgstr "ફાઇલમાં મેટાડેટાનો સંગ્રહ કરી રહ્યા છે"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:48
+msgid "Write _metadata to files"
+msgstr "મેટાડેટાને ફાઈલોમાં લખો (_m)"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:49
+msgid ""
+"Enable this option to save tags and other metadata inside supported audio "
+"files."
+msgstr ""
+"ટેગો સંગ્રહવા માટે અને આધારભૂત ઓડિયો ફાઈલોની અંદર અન્ય મેટાડેટા સંગ્રહવા માટે આ વિકલ્પ "
+"સક્રિય કરો."
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:54
+msgid "_Update file and folder names"
+msgstr "ફાઇલ અને ફોલ્ડર નામો ને સુધારો (_U)"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:55
+msgid ""
+"Enabling this option ensures that files and folders are renamed according to "
+"the metadata."
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:129
+#, fuzzy
+#| msgid "Write _metadata to files"
+msgid "Write _ratings and play counts to files"
+msgstr "મેટાડેટાને ફાઈલોમાં લખો (_m)"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:130
+#, fuzzy
+#| msgid ""
+#| "Enable this option to save tags and other metadata inside supported audio "
+#| "files."
+msgid ""
+"Enable this option to save rating and play count metadata inside supported "
+"audio files whenever the rating is changed."
+msgstr ""
+"ટેગો સંગ્રહવા માટે અને આધારભૂત ઓડિયો ફાઈલોની અંદર અન્ય મેટાડેટા સંગ્રહવા માટે આ વિકલ્પ "
+"સક્રિય કરો."
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:131
+#, fuzzy
+#| msgid "_Import format"
+msgid "Import _ratings"
+msgstr "બંધારણને આયાત કરો (_I)"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:132
+#| msgid "Import a playlist"
+msgid "Import play _counts"
+msgstr ""
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:52
 msgid "There is no available network connection"
 msgstr "ત્યાં કોઈ નેટવર્ક જોડાણ ઉપલબ્ધ નથી"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:78
-msgid "Cannot connect to NetworkManager"
-msgstr "NetworkManager સાથે જોડાઈ શકતા નથી"
+#| msgid "Cannot connect to NetworkManager"
+msgid "Cannot connect to NetworkManager or Wicd"
+msgstr "NetworkManager અથવા Wicd માં જોડાઇ શકતા નથી"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:79
 msgid "An available, working network connection will be assumed"
 msgstr "ઉપલબ્ધ, કામ કરતું નેટવર્ક જોડાણ ધારવામાં આવશે"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:141
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:157
 msgid "_Disable features requiring Internet access"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:142
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:158
 msgid ""
 "Some features require a broadband Internet connection such as Last.fm or "
 "cover art fetching"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:143
-#, fuzzy, csharp-format
-msgid "Unable to import track: {0}"
-msgstr "{0} માંથી ટ્રેક આયાત કરી શકતા નથી"
-
-#: ../src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:177
-msgid "Importing from Amarok failed"
-msgstr "Amarok નિષ્ફળ થયેલ માંથી આયાત કરી રહ્યા છે"
-
-#: ../src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:188
-msgid "Amarok"
-msgstr "Amarok"
+#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:219
+msgid "The track's rating was set differently on the device and in Banshee"
+msgstr ""
 
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:59
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:303
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:314
 msgid "Playlist"
 msgstr "વગાડવા માટેની યાદી"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:122
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:134
 msgid "Remove From Playlist"
 msgstr "પ્લેલીસ્ટ માંથી દૂર કરો"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:123
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:135
 msgid "Delete Playlist"
 msgstr "પ્લેલીસ્ટ કાઢી નાંખો"
 
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:387
-#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:393
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:84
-#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:447
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:390
+#: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:396
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:88
+#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:464
 #: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs:211
 msgid "New Playlist"
 msgstr "નવું પ્લેલીસ્ટ"
 
+#: ../src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs:43
+#| msgid "Windows Media Audio"
+msgid "Windows Media ASX"
+msgstr "Windows Media ASX"
+
 #: ../src/Core/Banshee.Services/Banshee.Playlists.Formats/AsxPlaylistFormat.cs:46
 msgid "Windows Media ASX (*.asx)"
 msgstr "Windows Media ASX (*.asx)"
@@ -704,61 +1180,52 @@ msgstr "MPEG Version 3.0 Extended (*.m3u)"
 msgid "Shoutcast Playlist version 2 (*.pls)"
 msgstr "Shoutcast Playlist version 2 (*.pls)"
 
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:52
+#: ../src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs:44
+#| msgid "Shoutcast Playlist version 2 (*.pls)"
+msgid "XML Shareable Playlist Format version 1 (*.xspf)"
+msgstr "XML Shareable Playlist Format version 1 (*.xspf)"
+
+#. Pages (tabs)
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:49
 msgid "General"
 msgstr "સામાન્ય"
 
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:61
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:50
 #, fuzzy
-msgid "Co_py files to media folders when importing"
-msgstr "જ્યારે આયાત કરી રહ્યા હોય ત્યારે ફાઈલોની મ્યુઝીક ફોલ્ડરમાં નકલ કરો (_p)"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:64
-msgid "Write _metadata to files"
-msgstr "મેટાડેટાને ફાઈલોમાં લખો (_m)"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:65
-msgid ""
-"Enable this option to save tags and other metadata inside supported audio "
-"files."
-msgstr ""
-"ટેગો સંગ્રહવા માટે અને આધારભૂત ઓડિયો ફાઈલોની અંદર અન્ય મેટાડેટા સંગ્રહવા માટે આ વિકલ્પ "
-"સક્રિય કરો."
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:68
-msgid "_Update file and folder names"
-msgstr "ફાઇલ અને ફોલ્ડર નામો ને સુધારો (_U)"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:69
-msgid ""
-"Enabling this option ensures that files and folders are renamed according to "
-"the metadata."
-msgstr ""
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:73
-msgid "File System Organization"
-msgstr "ફાઈલ સિસ્ટમ આયોજન"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:76
-msgid "Folder hie_rarchy"
-msgstr "ફોલ્ડર વંશવેલો (_r)"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:79
-msgid "File _name"
-msgstr "ફાઈલ નામ (_n)"
-
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:81
-msgid "Miscellaneous"
-msgstr "વિવિધ જાતનું"
+#| msgid "Source Properties"
+msgid "Source Specific"
+msgstr "સ્રોત ગુણધર્મો"
 
-#: ../src/Core/Banshee.Services/Banshee.Preferences/Page.cs:83
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:51
 msgid "Extensions"
 msgstr "એક્સટેન્શનો"
 
+#. General policies
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:54
+msgid "File Policies"
+msgstr "ફાઈલ પોલિસીઓ"
+
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:57
+msgid "Co_py files to media folders when importing"
+msgstr "જ્યારે આયાત કરી રહ્યા હોય ત્યારે મીડિયા ફોલ્ડરોમાં ફાઇલોની નકલ કરો (_p)"
+
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:59
 msgid "Random"
 msgstr "રેન્ડમ"
 
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:64
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:97
+msgid "Artist"
+msgstr "કલાકાર"
+
+#. Translators: noun
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:659
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:88
+msgid "Name"
+msgstr "ર્તાનામ"
+
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:69
 msgid "Highest Rating"
 msgstr "ઊચ્ચ ક્રમાંકન"
@@ -768,473 +1235,469 @@ msgid "Lowest Rating"
 msgstr "નિમ્ન ક્રમાંકન"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:72
+#| msgid "Highest"
+msgid "Highest Score"
+msgstr "ઉચ્ચતમ સ્કૉર"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:73
+#| msgid "Least Favorite"
+msgid "Lowest Score"
+msgstr "ઓછામાં ઓછો સ્કૉર"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:75
 msgid "Most Often Played"
 msgstr "વધુ વાર રમાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:73
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:76
 msgid "Least Often Played"
 msgstr "ઓછી વાર રમાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:75
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:58
 msgid "Most Recently Played"
 msgstr "એકદમ છેલ્લે રમાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:76
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:79
 msgid "Least Recently Played"
 msgstr "ઓછા સમયે રમાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:81
 msgid "Most Recently Added"
 msgstr "એકદમ છેલ્લે ઉમેરાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:79
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:82
 msgid "Least Recently Added"
 msgstr "ઓછા સમયે ઉમેરાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:83
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:86
 msgid "items"
 msgstr "વસ્તુઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:84
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:87
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs:60
 msgid "minutes"
 msgstr "મિનિટો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:85
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:88
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs:61
 msgid "hours"
 msgstr "કલાકો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:86
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:89
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:63
 msgid "MB"
 msgstr "MB"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:90
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:64
 msgid "GB"
 msgstr "GB"
 
-#. Translators: These are unique search aliases for "artist".  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:96
+#. Translators: These are unique search aliases for "artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:99
 msgid "artist"
 msgstr "કલાકાર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:96
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:99
 msgid "by"
 msgstr "દ્વારા"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:96
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:99
 msgid "artists"
 msgstr "કલાકારો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:102
-msgid "Album Artist"
-msgstr "આલ્બમ કલાકાર"
-
-#. Translators: These are unique search aliases for "album".  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:104
+#. Translators: These are unique search aliases for "album artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:107
 msgid "albumartist"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:104
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:107
 #, fuzzy
 msgid "compilationartist"
 msgstr "કલાકાર સરખાવીને (_r)"
 
-#. Translators: These are unique search aliases for "album".  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:114
+#. Translators: These are unique search aliases for "album". You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "album"
 msgstr "આલ્બમ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "on"
 msgstr "પર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "from"
 msgstr "તરફથી"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:123
 msgid "Disc"
 msgstr "ડિસ્ક"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:122
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "disc"
 msgstr "ડિસ્ક"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:122
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "cd"
 msgstr "cd"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:122
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "discnum"
 msgstr "discnum"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:128
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:131
 msgid "Disc Count"
 msgstr "ડિસ્ક ગણતરી"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:130
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:133
 msgid "discs"
 msgstr "ડિસ્કો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:130
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:133
 msgid "cds"
-msgstr "સેકન્ડો"
-
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:137
-msgid "Track"
-msgstr "ટ્રેક"
+msgstr "cds"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:139
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:142
 msgid "track"
 msgstr "ટ્રેક"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:139
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:142
 msgid "trackno"
-msgstr "ટ્રેક"
+msgstr "ટ્રેક નંબર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:139
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:142
 msgid "tracknum"
-msgstr "ટ્રેક"
+msgstr "ટ્રેક નંબર"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:146
-#, fuzzy
-msgid "Track Count"
-msgstr "રમત ગણતરી"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:148
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:151
 msgid "tracks"
-msgstr "ટ્રેક"
+msgstr "ટ્રેકો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:148
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:151
 msgid "trackcount"
-msgstr "<b>ટ્રેક ગણતરી (_c):</b>"
-
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:155
-msgid "BPM"
-msgstr "BPM"
+msgstr "ટ્રેક ગણતરી"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:157
+msgid "Beats per Minute"
+msgstr ""
+
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:159
 msgid "bpm"
 msgstr "bpm"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:164
-#, fuzzy
-msgid "Bit Rate"
-msgstr "બીટદર"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:168
 msgid "bitrate"
 msgstr "બીટદર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:168
 msgid "kbs"
 msgstr "kbs"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:168
 msgid "kps"
 msgstr "kps"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "title"
 msgstr "શીર્ષક"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "titled"
-msgstr "શીર્ષક"
+msgstr "શીર્ષક થયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "name"
-msgstr "વપરાશકર્તાનામ"
+msgstr "ર્તાનામ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "named"
-msgstr "સક્રિયકૃત"
+msgstr "નામ થયેલ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:184
 msgid "year"
 msgstr "વર્ષ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:184
 msgid "released"
 msgstr "પ્રકાશિત"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:184
 msgid "yr"
 msgstr "yr"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:192
 #, fuzzy
 msgid "genre"
 msgstr "જાતિ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:195
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
 #, fuzzy
 msgid "Composer"
 msgstr "બંધ કરો"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:199
 msgid "composer"
 msgstr "રચનાર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:202
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
 #, fuzzy
 msgid "Conductor"
 msgstr "ફાળો આપનારાઓ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:206
 msgid "conductor"
 msgstr "કન્ડક્ટર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:209
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
 msgid "Grouping"
 msgstr "સમૂહીકરણ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:213
 msgid "grouping"
 msgstr "સમૂહીકરણ"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:217
-msgid "Comment"
-msgstr "ટિપ્પણી"
-
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
-#, fuzzy
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:221
 msgid "comment"
 msgstr "ટિપ્પણી"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:224
-msgid "Rating"
-msgstr "ક્રમાંકન"
+#. Translators: noun
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:227
+msgid "License"
+msgstr "લાઇસન્સ"
+
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:229
+#| msgid "listens"
+msgid "license"
+msgstr "લાઇસન્સ"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:229
+#| msgid "listens"
+msgid "licensed"
+msgstr "લાઇસન્સ થયેલ"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:229
+msgid "under"
+msgstr ""
 
 #. , typeof(NullQueryValue)},
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:226
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:237
 #, fuzzy
 msgid "rating"
 msgstr "ક્રમાંકન"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:226
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:237
 #, fuzzy
 msgid "stars"
 msgstr "થી શરૂ થાય"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:232
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:243
 msgid "Play Count"
 msgstr "રમત ગણતરી"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:234
-#, fuzzy
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:245
 msgid "plays"
 msgstr "વગાડે છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:234
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:245
 msgid "playcount"
 msgstr "રમત ગણતરી"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:234
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:245
 msgid "listens"
 msgstr "સાંભળે છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:240
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:251
 #, fuzzy
 msgid "Skip Count"
 msgstr "ગણો"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:242
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:253
 msgid "skips"
 msgstr "છોડી દે છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:242
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:253
 msgid "skipcount"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:248
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:259
 msgid "File Size"
-msgstr "ફાઈલ નામ"
+msgstr "ફાઈલનું માપ"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:250
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:261
 msgid "size"
 msgstr "માપ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:250
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:261
 msgid "filesize"
 msgstr "ફાઇલનું માપ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:256
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:267
 msgid "File Location"
 msgstr "ફાઇલનું સ્થાન"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:258
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "uri"
 msgstr "uri"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:258
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "path"
 msgstr "પાથ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:258
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "file"
-msgstr "શીર્ષક"
+msgstr "ફાઇલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:258
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "location"
 msgstr "સ્થાન"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:264
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:275
 msgid "Time"
 msgstr "સમય"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:266
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:277
 msgid "duration"
 msgstr "સમયગાળો"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:266
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:277
 msgid "length"
 msgstr "લંબાઇ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:266
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:277
 msgid "time"
 msgstr "સમય"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:272
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:283
 msgid "Mime Type"
 msgstr "માઇમ પ્રકાર"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:274
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "type"
 msgstr "પ્રકાર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:274
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "mimetype"
 msgstr "માઇમ પ્રકાર"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:274
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "format"
 msgstr "બંધારણ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:274
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 #, fuzzy
 msgid "ext"
 msgstr "આગળ (_N)"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:280
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:291
 msgid "Last Played"
 msgstr "છેલ્લે રમેલ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:282
-#, fuzzy
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 msgid "lastplayed"
-msgstr "છેલ્લે રમેલ"
+msgstr "છેલ્લે વગાડેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:282
-#, fuzzy
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 msgid "played"
-msgstr "ક્યારેય નહિં વગાડેલ"
+msgstr " નહિં વગાડેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:282
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 #, fuzzy
 msgid "playedon"
 msgstr "ક્યારેય નહિં વગાડેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:288
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:299
 msgid "Last Skipped"
 msgstr "છેલ્લે છોડેલ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:290
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "lastskipped"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:290
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "skipped"
 msgstr "છોડેલ છે"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:290
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "skippedon"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:296
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:307
 msgid "Date Added"
 msgstr "તારીખે ઉમેરાયેલ"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:298
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "added"
 msgstr "ઉમેરાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:298
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "imported"
 msgstr "આયાત થયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:298
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "addedon"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:298
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "dateadded"
 msgstr "તારીખે ઉમેરાયેલ"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:298
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "importedon"
 msgstr "આયાત કરવાનું"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:320
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:66
 msgid "Smart Playlist"
 msgstr "સ્માર્ટ પ્લેલીસ્ટ"
 
-#: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:245
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:320
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:343
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:55
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:299
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:329
+msgid "score"
+msgstr "સ્કૉર"
+
+#. Translators: noun
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:346
+msgid "BPM"
+msgstr "BPM"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:347
+#| msgid "skips"
+msgid "Skips"
+msgstr "છોડી દે છે"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:348
+msgid "Plays"
+msgstr "વગાડે છે"
+
+#: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:309
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:200
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:376
 msgid "Unknown"
 msgstr "અજ્ઞાત"
 
@@ -1252,81 +1715,117 @@ msgstr "મહેરબાની કરીને આ ભૂલ સાથે ખ
 msgid "Edit Smart Playlist"
 msgstr "સ્માર્ટ પ્લેલીસ્ટમાં ફેરફાર કરો"
 
-#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:225
+#: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:229
 msgid "Delete Smart Playlist"
 msgstr "સ્માર્ટ પ્લેલીસ્ટ કાઢી નાંખો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs:67
+#: ../src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs:147
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:157
 #, csharp-format
 msgid "All Genres ({0})"
 msgstr ""
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:53
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:69
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:64
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:89
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:139
 #, csharp-format
 msgid "{0} day"
 msgid_plural "{0} days"
 msgstr[0] "{0} દિવસ"
 msgstr[1] "{0} દિવસો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:57
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:74
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:68
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:94
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:141
 #, csharp-format
 msgid "{0} hour"
 msgid_plural "{0} hours"
 msgstr[0] "{0} કલાક"
 msgstr[1] "{0} કલાકો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:61
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:78
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:72
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:98
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:143
 #, csharp-format
 msgid "{0} minute"
 msgid_plural "{0} minutes"
 msgstr[0] "{0} મિનિટ"
 msgstr[1] "{0} મિનિટો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:80
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:100
+#: ../src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs:145
 #, csharp-format
 msgid "{0} second"
 msgid_plural "{0} seconds"
 msgstr[0] "{0} સેકન્ડ"
 msgstr[1] "{0} સેકન્ડો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:56
+#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:50
 msgid "Close Error Report"
 msgstr "ક્ષતિ અહેવાલ બંધ કરો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:84
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:43
+#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:82
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
 msgid "Error"
 msgstr "ક્ષતિ"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:85
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:34
+#: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:83
 msgid "Details"
 msgstr "વિગતો"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:138
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:164
 msgid "Errors"
 msgstr "ક્ષતિઓ"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:615
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:217
+#, fuzzy
+#| msgid "Smart Playlist"
+msgid "Sort Playlists by"
+msgstr "સ્માર્ટ પ્લેલીસ્ટ"
+
+#. Translators: this is a noun, referring to the harddisk
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:226
+msgid "Drive"
+msgstr "ડ્રાઇવ"
+
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:687
 #, fuzzy, csharp-format
 msgid "Adding {0} of {1} to {2}"
 msgstr "{1} નું {0} લાવી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:632
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:706
 #, fuzzy, csharp-format
 msgid "Deleting {0} of {1} From {2}"
 msgstr "{1} માંથી {0} ને દૂર કરી રહ્યા છીએ"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:592
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:664
+msgid "Size Ascending"
+msgstr "માપ ચડતા ક્રમમાં"
+
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:669
+msgid "Size Descending"
+msgstr "માપ ઊતરતા ક્રમમાં"
+
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:758
 #, csharp-format
 msgid "{0} item"
 msgid_plural "{0} items"
 msgstr[0] "{0} વસ્તુ"
 msgstr[1] "{0} વસ્તુઓ"
 
+#: ../src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:82
+#: ../src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:91
+msgid "Error opening stream"
+msgstr "સ્ટ્રીમને ખોલવામાં ભૂલ"
+
+#: ../src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:83
+msgid "Could not open stream or playlist"
+msgstr "સ્ટ્રીમ અથવા પ્લેલીસ્ટને ખોલી શકાયુ નહિં"
+
+#: ../src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:92
+msgid "Problem parsing playlist"
+msgstr "પ્લેલીસ્ટને પદચ્છેદન કરવામાં સમસ્યા"
+
 #: ../src/Core/Banshee.Services/Banshee.Web/Browser.cs:61
 msgid "Could not launch URL"
 msgstr "URL લાવી શક્યા નહિં"
@@ -1347,7 +1846,7 @@ msgid "Version:"
 msgstr "આવૃત્તિ:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs:72
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:98
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:97
 msgid "Authors:"
 msgstr "લેખકો:"
 
@@ -1359,14 +1858,70 @@ msgstr ""
 msgid "Extension Dependencies:"
 msgstr "એક્સટેન્શન આધારો:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:182
 msgid "Disable"
 msgstr "નિષ્ક્રિય"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:184
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:183
 msgid "Enable"
 msgstr "સક્રિય"
 
+#. Translators: this is {disc number} of {disc count}
+#. Translators: this is {track number} of {track count}
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs:40
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs:40
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:172
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs:148
+#, csharp-format
+msgid "{0} of {1}"
+msgstr "{1} માંનુ {0}"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:124
+#| msgid "Track"
+msgid "Track #"
+msgstr "ટ્રેક #"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:125
+#, fuzzy
+msgid "Track & Count"
+msgstr "રમત ગણતરી"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:129
+#| msgid "Disc"
+msgid "Disc #"
+msgstr "ડિસ્ક #"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:130
+#, fuzzy
+#| msgid "Disc Count"
+msgid "Disc & Count"
+msgstr "ડિસ્ક ગણતરી"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:133
+#, csharp-format
+#| msgid "{0} plays"
+msgid "{0} kbps"
+msgstr "{0} kbps"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:119
+msgid "Make the context pane larger or smaller"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:123
+msgid "Hide context pane"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:144
+#, fuzzy
+#| msgid "Waiting for downloads to terminate..."
+msgid "Waiting for playback to begin..."
+msgstr "ડાઉનલોડને બંધ થવા માટે રાહ જોઈ રહ્યા છીએ..."
+
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:150
+#| msgid "Contacting..."
+msgid "Loading..."
+msgstr "લોડ કરી રહ્યા છે..."
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs:52
 msgid "Equalizer"
 msgstr "ઈક્વીલાઈઝર"
@@ -1375,35 +1930,56 @@ msgstr "ઈક્વીલાઈઝર"
 msgid "Enabled"
 msgstr "સક્રિયકૃત"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:49
+#: ../src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs:158
+#, fuzzy
+#| msgid "New Playlist"
+msgid "New Preset"
+msgstr "નવું પ્લેલીસ્ટ"
+
+#. Translators: this is the window title when a track is playing
+#. {0} is the track title, {1} is the artist name
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:194
+#, fuzzy, csharp-format
+#| msgid "{0} - {1}"
+msgid "{0} by {1}"
+msgstr "{0} - {1}"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:54
 msgid "Primary Development"
 msgstr "પ્રાથમિક વિકાસ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:57
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:62
 msgid "Contributors"
 msgstr "ફાળો આપનારાઓ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:96
 msgid "Extraordinary Multimedia Management and Playback"
 msgstr "મ્યુઝીક વ્યવસ્થાપન અને જીનોમ માટે પ્લેબેક"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:91
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:98
+#, fuzzy, csharp-format
+#| msgid ""
+#| "Copyright © 2005–2008 Novell, Inc.\n"
+#| "Copyright © 2005 Aaron Bockover"
 msgid ""
-"Copyright © 2005–2008 Novell, Inc.\n"
+"Copyright © 2005–{0} Novell, Inc.\n"
+"Copyright © 2005–{0} Others\n"
 "Copyright © 2005 Aaron Bockover"
 msgstr ""
 "Copyright © 2005–2008 Novell, Inc.\n"
 "Copyright © 2005 Aaron Bockover"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:96
-msgid "Banshee Wiki"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:104
+#, fuzzy
+#| msgid "Banshee Wiki"
+msgid "Banshee Website"
 msgstr "Banshee વીકી"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:45
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:49
 msgid "Important tasks are running"
 msgstr "મહત્વની ક્રિયાઓ ચાલી રહી છે"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:47
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:51
 msgid ""
 "Closing Banshee now will cancel any currently running tasks. They cannot be "
 "resumed automatically the next time Banshee is run."
@@ -1411,14 +1987,42 @@ msgstr ""
 "Banshee ને બંધ કરવાનું હવે કોઈપણ વર્તમાનમાં ચાલી રહેલ ક્રિયાઓ રદ કરી નાંખશે. તેઓ આગળના "
 "સમયે જ્યારે Banshee ચાલે ત્યારે આપોઆપ ફરીથી ચાલુ કરી શકાશે."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:54
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:58
 msgid "Quit anyway"
 msgstr "ગમે તે રીતે બંધ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:55
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:59
 msgid "Continue running"
 msgstr "ચલાવવાનું ચાલુ રાખો"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:69
+#, fuzzy
+#| msgid "Banshee Media Player"
+msgid "Make Banshee the default media player?"
+msgstr "Banshee મીડિયા પ્લેયર"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:70
+msgid ""
+"Currently another program is configured as the default media player.  Would "
+"you prefer Banshee to be the default?"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:72
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:427
+#, csharp-format
+msgid "Do not ask me this again"
+msgstr "મને ફરીથી આવું પૂછશો નહિં"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:86
+msgid "Make Banshee the Default"
+msgstr ""
+
+#. Translators: verb
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+#| msgid "Import"
+msgid "I_mport"
+msgstr "આયાત (_m)"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs:39
 msgid "Select album cover image"
 msgstr "આલ્બમ કવર ઈમેજ પસંદ કરો"
@@ -1440,69 +2044,10 @@ msgid "Browse..."
 msgstr "બ્રાઉઝ કરો..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs:98
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:48
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
 msgid "Open Location"
 msgstr "જગ્યા ખોલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:247
-msgid "Automatically set all track numbers in increasing order"
-msgstr "બધા ટ્રેક નંબરો આપોઆપ વધતા ક્રમમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:248
-msgid "Set all track counts to this value"
-msgstr "બધી ટ્રેક ગણતરીઓ આ કિંમતમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:249
-msgid "Set all album artists to this value"
-msgstr "આ કિંમતમાં બધા આલ્બમ કલાકારોને સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:250
-msgid "Set all track artists to this value"
-msgstr "આ કિંમતમાં બધા ટ્રેક કલાકારોને સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:251
-msgid "Set all albums to this value"
-msgstr "બધા આલ્બમોને આ કિંમતમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:252
-msgid "Set all disc numbers to this value"
-msgstr "આ કિંમતમાં બધા ડિસ્ક નંબરોને સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:253
-msgid "Set all genres to this value"
-msgstr "બધી જાતિઓને આ કિંમતમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:254
-msgid "Set all years to this value"
-msgstr "બધા વર્ષોને આ કિંમતમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:255
-msgid ""
-"Apply the values of this track set for the Artist, Album Title, Genre, Track "
-"count, Year, and Rating fields to the rest of the selected tracks in this "
-"editor."
-msgstr ""
-"આ ટ્રેક સમૂહની કલાકાર, આલ્બમ શીર્ષક, જાતિ, ટ્રેક ગણતરી, વર્ષ, અને ક્રમ ક્ષેત્રો માટેની "
-"કિંમતો આ ટ્રેક સંપાદકમાં બાકીના પસંદિત ટ્રેકોને લાગુ કરો."
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:256
-msgid "Set all ratings to this value"
-msgstr "બધા ક્રમોને આ કિંમતમાં સુયોજીત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:318
-msgid "Never played"
-msgstr "ક્યારેય નહિં વગાડેલ"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:332
-#, fuzzy, csharp-format
-msgid "Editing item {0} of {1}"
-msgstr "{1} માંનુ ગીત {0} બદલી રહ્યા છીએ"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs:333
-#, csharp-format
-msgid "Editing {0}"
-msgstr "{0} ફેરફાર કરી રહ્યા છીએ"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:50
 msgid "_Media"
 msgstr "મીડિયા (_M)"
@@ -1516,7 +2061,9 @@ msgid "Import media from a variety of sources"
 msgstr "વિવિધ સ્રોતોમાંથી મીડિયા આયાત કરો"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:57
-msgid "Import Playlist..."
+#, fuzzy
+#| msgid "Import Playlist..."
+msgid "Import _Playlist..."
 msgstr "પ્લેલીસ્ટ ને આયાત કરો..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:58
@@ -1524,124 +2071,112 @@ msgid "Import a playlist"
 msgstr "પ્લેલીસ્ટ ને આયાત કરો"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:61
+#| msgid "Music Library"
+msgid "Rescan Music Library"
+msgstr "મ્યુઝીક લાઈબ્રેરી ને પુન:સ્કેન કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:62
+msgid "Rescan the Music Library folder"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:67
 msgid "Open _Location..."
 msgstr "સ્થાન ખોલો (_L)..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:68
 msgid "Open a remote location for playback"
 msgstr "વગાડવા માટે દૂરસ્થ સ્થાન ખોલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:65
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:71
 msgid "_Quit"
 msgstr "બહાર નીકળો (_Q)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:72
 msgid "Quit Banshee"
 msgstr "Banshee બંધ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:70
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:76
 msgid "_Edit"
 msgstr "ફેરફાર (_E)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:73
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:79
 msgid "_Preferences"
 msgstr "પસંદગીઓ (_P)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:74
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:80
 msgid "Modify your personal preferences"
 msgstr "તમારી વ્યક્તિગત પસંદગીઓને બદલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:77
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:83
 msgid "Manage _Extensions"
 msgstr "એક્સટેન્શનોને સંચાલિત કરો (_E)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:78
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:84
 msgid "Manage extensions to add new features to Banshee"
 msgstr "Banshee નાં નવા ગુણધર્મોને ઉમેરવા માટે એક્સટેન્શનોને સંચાલિત કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:82
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:88
 msgid "_Tools"
 msgstr "સાધનો (_T)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:86
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:92
 msgid "_Help"
 msgstr "મદદ (_H)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:95
 msgid "_Web Resources"
 msgstr "વેબ સ્રોતો (_W)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:98
 msgid "Banshee _User Guide (Wiki)"
 msgstr "Banshee વપરાશકર્તા માર્ગદર્શન (Wiki) (_U)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:99
 msgid "Learn about how to use Banshee"
 msgstr "Banshee કેવી રીતે વાપરવું તેના વિશે શીખો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:98
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:104
 msgid "Advanced Collection Searching"
 msgstr "ઉન્નત સંગ્રહ શોધ કરી રહ્યા છે"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:99
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:105
 msgid "Learn advanced ways to search your media collection"
 msgstr ""
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:104
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:110
 msgid "Banshee _Home Page"
 msgstr "Banshee ઘર પાનું (_H)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:105
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:111
 msgid "Visit the Banshee Home Page"
 msgstr "Banshee ઘર પાનાંની મુલાકાત લો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:110
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:116
 msgid "_Get Involved"
 msgstr "સંડોવાયેલ રહો (_G)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:111
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:117
 msgid "Become a contributor to Banshee"
 msgstr "Banshee ને ફાળો આપનાર બનો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:116
-msgid "_Version Information..."
-msgstr "આવૃત્તિ જાણકારી (_V)..."
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:122
+#| msgid "_Version Information..."
+msgid "_Version Information"
+msgstr "આવૃત્તિ જાણકારી (_V)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:117
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:123
 msgid "View detailed version and configuration information"
 msgstr "વિગતવાર આવૃત્તિ અને રૂપરેખાંકન જાણકારી જુઓ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:156
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:163
-msgid "Error opening stream"
-msgstr "સ્ટ્રીમને ખોલવામાં ભૂલ"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:157
-msgid "Could not open stream or playlist"
-msgstr "સ્ટ્રીમ અથવા પ્લેલીસ્ટને ખોલી શકાયુ નહિં"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:164
-msgid "Problem parsing playlist"
-msgstr "પ્લેલીસ્ટને પદચ્છેદન કરવામાં સમસ્યા"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:172
+#. Prompt user for location of the playlist.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:160
 msgid "Import Playlist"
 msgstr "પ્લેલીસ્ટ ને આયાત કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:179
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:161
 msgid "Playlists"
 msgstr "પ્લેલીસ્ટો"
 
-#. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:186
-msgid "Import"
-msgstr "આયાત"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:66
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:195
-msgid "_Play"
-msgstr "રમો (_P)"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
 msgid "Play or pause the current item"
 msgstr "હાલની વસ્તુને વગાડો અથવા અટકાવો"
@@ -1651,7 +2186,6 @@ msgid "_Next"
 msgstr "આગળ (_N)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:71
-#, fuzzy
 msgid "Play the next item"
 msgstr "આગળનું ગીત વગાડો"
 
@@ -1660,7 +2194,6 @@ msgid "Pre_vious"
 msgstr "પહેલાંનુ (_v)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:75
-#, fuzzy
 msgid "Play the previous item"
 msgstr "પહેલાંનુ ગીત વગાડો"
 
@@ -1674,29 +2207,15 @@ msgstr "સુધી પહોંચો (_T)..."
 msgid "Seek to a specific location in current item"
 msgstr "વર્તમાન ગીતમાં ચોક્કસ સ્થાને પહોંચો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:169
-#, fuzzy
-msgid "_Jump to Playing Song"
-msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:83
-#, fuzzy
 msgid "Jump to the currently playing item"
-msgstr "વર્તમાન વાગી રહેલ ગીતનું પુનરાવર્તન કરો"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:164
-msgid "_Restart Song"
-msgstr "ગીતનું પુનરાવર્તન કરો (_R)"
+msgstr "વર્તમાન વાગી રહેલ ગીત પર કૂદકો મારો"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:87
-#, fuzzy
 msgid "Restart the current item"
 msgstr "વર્તમાન ગીત ફરી શરૂ કરો"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:92
-#, fuzzy
 msgid "_Stop When Finished"
 msgstr "જ્યારે સમાપ્ત થાય ત્યારે અટકાવો (_S)"
 
@@ -1709,183 +2228,191 @@ msgstr "વર્તમાન ગીત વગાડવાનું સમાપ
 msgid "_Playback"
 msgstr "વગાડો (_P)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:165
-#, fuzzy
-msgid "_Restart Video"
-msgstr "ગીતનું પુનરાવર્તન કરો (_R)"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:170
-#, fuzzy
-msgid "_Jump to Playing Video"
-msgstr "વાગી રહેલ ગીત પર કૂદો (_J)"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:189
-#, fuzzy
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:190
 msgid "_Pause"
-msgstr "વિરામ"
+msgstr "વિરામ (_P)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:201
-#, fuzzy
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:202
 msgid "Sto_p"
-msgstr "અટકો"
+msgstr "અટકો (_p)"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:72
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:73
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:74
-#, fuzzy
 msgid "Repeat"
-msgstr "બધું પુનરાવર્તન કરો"
+msgstr "ં પુનરાવર્તન કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:78
 msgid "Repeat _Off"
 msgstr ""
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:79
 msgid "Do not repeat playlist"
 msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરશો નહિં"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:84
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:83
 msgid "Repeat _All"
 msgstr "બધું પુનરાવર્તન કરો (_A)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:85
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:84
 msgid "Play all songs before repeating playlist"
 msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરવા પહેલાં બધા ગીતો વગાડો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:88
 msgid "Repeat Singl_e"
 msgstr "એકનું પુનરાવર્તન કરો (_e)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:89
 msgid "Repeat the current playing song"
 msgstr "વર્તમાન વાગી રહેલ ગીતનું પુનરાવર્તન કરો"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:75
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:76
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:77
 msgid "Shuffle"
 msgstr "આડુઅવળુ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:82
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:81
 #, fuzzy
 msgid "Shuffle _Off"
 msgstr "આડુઅવળુ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:83
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:82
 #, fuzzy
 msgid "Do not shuffle playlist"
 msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરશો નહિં"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:86
 #, fuzzy
 msgid "Shuffle by _Song"
 msgstr "આડુઅવળુ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:88
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:87
 #, fuzzy
 msgid "Play songs randomly from the playlist"
 msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરવા પહેલાં બધા ગીતો વગાડો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:91
 msgid "Shuffle by A_rtist"
 msgstr ""
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:92
 msgid "Play all songs by an artist, then randomly choose another artist"
 msgstr "કલાકાર દ્દારા બધા ગીતોને વગાડો, પછી ફાવે તેમ રીતે બીજા કલાકારને પસંદ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:97
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:96
 #, fuzzy
 msgid "Shuffle by A_lbum"
 msgstr "રેન્ડમ પ્લેબેક"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:98
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:97
 msgid "Play all songs from an album, then randomly choose another album"
 msgstr "આલ્બમ માંથી બધા ગીતોને વગાડો, પછી ફાવે તેમ રીતે બીજા આલ્બમ ને પસંદ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:71
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:101
+#, fuzzy
+msgid "Shuffle by _Rating"
+msgstr "આડુઅવળુ"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:102
+#, fuzzy
+msgid "Play songs randomly, prefer higher rated songs"
+msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરવા પહેલાં બધા ગીતો વગાડો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:106
+#, fuzzy
+msgid "Shuffle by S_core"
+msgstr "આડુઅવળુ"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:107
+#, fuzzy
+msgid "Play songs randomly, prefer higher scored songs"
+msgstr "પ્લેલીસ્ટનું પુનરાવર્તન કરવા પહેલાં બધા ગીતો વગાડો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:73
 msgid "_New Playlist"
 msgstr "નવી પ્લેલીસ્ટ (_N)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:72
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:74
 msgid "Create a new empty playlist"
 msgstr "નવું ખાલી પ્લેલીસ્ટ બનાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:75
-msgid "New _Smart Playlist"
-msgstr "નવું સ્માર્ટ પ્લેલીસ્ટ (_S)"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:77
+#| msgid "New _Smart Playlist"
+msgid "New _Smart Playlist..."
+msgstr "નવું સ્માર્ટ પ્લેલીસ્ટ (_S)..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:76
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:78
 msgid "Create a new smart playlist"
 msgstr "નવું સ્માર્ટ પ્લેલીસ્ટ બનાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:86
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:88
 msgid "Import to Library"
 msgstr "લાઈબ્રેરીમાં આયાત કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:89
 msgid "Import source to library"
 msgstr "સ્રોતને લાઈબ્રેરીમાં આયાત કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:92
 msgid "Rename"
 msgstr "નામ ને બદલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:95
 msgid "Export Playlist..."
 msgstr "પ્લેલીસ્ટની નિકાસ કરો..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:96
 msgid "Export a playlist"
 msgstr "પ્લેલીસ્ટની નિકાસ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:97
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:99
 msgid "Unmap"
 msgstr "માપ નથી"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:100
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:102
 msgid "Source Properties"
 msgstr "સ્રોત ગુણધર્મો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:109
-msgid "Refresh"
-msgstr "તાજુ કરો"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:105
+#, fuzzy
+#| msgid "Sort Children"
+msgid "Sort Children by"
+msgstr "બાળકોને ક્રમમાં કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:110
-msgid "Refresh this randomly sorted smart playlist"
-msgstr ""
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:108
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:50
+msgid "Preferences"
+msgstr "પસંદગીઓ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:115
-msgid "Sort Children"
-msgstr "બાળકોને ક્રમમાં કરો"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:109
+msgid "Edit preferences related to this source"
+msgstr ""
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:118
-msgid "Name Ascending"
-msgstr "નામ ચડતા ક્રમમાં"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:113
+msgid "New _Smart Playlist"
+msgstr "નવું સ્માર્ટ પ્લેલીસ્ટ (_S)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:122
-msgid "Name Descending"
-msgstr "નામ ઊતરતા ક્રમમાં"
-
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:126
-msgid "Size Ascending"
-msgstr "માપ ચડતા ક્રમમાં"
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:74
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
+msgid "Refresh"
+msgstr "તાજુ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:130
-msgid "Size Descending"
-msgstr "માપ ઊતરતા ક્રમમાં"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:123
+msgid "Refresh this randomly sorted smart playlist"
+msgstr ""
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:294
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:290
 msgid "Could not export playlist"
 msgstr "પ્લેલીસ્ટને નિકાસ કરી શકાયુ નહિં"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:391
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:418
 #, csharp-format
 msgid "Are you sure you want to delete this {0}?"
 msgstr "શું તમે ખરેખર આ {0} કાઢી નાંખવા માંગો છો?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:400
-#, csharp-format
-msgid "Do not ask me this again"
-msgstr "મને ફરીથી આવું પૂછશો નહિં"
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:461
+msgid "Separate by Type"
+msgstr ""
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:67
 msgid "Select _All"
@@ -1912,91 +2439,533 @@ msgid "Edit information on selected tracks"
 msgstr "પસંદ થયેલ ટ્રેકો પર જાણકારીમાં ફેરફાર કરો"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:234
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:108
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:150
+msgid "Properties"
+msgstr "ગુણધર્મો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:80
+#, fuzzy
+#| msgid "Edit information on selected tracks"
+msgid "View information on selected tracks"
+msgstr "પસંદ થયેલ ટ્રેકો પર જાણકારીમાં ફેરફાર કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:83
 msgid "Add _to Playlist"
 msgstr "પ્લેલીસ્ટમાં ઉમેરો (_t)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:84
 #, fuzzy
 msgid "Append selected items to playlist or create new playlist from selection"
 msgstr "પસંદિત ગીતોને પ્લેલીસ્ટમાં ઉમેરો કે પસંદગીમાંથી નવું પ્લેલીસ્ટ બનાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:85
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:89
 msgid "Create new playlist from selected tracks"
 msgstr "પસંદ થયેલ ટ્રેકોમાંથી નવાં પ્લેલીસ્ટને બનાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:93
 msgid "_Remove"
 msgstr "દૂર કરો (_R)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:94
 msgid "Remove selected track(s) from this source"
 msgstr "આ સ્ત્રોતમાંથી પસંદ થયેલ ટ્રેકોને દૂર કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:97
 msgid "Remove From _Library"
 msgstr "લાઈબ્રેરીમાંથી દૂર કરો (_L)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:98
 msgid "Remove selected track(s) from library"
 msgstr "પસંદિત ટ્રેકોને લાઈબ્રેરીમાંથી દૂર કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:97
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:101
 msgid "_Delete From Drive"
 msgstr "ડ્રાઈવમાંથી કાઢી નાંખો (_D)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:98
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:102
 #, fuzzy
 msgid "Permanently delete selected item(s) from medium"
 msgstr "પસંદિત ગીત(ઓ)ને સંગ્રહસ્થાન માધ્યમમાંતી કાયમીપણે કાઢી નાંખો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:104
+#. Translators: this is a verb (command), not a noun (things)
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "શોધો (_S)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:105
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:109
 #, fuzzy
 msgid "Search for items matching certain criteria"
 msgstr "ચોક્કસ વિચારધારા બંધબેસતા ગીતો માટે શોધો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:112
 msgid "By Matching _Album"
 msgstr "આલ્બમ સાથે સરખાવીને (_A)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:109
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:113
 msgid "Search all songs of this album"
 msgstr "આ આલ્બમના બધા ગીતો શોધો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:112
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:116
 msgid "By Matching A_rtist"
 msgstr "કલાકાર સરખાવીને (_r)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:113
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:117
 msgid "Search all songs of this artist"
 msgstr "આ કલાકાર માટેના બધા ગીતો માટે શોધો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:432
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:240
+#, fuzzy, csharp-format
+#| msgid "Delete From {0}"
+msgid "_Delete From \"{0}\""
+msgstr "{0} માંથી કાઢી નાંખો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:457
 #, fuzzy, csharp-format
 msgid "Are you sure you want to permanently delete this item?"
 msgid_plural "Are you sure you want to permanently delete the selected {0} items?"
 msgstr[0] "શું તમે ખરેખર આ {0} કાઢી નાંખવા માંગો છો?"
 msgstr[1] "શું તમે ખરેખર આ {0} કાઢી નાંખવા માંગો છો?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:436
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:461
 msgid "If you delete the selection, it will be permanently lost."
 msgstr "જો તમે પસંદગી કાઢી નાંખો, તો તે કાયમ માટે નષ્ટ થઈ જશે."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:439
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:464
 #, csharp-format
 msgid "Remove selection from {0}?"
 msgstr "પસંદગીને {0} માંથી દૂર કરો?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:442
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:467
 #, fuzzy, csharp-format
 msgid "Are you sure you want to remove the selected item from your {1}?"
 msgid_plural "Are you sure you want to remove the selected {0} items from your {1}?"
 msgstr[0] "શું તમે ખરેખર આ {0} કાઢી નાંખવા માંગો છો?"
 msgstr[1] "શું તમે ખરેખર આ {0} કાઢી નાંખવા માંગો છો?"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:53
+#, fuzzy
+msgid "Com_pilation Album Artist:"
+msgstr "કલાકાર સરખાવીને (_r)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:57
+msgid "Check this if this track is part of an album with tracks by various artists"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:59
+msgid ""
+"This value will affect how this album is sorted; if you enter 'Various "
+"Artists' then the album will located with other albums that start with 'V'."
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:44
+#| msgid "Details"
+msgid "Basic Details"
+msgstr "મૂળભૂત વિગતો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:69
+#| msgid "Track Title"
+msgid "Track _Title:"
+msgstr "ટ્રેક શીર્ષક (_T):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:77
+msgid "Set all track artists to this value"
+msgstr "આ કિંમતમાં બધા ટ્રેક કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:78
+#| msgid "<b>Track _Artist:</b>"
+msgid "Track _Artist:"
+msgstr "ટ્રેક કલાકાર (_A):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:86
+#, fuzzy
+#| msgid "Set all album artists to this value"
+msgid "Set all compilation album artists to these values"
+msgstr "આ કિંમતમાં બધા આલ્બમ કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:106
+#, fuzzy
+#| msgid "Set all album artists to this value"
+msgid "Set all album titles to this value"
+msgstr "આ કિંમતમાં બધા આલ્બમ કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:107
+#| msgid "Album Title"
+msgid "Albu_m Title:"
+msgstr "આલ્બમ શીર્ષક (_m):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:113
+msgid "Set all genres to this value"
+msgstr "બધી જાતિઓને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:114
+#, fuzzy
+#| msgid "Genre"
+msgid "_Genre:"
+msgstr "જાતિ"
+
+#. Right
+#. Translators: "of" is the word beteen a track/disc number and the total count.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:122
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:154
+msgid "of"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:138
+#, fuzzy
+#| msgid "Automatically set all track numbers in increasing order"
+msgid "Automatically set track number and count"
+msgstr "બધા ટ્રેક નંબરો આપોઆપ વધતા ક્રમમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:140
+#| msgid "<b>Track _number:</b>"
+msgid "Track _Number:"
+msgstr "ટ્રેક નંબર (_N):"
+
+#. Catalog.GetString ("Automatically set disc number and count"),
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:156
+#, fuzzy
+#| msgid "Set all disc numbers to this value"
+msgid "Set all disc numbers and counts to these values"
+msgstr "આ કિંમતમાં બધા ડિસ્ક નંબરોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:157
+#| msgid "Disc name:"
+msgid "_Disc Number:"
+msgstr "ડિસ્ક નંબર (_D):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:178
+msgid "Set all years to this value"
+msgstr "બધા વર્ષોને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:179
+#| msgid "Year"
+msgid "_Year:"
+msgstr "વર્ષ (_Y):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:186
+msgid "Set all ratings to this value"
+msgstr "બધા ક્રમોને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:187
+#, fuzzy
+#| msgid "Rating:"
+msgid "_Rating:"
+msgstr "ક્રમાંકન:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:44
+msgid "Extra"
+msgstr "વધારાનું"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:50
+#, fuzzy
+#| msgid "Set all years to this value"
+msgid "Set all composers to this value"
+msgstr "બધા વર્ષોને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:51
+#, fuzzy
+msgid "C_omposer:"
+msgstr "બંધ કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:57
+#, fuzzy
+#| msgid "Set all genres to this value"
+msgid "Set all conductors to this value"
+msgstr "બધી જાતિઓને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:58
+#, fuzzy
+msgid "Con_ductor:"
+msgstr "ફાળો આપનારાઓ"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:69
+#, fuzzy
+#| msgid "Set all ratings to this value"
+msgid "Set all groupings to this value"
+msgstr "બધા ક્રમોને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:70
+#| msgid "Grouping"
+msgid "_Grouping:"
+msgstr "સમૂહીકરણ (_G):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:80
+#, fuzzy
+#| msgid "Set all ratings to this value"
+msgid "Set all beats per minute to this value"
+msgstr "બધા ક્રમોને આ કિંમતમાં સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:81
+msgid "Bea_ts Per Minute:"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:93
+#| msgid "Set all ratings to this value"
+msgid "Set all copyrights to this value"
+msgstr "બધા કોપીરાઇટોને આ કિંમતમાં સુયોજિત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:94
+msgid "Copyrig_ht:"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:100
+#| msgid "Set all genres to this value"
+msgid "Set all licenses to this value"
+msgstr "બધા લાઇસન્સોને આ કિંમતમાં સુયોજિત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:101
+msgid "_License URI:"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:110
+#| msgid "Set all genres to this value"
+msgid "Set all comments to this value"
+msgstr "બધી ટિપ્પણીઓને આ કિંમતમાં સુયોજિત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:111
+#| msgid "Comment"
+msgid "Co_mment:"
+msgstr "ટિપ્પણી (_m):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/HelpPage.cs:69
+#| msgid "_Help"
+msgid "Help"
+msgstr "મદદ"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LyricsPage.cs:46
+msgid "Lyrics"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs:74
+msgid "Advance to the next track and edit its title"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:42
+msgid "Sorting"
+msgstr "ક્રમાંકન"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:48
+#, fuzzy
+#| msgid "Set all track artists to this value"
+msgid "Set all sort track titles to this value"
+msgstr "આ કિંમતમાં બધા ટ્રેક કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:49
+#, fuzzy
+#| msgid "Track Title"
+msgid "Sort Track Title:"
+msgstr "ટ્રેક શીર્ષક"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:56
+#, fuzzy
+#| msgid "Set all track artists to this value"
+msgid "Set all sort track artists to this value"
+msgstr "આ કિંમતમાં બધા ટ્રેક કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:57
+#, fuzzy
+#| msgid "<b>Track _Artist:</b>"
+msgid "Sort Track Artist:"
+msgstr "<b>ટ્રેક કલાકાર (_A):</b>"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:63
+#, fuzzy
+#| msgid "Set all album artists to this value"
+msgid "Set all sort album artists to this value"
+msgstr "આ કિંમતમાં બધા આલ્બમ કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:64
+#, fuzzy
+#| msgid "Album Artist"
+msgid "Sort Album Artist:"
+msgstr "આલ્બમ કલાકાર"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:70
+#, fuzzy
+#| msgid "Set all album artists to this value"
+msgid "Set all sort album titles to this value"
+msgstr "આ કિંમતમાં બધા આલ્બમ કલાકારોને સુયોજીત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:71
+#, fuzzy
+#| msgid "Album Title"
+msgid "Sort Album Title:"
+msgstr "આલ્બમ શીર્ષક"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
+#| msgid "album"
+msgid "Value"
+msgstr "કિંમત"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
+#| msgid "File _name"
+msgid "File Name:"
+msgstr "ફાઈલ નામ:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
+#| msgid "Home Directory"
+msgid "Directory:"
+msgstr "ડિરેક્ટરી:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
+msgid "Full Path:"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:164
+#| msgid "URL:"
+msgid "URI:"
+msgstr "URI:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:173
+msgid "Duration:"
+msgstr "સમયગાળો:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
+#, fuzzy
+#| msgid "Bitrate"
+msgid "Audio Bitrate:"
+msgstr "બીટદર"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:178
+msgid "Audio Sample Rate:"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:180
+#| msgid "Channels"
+msgid "Audio Channels:"
+msgstr "ઓડિયો ચેનલો:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
+msgid "Video Dimensions:"
+msgstr ""
+
+#. Translators: {0} is the description of the codec
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:190
+#, csharp-format
+#| msgid "{0} second"
+#| msgid_plural "{0} seconds"
+msgid "{0} Codec:"
+msgstr "{0} કોડૅક:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:195
+msgid "Container Formats:"
+msgstr "પાત્ર બંધારણો:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:199
+#, fuzzy
+#| msgid "importedon"
+msgid "Imported On:"
+msgstr "આયાત કરવાનું"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:201
+#| msgid "Last Played"
+msgid "Last Played:"
+msgstr "છેલ્લે વગાડેલ:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#| msgid "Last Skipped"
+msgid "Last Skipped:"
+msgstr "છેલ્લે છોડેલ:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#| msgid "Play Count"
+msgid "Play Count:"
+msgstr "રમત ગણતરી:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
+#, fuzzy
+msgid "Skip Count:"
+msgstr "ગણો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
+msgid "Score:"
+msgstr "સ્કૉર:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:213
+msgid "File Size:"
+msgstr "ફાઈલ માપ:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:214
+#: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
+msgid "bytes"
+msgstr "બાઇટો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:84
+#| msgid "Track Title"
+msgid "Track Editor"
+msgstr "ટ્રેક સંપાદક:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:84
+#| msgid "Source Properties"
+msgid "Track Properties"
+msgstr "ટ્રેક ગુણધર્મો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:132
+msgid "Show the previous track"
+msgstr "પહેલાનાં ટ્રેકને બતાવો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:138
+msgid "Show the next track"
+msgstr "પછીનાં ટ્રેક ને બતાવો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:161
+#| msgid "Title"
+msgid "Title:"
+msgstr "શીર્ષક:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:162
+#| msgid "Artist"
+msgid "Artist:"
+msgstr "કલાકાર:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:163
+#| msgid "Album"
+msgid "Album:"
+msgstr "આલ્બમ:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:267
+msgid "Sync all field _values"
+msgstr "બધી ક્ષેત્ર કિંમતોનો સુમેળ કરો (_v)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:272
+#, fuzzy
+#| msgid ""
+#| "Apply the values of this track set for the Artist, Album Title, Genre, "
+#| "Track count, Year, and Rating fields to the rest of the selected tracks "
+#| "in this editor."
+msgid ""
+"Apply the values of all common fields set for this track to all of the "
+"tracks selected in this editor"
+msgstr ""
+"આ ટ્રેક સમૂહની કલાકાર, આલ્બમ શીર્ષક, જાતિ, ટ્રેક ગણતરી, વર્ષ, અને ક્રમ ક્ષેત્રો માટેની "
+"કિંમતો આ ટ્રેક સંપાદકમાં બાકીના પસંદિત ટ્રેકોને લાગુ કરો."
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:366
+#, fuzzy, csharp-format
+msgid "<i>Editing {0} of {1} items</i>"
+msgstr "{1} માંનુ ગીત {0} બદલી રહ્યા છીએ"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:606
+#, csharp-format
+msgid "Save the changes made to the open track?"
+msgid_plural "Save the changes made to {0} of {1} open tracks?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:623
+msgid "Close _without Saving"
+msgstr "સંગ્રહ કર્યા વગર બંધ કરો (_w)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:659
+#, fuzzy, csharp-format
+#| msgid "If you delete the selection, it will be permanently lost."
+msgid "If you don't save, changes from the last {0} will be permanently lost."
+msgstr "જો તમે પસંદગી કાઢી નાંખો, તો તે કાયમ માટે નષ્ટ થઈ જશે."
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:62
 msgid "_View"
 msgstr "દેખાવ (_V)"
@@ -2009,35 +2978,53 @@ msgstr "ઈક્વીલાઈઝર (_E)"
 msgid "View the graphical equalizer"
 msgstr "ગ્રાફીકલ ઈક્વીલાઈઝર દર્શાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:71
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:72
+msgid "_Context Pane"
+msgstr ""
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:73
+#, fuzzy
+#| msgid "Show the artist/album browser above the track list"
+msgid "Show the context pane beneath the track list"
+msgstr "ટ્રેકની યાદી પર કલાકાર/આલ્બમ બ્રાઉઝરને બતાવો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:80
 msgid "_Fullscreen"
 msgstr "પૂર્ણ સ્ક્રીન (_F)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:72
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:81
 msgid "Enter or leave fullscreen mode"
 msgstr "સંપૂર્ણસ્ક્રીન સ્થિતિ ને દાખલ કરો અથવા છોડો"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs:92
+#, fuzzy
+#| msgid "Still Running"
+msgid "Active Task Running"
+msgid_plural "Active Tasks Running"
+msgstr[0] "હજુ પણ ચાલી રહ્યું છે"
+msgstr[1] "હજુ પણ ચાલી રહ્યું છે"
+
 #. Translators: {0} and {1} are for markup so ignore them, {2} and {3}
 #. are Podcast Name and Published Date, respectively;
 #. e.g. 'from BBtv published 7/26/2007'
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:426
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:444
 #, csharp-format
 msgid "{0}from{1} {2} {0}published{1} {3}"
 msgstr ""
 
 #. simply: "Chicago Public Radio" or whatever the artist name is
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:439
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:457
 msgid "Unknown Stream"
 msgstr "અજ્ઞાત સ્ટ્રીમ"
 
 #. Translators: {0} and {1} are markup so ignore them, {2} is the name of the radio station
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:442
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:460
 #, fuzzy, csharp-format
 msgid "{0}on{1} {2}"
 msgstr "{0}:{1:00} જેટલું {2} માંનુ"
 
 #. Translators: {0} is the "from {album} by {artist}" type string, and {1} is the "on {radio station name}" string
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:445
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:463
 #, csharp-format
 msgid "{0} {1}"
 msgstr "{0} {1}"
@@ -2045,82 +3032,124 @@ msgstr "{0} {1}"
 #. Translators: {0} and {1} are for markup so ignore them, {2} and {3}
 #. are Artist Name and Album Title, respectively;
 #. e.g. 'by Parkway Drive from Killing with a Smile'
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:481
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:499
 #, csharp-format
 msgid "{0}by{1} {2} {0}from{1} {3}"
 msgstr ""
 
 #. Translators: {0} and {1} are for markup so ignore them, {2} is for Album Title;
 #. e.g. 'from Killing with a Smile'
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:485
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:503
 #, fuzzy, csharp-format
 msgid "{0}from{1} {2}"
 msgstr "{0}:{1:00} જેટલું {2} માંનુ"
 
 #. Translators: {0} and {1} are for markup so ignore them, {2} is for Artist Name;
 #. e.g. 'by Parkway Drive'
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:489
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:507
 #, fuzzy, csharp-format
 msgid "{0}by{1} {2}"
 msgstr "{0}:{1:00} જેટલું {2} માંનુ"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:135
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:138
 msgid "Stop Operation"
 msgstr "ક્રિયાને બંધ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:136
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:139
 #, csharp-format
 msgid "Stop {0}"
 msgstr "{0} અટકાવો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:139
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:142
 #, fuzzy
 msgid "This operation is still performing work. Would you like to stop it?"
 msgstr "'{0}' પ્રક્રિયા હજુ પણ કામ કરી રહી છે. શું તમે તેને અટકાવવા ઈચ્છો છો?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:141
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:144
 #, csharp-format
 msgid "The '{0}' operation is still performing work. Would you like to stop it?"
 msgstr "'{0}' પ્રક્રિયા હજુ પણ કામ કરી રહી છે. શું તમે તેને અટકાવવા ઈચ્છો છો?"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:145
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:148
 msgid "Continue"
 msgstr "ચાલુ રાખો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:146
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:149
 #, csharp-format
 msgid "Continue {0}"
 msgstr "{0} ચાલુ રાખો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:179
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:184
 msgid "Stopping..."
 msgstr "બંધ કરી રહ્યા છીએ..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:45
 msgid "Import Files to Library"
 msgstr "ફાઈલોને લાઈબ્રેરીમાં આયાત કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:48
 msgid "Media Files"
 msgstr "મીડિયા ફાઈલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:59
 msgid "Local Files"
 msgstr "સ્થાનિક ફાઈલો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
-msgid "Import Folder to Library"
-msgstr "ફોલ્ડરને લાઈબ્રેરીમાં આયાત કરો"
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
+msgid "C_hoose Files"
+msgstr "ફાઇલોને પસંદ કરો (_h)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:61
-msgid "Local Folder"
-msgstr "સ્થાનિક ફોલ્ડર"
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
+msgid "_Files to import:"
+msgstr "આયાત કરવા માટે ફાઇલો (_F):"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:82
+#| msgid "Select _All"
+msgid "Select Files"
+msgstr "ફાઇલોને પસંદ કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:83
+#, fuzzy
+#| msgid "selected by"
+msgid "(none selected)"
+msgstr "દ્વારા પસંદિત"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:43
+#| msgid "Import Folder to Library"
+msgid "Import Folders to Library"
+msgstr "લાઇબ્રેરીમાં ફોલ્ડરોને આયાત કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:53
+#| msgid "Local Folder"
+msgid "Local Folders"
+msgstr "સ્થાનિક ફોલ્ડરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
+msgid "C_hoose Folders"
+msgstr "ફોલ્ડરો ને પસંદ કરો (_h)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
+#| msgid "Could not import CD"
+msgid "_Folders to import:"
+msgstr "આયાત કરવા માટે ફોલ્ડરો (_F)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:76
+#| msgid "Select for use"
+msgid "Select Folders"
+msgstr "ફોલ્ડરોને પસંદ કરો"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:89
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+#| msgid "Import"
+msgid "_Import"
+msgstr "આયાત કરો (_I)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
-msgid "Videos from Photos Folder"
+#| msgid "Videos from Photos Folder"
+msgid "Videos From Photos Folder"
 msgstr "ફોટો ફોલ્ડરમાંથી વીડિયો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:84
+#: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
 msgid "No available profiles"
 msgstr "કોઈ રૂપરેખાઓ ઉપલબ્ધ નથી"
 
@@ -2128,29 +3157,36 @@ msgstr "કોઈ રૂપરેખાઓ ઉપલબ્ધ નથી"
 msgid "Advanced"
 msgstr "અદ્યતન"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:19
+#: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs:173
+#, csharp-format
+#| msgid "Continue {0}"
+msgid "Configuring {0}"
+msgstr "{0} રૂપરેખાંકિત કરી રહ્યા છે"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:20
 msgid "Export Playlist"
 msgstr "પ્લેલીસ્ટની નિકાસ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:28
+#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:29
 msgid "Export"
 msgstr "નિકાસ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:53
+#: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:54
 msgid "Select Format: "
 msgstr "બંધારણને પસંદ કરો: "
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:87
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:110
 msgid "Select library location"
 msgstr "લાઈબ્રેરી સ્થાન પસંદ કરો"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:95
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:118
 msgid "Reset"
 msgstr "ફરીથી ગોઠવવું"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:50
-msgid "Preferences"
-msgstr "પસંદગીઓ"
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
+#, csharp-format
+msgid "Reset location to default ({0})"
+msgstr ""
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
@@ -2189,219 +3225,47 @@ msgid "Show or hide the artist/album browser"
 msgstr "કલાકાર/આલ્બમ બ્રાઉઝરને બતાવો અથવા છુપાડો"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:1
-msgid "0"
-msgstr "0"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:2
-msgid "0 MB"
-msgstr "0 MB"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
-msgid "0:00"
-msgstr "0:00"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
-msgid "<b>Al_bum Artist:</b>"
-msgstr "<b>આલ્બમ કલાકાર (_b):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
-msgid "<b>Albu_m:</b>"
-msgstr "<b>આલ્બમ (_m):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
-msgid "<b>Album Cover:</b>"
-msgstr "<b>આલ્બમ કવર:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
-msgid "<b>Bitrate:</b>"
-msgstr "<b>બીટદર:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
-msgid "<b>Channels:</b>"
-msgstr "<b>ચેનલો:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
 msgid "<b>Details</b>"
 msgstr "<b>વિગતો</b>"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
-msgid "<b>Duration:</b>"
-msgstr "<b>સમયગાળો:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
-msgid "<b>File name:</b>"
-msgstr "<b>ફાઈલ નામ:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
-msgid "<b>File size:</b>"
-msgstr "<b>ફાઈલ માપ:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
-msgid "<b>Imported on:</b>"
-msgstr "<b>પર આયાત થયેલ:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:14
-msgid "<b>Last played:</b>"
-msgstr "<b>છેલ્લે વગાડાયેલ:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:15
-msgid "<b>Location:</b>"
-msgstr "<b>સ્થાન:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:16
-msgid "<b>Play count:</b>"
-msgstr "<b>વગાડવાનો દર:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:17
-msgid "<b>Sample rate:</b>"
-msgstr "<b>નમૂના દર:</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:18
-msgid "<b>Session Information</b>"
-msgstr "<b>સત્ર જાણકારી</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:19
-msgid "<b>Track _Artist:</b>"
-msgstr "<b>ટ્રેક કલાકાર (_A):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:20
-msgid "<b>Track _count:</b>"
-msgstr "<b>ટ્રેક ગણતરી (_c):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:21
-msgid "<b>Track _number:</b>"
-msgstr "<b>ટ્રેક નંબર (_n):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:22
-msgid "<b>Write Options</b>"
-msgstr "<b>લખવાના વિકલ્પો</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:23
-msgid "<b>_Disc:</b>"
-msgstr "<b>ડિસ્ક (_D):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:24
-msgid "<b>_Genre:</b>"
-msgstr "<b>વર્ગ (_G):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:25
-msgid "<b>_Rating:</b>"
-msgstr "<b>ક્રમાંકન (_R):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:26
-msgid "<b>_Title:</b>"
-msgstr "<b>શીર્ષક (_T):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:27
-msgid "<b>_Year:</b>"
-msgstr "<b>વર્ષ (_Y):</b>"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:28
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:2
 msgid "<big><b>Import Media to Library</b></big>"
 msgstr "<big><b>લાઈબ્રેરીમાંથી મીડિયાને આયાત કરો</b></big>"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:29
-msgid "Apply common field values to all tracks"
-msgstr "બધા ટ્રેકોને સામાન્ય ક્ષેત્ર કિંમતો લાગુ કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:30
-msgid "Artwork"
-msgstr "કલાકારીગીરી"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:31
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:88
-msgid "Back"
-msgstr "પાછળ"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:32
-msgid "Choose an import source:"
-msgstr "આયાત સ્રોત પસંદ કરો:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:33
-msgid "Copy to all"
-msgstr "બધું નકલ કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:35
-msgid "Disc Options"
-msgstr "ડિસ્ક વિકલ્પો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:36
-msgid "Disc format:"
-msgstr "ડિસ્ક બંધારણ:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:37
-msgid "Disc name:"
-msgstr "ડિસ્ક નામ:"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
+msgid "Create and save"
+msgstr "બનાવો અને સંગ્રહો"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:38
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Do not show this dialog again"
 msgstr "આ સંવાદ ફરી દર્શાવશો નહીં"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:39
-msgid "Eject disc after writing"
-msgstr "લખ્યા પછી ડિસ્ક બહાર કાઢો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:40
-msgid "Embed directly in song"
-msgstr "ગીતમાં સીધું જ જડો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:41
-msgid "Enter Next"
-msgstr "આગળ દાખલ કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:42
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
 msgid "Enter the address of the file you would like to open:"
 msgstr "તમે જે ફાઈલ ખોલવા ઈચ્છો તેનું સરનામું દાખલ કરો:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:44
-msgid "Forward"
-msgstr "આગળ ધપાવો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:45
-msgid "Import Media Source"
-msgstr "મીડિયા સ્રોત આયાત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:46
-msgid "Import Media to Library"
-msgstr "લાઈબ્રેરીમાં મીડિયાને આયાત કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:47
-msgid "Metadata"
-msgstr "મેટાડેટા"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+#| msgid "_Import format"
+msgid "Import _from:"
+msgstr "માંથીણને આયાત કર_f(:_I)"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:49
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
 msgid "Open in editor"
 msgstr "સંપાદકમાં ખોલો"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:50
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
 msgid "Playlist _Name: "
 msgstr "પ્લેલીસ્ટ નામ (_N): "
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:51
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Predefined Smart Playlists"
 msgstr "પૂર્વવ્યાખ્યાયિત ચપળ પ્લેલીસ્ટ"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:52
-msgid "Save to song directory"
-msgstr "ગીત ડિરેક્ટરીમાં સંગ્રહો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:53
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
 msgid "Seek to Position"
 msgstr "સ્થાને પહોંચો"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:54
-msgid "Select for use"
-msgstr "વપરાશ માટે પસંદ કરો"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:56
-msgid "Write disc to:"
-msgstr "ડિસ્કમાં લખો:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:57
-msgid "Write speed:"
-msgstr "લખવાની ઝડપ:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:58
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
 #, fuzzy
 msgid ""
 "Your media library is empty. You may import new music and videos into your "
@@ -2410,10 +3274,6 @@ msgstr ""
 "તમારી મ્યુઝીક લાઈબ્રેરી ખાલી છે. તમે નવા સંગીતને તમારી લાઈબ્રેરીમાં હવે આયાત કરશો, અથવા "
 "આવું કરવાનું પછીથી પસંદ કરશો."
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:59
-msgid "_Write"
-msgstr "લખો (_W)"
-
 #: ../src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs:189
 msgid ""
 "Insert\n"
@@ -2422,65 +3282,120 @@ msgstr ""
 "ડિસ્ક\n"
 "દાખલ કરો"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:140
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:148
 msgid "Idle"
 msgstr "આળસુ"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:141
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:149
 msgid "Contacting..."
 msgstr "સંપર્ક કરી રહ્યા છીએ..."
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:151
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:159
 msgid "Buffering"
 msgstr "બફરીંગ"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:159
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs:148
-#, csharp-format
-msgid "{0} of {1}"
-msgstr "{1} માંનુ {0}"
-
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
 msgid "Muted"
 msgstr "મૂંગુ કરેલ"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
 msgid "Full Volume"
 msgstr "પૂર્ણ અવાજ"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:134
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:124
+#, csharp-format
+msgid "Sync {0}"
+msgstr "{0} સુમેળ કરો"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:190
+#, csharp-format
+msgid "{0} to add, {1} to remove"
+msgstr ""
+
+#. Note to translators: {0}, {1} and {2} will be replaced with numbers.
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:248
+#, csharp-format
+msgid "{0} to add, {1} to remove, {2} to update"
+msgstr ""
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:174
 msgid "Device Properties"
 msgstr "ઉપકરણ ગુણધર્મો"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:158
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:191
+msgid "Media Player"
+msgstr "મીડિયા પ્લેયર"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:198
 msgid "Product"
 msgstr "પ્રોડક્ટ"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:159
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:199
 msgid "Vendor"
 msgstr "વિક્રેતા"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:236
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:277
 #, csharp-format
 msgid "Loading {0}"
 msgstr "{0} ને લોડ કરી રહ્યા છીએ"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:301
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:37
+msgid "Yes"
+msgstr "હા"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:38
+msgid "No"
+msgstr "ના"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:378
 #, csharp-format
 msgid ""
 "The {0} format is not supported by the device, and no converter was found to "
-"convert it."
+"convert it"
+msgstr ""
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:384
+#| msgid "File format conversion is not supported for this device."
+msgid "File format conversion support is not available"
+msgstr "ફાઇલ બંધારણ પરિવર્તન આધાર ઉપલ્બધ નથી"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:410
+#| msgid "Error opening stream"
+msgid "Error converting file"
+msgstr "ફાઇલને રૂપાંતર કરતી વખતે ભૂલ"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:116
+msgid "Manually manage this device"
+msgstr "જાતે જ આ ઉપકરણને સંચાલિત કરો"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:117
+msgid ""
+"Manually managing your device means you can drag and drop items onto the "
+"device, and manually remove them."
+msgstr ""
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:121
+msgid "Automatically sync the device when plugged in or when the libraries change"
 msgstr ""
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:307
-msgid "File format conversion is not supported for this device."
-msgstr "ફાઇલ બંધારણ પરિવર્તન એ આઉપકરણ માટે આધારભૂત નથી."
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:122
+msgid ""
+"Begin synchronizing the device as soon as the device is plugged in or the "
+"libraries change."
+msgstr ""
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs:46
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:125
+msgid "Sync Preferences"
+msgstr "પસંદગીઓ નો સુમેળ કરો"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs:50
 msgid "Synchronize"
 msgstr "સુમેળ કરો"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs:47
+#. Translators: {0} is the name of the digital audio player
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs:88
 #, csharp-format
 msgid "Synchronize {0}"
 msgstr "{0} સુમેળ કરો"
@@ -2489,6 +3404,10 @@ msgstr "{0} સુમેળ કરો"
 msgid "Audio"
 msgstr "ઓડિયો"
 
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:68
+msgid "Video"
+msgstr "વીડિયો"
+
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:69
 msgid "Other"
 msgstr "બીજા"
@@ -2524,153 +3443,117 @@ msgstr "ક્ષમતા વપરાયેલ છે"
 msgid "Advanced details"
 msgstr "અદ્યતન વિગતો"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:114
-#, csharp-format
-msgid "Sync {0}"
-msgstr "{0} સુમેળ કરો"
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:100
-msgid "Manually manage this device"
-msgstr "જાતે જ આ ઉપકરણને સંચાલિત કરો"
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:101
-msgid ""
-"Manually managing your device means you can drag and drop items onto the "
-"device, and manually remove them."
-msgstr ""
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:105
-msgid "Automatically sync the device when plugged in or the libraries change"
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/PurchasedMusicActions.cs:53
+msgid "Import Purchased Music"
 msgstr ""
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:106
-msgid ""
-"Begin synchronizing the device as soon as the device is plugged in or the "
-"libraries change."
-msgstr ""
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:109
-msgid "Sync Preferences"
-msgstr "પસંદગીઓ નો સુમેળ કરો"
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/MediaGroupSource.cs:53
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:70
-#, csharp-format
-msgid "Delete From {0}"
-msgstr "{0} માંથી કાઢી નાંખો"
-
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/MusicGroupSource.cs:38
-msgid "Music"
-msgstr "સંગીત"
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:94
+msgid "Podcasts"
+msgstr "પોડકાસ્ટ"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:71
 #, csharp-format
 msgid "Eject {0}"
 msgstr "{0} બહાર કાઢો"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:104
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:108
 #, csharp-format
 msgid "Ejecting {0}..."
 msgstr "{0} બહાર કાઢી રહ્યા છે..."
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:111
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:115
 #, csharp-format
 msgid "Could not eject {0}: {1}"
 msgstr "{0} ને બહાર કાઢી શક્યા નહિં: {1}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs:38
-msgid "Videos"
-msgstr "વિડિઓ"
-
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:91
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:92
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:95
 msgid "Rebuilding Database"
 msgstr "ડેટાબેઝ પુનઃબીલ્ડ કરી રહ્યા છીએ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:93
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:96
 msgid "Scanning iPod..."
 msgstr "iPod સ્કેન કરી રહ્યા છીએ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:128
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:131
 msgid "Processing Tracks..."
 msgstr "ટ્રેકો પર પ્રક્રિયા કરી રહ્યા છીએ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:144
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:147
 msgid "Ordering Tracks..."
 msgstr "ટ્રેકોને ક્રમમાં કરી રહ્યા છે..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:215
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:218
 msgid "Saving new database..."
 msgstr "નવો ડેટાબેઝ સંગ્રહી રહ્યા છીએ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:227
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:230
 msgid "Error rebuilding iPod database"
 msgstr "iPod ડેટાબેઝ પુનઃબીલ્ડ કરવામાં ક્ષતિ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:87
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:98
 msgid "Device"
 msgstr "ઉપકરણ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:88
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:99
 msgid "Color"
 msgstr "રંગ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:89
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:100
 msgid "Generation"
 msgstr "સમયગાળો"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:90
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:101
 msgid "Capacity"
 msgstr "ક્ષમતા"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:91
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:142
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "ક્રમાંક નંબર"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:92
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:103
 msgid "Produced on"
 msgstr "પર ઉત્પન્ન થયેલ છે"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:93
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:104
 msgid "Firmware"
 msgstr "ફર્મવેર"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:97
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:108
 msgid "Capabilities"
 msgstr "ક્ષમતાઓ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:98
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:109
 msgid "Supports cover art"
 msgstr "કવર કલાને આધાર આપે છે"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:98
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:99
-msgid "Yes"
-msgstr "હા"
-
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:98
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:99
-msgid "No"
-msgstr "ના"
-
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:99
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:110
 msgid "Supports photos"
 msgstr "ફોટોને આધાર આપે છે"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:536
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+msgid "Out of space on device"
+msgstr ""
+
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+msgid "Please manually remove some songs"
+msgstr "મહેરબાની કરીને જાતે જ અમુક ગીતોને દૂર કરો"
+
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:661
 msgid "Syncing iPod"
 msgstr "iPod ને સુમેળ કરી રહ્યા છીએ"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:537
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:662
 msgid "Preparing to synchronize..."
 msgstr "સુમેળ કરવા માટે તૈયાર કરી રહ્યા છે..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:558
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:683
 msgid "Updating..."
 msgstr "સુધારી રહ્યા છીએ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:562
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:687
 msgid "Flushing to disk..."
 msgstr ""
 
@@ -2713,7 +3596,9 @@ msgstr "આ શાના માટેનું કારણ છે?"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:115
 msgid "Your iPod is mounted read only. Banshee can not restore your iPod."
-msgstr "તમારુ iPod એ ફક્ત વાંચી શકાય તેવી રીતે માઉન્ટ થયેલ છે. Banshee એ તમારા iPod ને પુન:સંગ્રહ કરી શકતુ નથી."
+msgstr ""
+"તમારુ iPod એ ફક્ત વાંચી શકાય તેવી રીતે માઉન્ટ થયેલ છે. Banshee એ તમારા iPod ને પુન:"
+"સંગ્રહ કરી શકતુ નથી."
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:123
 msgid "Rebuild iPod Database..."
@@ -2743,123 +3628,159 @@ msgstr "ડેટાબેઝ પુનઃબીલ્ડ કરો"
 msgid "Rebuilding iPod Database..."
 msgstr "iPod ડેટાબેઝ પુનઃબીલ્ડ કરી રહ્યા છીએ..."
 
-#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:97
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AmazonMp3GroupSource.cs:43
+#| msgid "Shared Music"
+msgid "Purchased Music"
+msgstr "ખરીદેલ સંગીત"
+
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs:82
+#| msgid "Device"
+msgid "Rockbox Device"
+msgstr "Rockbox ઉપકરણ"
+
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:114
 #, csharp-format
 msgid "Audio Folder"
 msgid_plural "Audio Folders"
 msgstr[0] "ઓડિઓ ફોલ્ડર"
 msgstr[1] "ઓડિઓ ફોલ્ડરો"
 
-#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:103
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:121
+#, csharp-format
+#| msgid "Audio Folder"
+#| msgid_plural "Audio Folders"
+msgid "Video Folder"
+msgid_plural "Video Folders"
+msgstr[0] "વિડિયો ફોલ્ડર"
+msgstr[1] "વિડિયો ફોલ્ડરો"
+
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:127
 msgid "Required Folder Depth"
 msgstr "જરૂરી ફોલ્ડર ઊંડાઈ"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:76
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:115
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:130
+#, fuzzy
+#| msgid "Import Playlist"
+msgid "Supports Playlists"
+msgstr "પ્લેલીસ્ટ ને આયાત કરો"
+
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/WebOSDevice.cs:188
+#, fuzzy
+#| msgid "minutes"
+msgid "Ringtones"
+msgstr "મિનિટો"
+
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "MTP આધાર એ ઉપકરણને અવગણી રહ્યુ છે"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:77
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:116
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid "Banshee's MTP audio player support can only handle one device at a time."
 msgstr "Banshee નું MTP ઓડિયો પ્લેયર આધાર એ એક જ સમયે ફક્ત એકને જ સંભાળી શકે છે."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:89
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:91
 msgid "Error Initializing MTP Device Support"
 msgstr "MTP ઉપકરણ આધારને પ્રારંભ કરવા દરમ્યાન ભૂલ"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:90
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:92
 msgid ""
 "There was an error intializing MTP device support.  See http://www.banshee-"
 "project.org/Guide/DAPs/MTP for more information."
 msgstr ""
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:101
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:103
 msgid "Error Finding MTP Device Support"
 msgstr "MTP ઉપકરણ આધાર શોધવા દરમ્યાન ભૂલ"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:102
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:104
 msgid "An MTP device was detected, but Banshee was unable to load support for it."
 msgstr "MTP ઉપકરણ શોધાયેલ હતુ, પરંતુ Banshee એ તેનાં માટે આધારને લોડ કરવા માટે અસમર્થ હતુ."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:143
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "આવૃત્તિ"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "બેટરી સ્તર"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
-#. current track being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:155
+#. track currently being loaded, and {2} is the total # of tracks that will be loaded.
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, fuzzy, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "{1} નું {0} લાવી રહ્યા છીએ"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:68
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:156
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:54
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:76
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:55
 msgid "Audio CD"
 msgstr "ઓડિયો સીડી"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:88
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs:102
 #, csharp-format
 msgid "Track {0}"
 msgstr "ટ્રેક {0}"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:117
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:119
 msgid "Importing Audio CD"
 msgstr "ઓડિયો CD ની આયાત કરી રહ્યા છીએ"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:118
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:120
 msgid "Initializing Drive"
 msgstr "ડ્રાઈવનો આરંભ કરી રહ્યા છીએ"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:120
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:122
 #, csharp-format
 msgid ""
 "<i>{0}</i> is still being imported into the music library. Would you like to "
 "stop it?"
 msgstr "<i>{0}</i> એ હજુ પણ સંગીત લાઈબ્રેરીમાં આયાત થી રહ્યું છે. શું તમે તેને અટકાવવા માંગો છો?"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:239
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:247
 msgid "Cannot Import CD"
 msgstr "CD ને આયાત કરી શકતા નથી"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:160
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:233
+#, fuzzy
+#| msgid "Audio CD"
+msgid "Audio CDs"
+msgstr "ઓડિયો સીડી"
+
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:235
 msgid "Audio CD Importing"
 msgstr "ઓડિઓ CD આયાત કરી રહ્યા છે"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:162
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:238
 msgid "_Import format"
 msgstr "બંધારણને આયાત કરો (_I)"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:166
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:242
 msgid "_Automatically import audio CDs when inserted"
 msgstr "આપમેળે ઓડિયો CDs ને આયાત કરો જ્યારે દાખલ થયેલ હોય (_A)"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:167
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:243
 msgid ""
 "When an audio CD is inserted, automatically begin importing it if metadata "
 "can be found and it is not already in the library."
 msgstr ""
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:171
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:247
 msgid "_Eject when done importing"
 msgstr "બહાર નીકાળો જ્યારે આયાત કરવાનું પૂરુ થઇ જાય (_E)"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:172
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:248
 msgid "When an audio CD has been imported, automatically eject it."
 msgstr "જ્યારે ઓડિયો CD ને આયાત કરી દેવામાં આવે છે, આપમેળે તે બહાર નીકળે છે."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:175
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:251
 msgid "Use error correction when importing"
 msgstr "જ્યારે આયાત કરી રહ્યા હોય ત્યારે ક્ષતિ સુધારો વાપરો"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:176
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:252
 msgid ""
 "Error correction tries to work around problem areas on a disc, such as "
 "surface scratches, but will slow down importing substantially."
@@ -2867,60 +3788,66 @@ msgstr ""
 "ક્ષતિ સુધારો ડિસ્ક પરની સમસ્યાઓ સુધારવાનો પ્રયાસ કરે છે, જેમ કે સપાટી પરના ઘસારાઓ, પરંતુ "
 "તે આયાત કરવાનું પછીથી ધીમું કરી નાંખશે."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:244
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:412
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:320
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:440
 msgid "Import CD"
 msgstr "CD આયાત કરો"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:245
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:321
 msgid "Import this audio CD to the library"
 msgstr "ઓડિયો CD ને લાઈબ્રેરીમાં આયાત કરો"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:251
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:327
 msgid "Duplicate CD"
 msgstr "નકલી CD"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:252
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:328
 msgid "Duplicate this audio CD"
 msgstr "આ ઓડિયો CD ની નકલ કરો"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:123
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:130
 msgid "Searching for CD metadata..."
 msgstr "CD મેટાડેટા માટે શોધી રહ્યા છીએ..."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:156
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:163
 msgid "Could not fetch metadata for CD."
 msgstr "CD માટે મેટાડેટા મેળવી શક્યા નહિં."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:184
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:191
 msgid "Automatic import off since this album is already in the Music Library."
 msgstr ""
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:207
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:214
 msgid "Could not import CD"
 msgstr "CD ને આયાત કરી શકાયુ નહિં"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:224
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:231
 msgid "Could not duplicate audio CD"
 msgstr "ઓડિયો CD ની નકલ કરી શક્યા નહિં"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:336
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:363
 msgid "Ejecting audio CD..."
 msgstr "ઓડિયો CD ને બહાર નીકાળી રહ્યા છે..."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:354
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:381
 #, csharp-format
 msgid "Could not eject audio CD: {0}"
 msgstr "ઓડિયો CD ને બહાર કાઢી શક્યા નહિં: {0}"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:387
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:414
+#, fuzzy
+#| msgid "Preferences"
+msgid "Audio CD Preferences"
+msgstr "પસંદગીઓ"
+
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:415
 msgid "Eject Disc"
 msgstr "ડિસ્કને બહાર નીકાળો"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:411
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:439
 #, csharp-format
 msgid "Import ‟{0}”"
-msgstr ""
+msgstr "આયાત ‟{0}”"
 
 #: ../src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs:84
 msgid "_Bookmarks"
@@ -2945,36 +3872,67 @@ msgstr "બુકમાર્ક ને દૂર કરો (_R)"
 msgid "{0} ({1}:{2:00})"
 msgstr "{0} ({1}:{2:00})"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:83
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmDetectJob.cs:64
+msgid "Detecting BPM"
+msgstr "BPM ને શોધી રહ્યા છે"
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:86
+msgid "D_etect"
+msgstr "શોધો (_e)"
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:98
+msgid "T_ap"
+msgstr "ટૅપ (_a)"
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:106
+msgid "Have Banshee attempt to auto-detect the BPM of this song"
+msgstr ""
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:108
+#, fuzzy
+#| msgid "Playlists"
+msgid "Play this song"
+msgstr "પ્લેલીસ્ટો"
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:111
+msgid "Tap this button to the beat to set the BPM for this song manually"
+msgstr ""
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:148
+msgid "_Automatically detect BPM for all songs"
+msgstr "બધા ગીતો માટે આપમેળે BPM ને શોધો (_A)"
+
+#: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:149
+msgid "Detect BPM for all songs that don't already have a value set"
+msgstr ""
+
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:58
 msgid "Downloading Cover Art"
 msgstr "કવર કલા ડાઉનલોડ કરી રહ્યા છીએ"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:112
-msgid "Preparing..."
-msgstr "તૈયાર કરી રહ્યા છે..."
-
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:141
+#. Console.WriteLine ("have album {0}/{1} for track uri {2}", track.AlbumId, track.AlbumTitle, track.Uri);
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:121
 #, csharp-format
 msgid "{0} - {1}"
 msgstr "{0} - {1}"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:105
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:106
 msgid "_Cover Art"
 msgstr "કવર કલા (_C)"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:106
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:107
 msgid "Manage cover art"
 msgstr "કવર કલા ને સંચાલિત કરો"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:108
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:109
 msgid "_Download Cover Art"
 msgstr "કવર કલા ડાઉનલોડ કરો (_D)"
 
-#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:109
+#: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs:110
 msgid "Download cover art for all tracks"
 msgstr "બધા ટ્રેકો માટે કવર કલા ડાઉનલોડ કરો"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs:41
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs:42
 msgid "Shared Music"
 msgstr "વહેંચાયેલ મ્યુઝીક"
 
@@ -2986,6 +3944,10 @@ msgstr "મ્યુઝીક વહેંચણીમાંથી જોડા
 msgid "Unable to connect to music share"
 msgstr "મ્યુઝીક વહેંચણીમાં જોડાવામાં અસમર્થ"
 
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:88
+msgid "Back"
+msgstr "પાછળ"
+
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:101
 msgid ""
 "iTunes® 7 introduced new compatibility issues and currently only works with "
@@ -3053,42 +4015,44 @@ msgstr "પાસવર્ડ:"
 msgid "Login"
 msgstr "પ્રવેશ"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:59
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:60
 msgid "Music Share"
 msgstr "સંગીત વહેંચણી"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:63
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:64
 msgid "Disconnect"
 msgstr "જોડાણ તોડો"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:105
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:106
 #, csharp-format
 msgid "Connecting to {0}"
 msgstr "{0} સાથે જોડાઈ રહ્યા છીએ"
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:199
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:202
 #, csharp-format
 msgid "Logging in to {0}."
 msgstr "{0} માં પ્રવેશી રહ્યા છીએ."
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:235
-#, csharp-format
-msgid "Loading {0} track."
-msgid_plural "Loading {0} tracks."
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:238
+#, fuzzy, csharp-format
+#| msgid "Loading {0} track."
+#| msgid_plural "Loading {0} tracks."
+msgid "Loading {0} track"
+msgid_plural "Loading {0} tracks"
 msgstr[0] "{0} ટ્રેકને લોડ કરી રહ્યા છે."
 msgstr[1] "{0} ટ્રેકોને લોડ કરી રહ્યા છે."
 
-#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:257
+#: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:270
 msgid "Loading playlists"
 msgstr "પ્લેલીસ્ટોને લોડ કરી રહ્યા છે"
 
+#: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:57
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:58
-#: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:59
 msgid "File System Queue"
 msgstr "ફાઇલ સિસ્ટમ કતાર"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:72
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:89
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:70
 msgid "Clear"
 msgstr "સાફ"
 
@@ -3097,7 +4061,7 @@ msgid "Remove all tracks from the file system queue"
 msgstr "ફાઇલ સિસ્ટમ કતાર માંથી બધા ટ્રેકોને દૂર કરો"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:79
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:96
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:77
 msgid "Clear on Quit"
 msgstr ""
 
@@ -3109,44 +4073,46 @@ msgstr "જ્યારે બહાર નીકળી રહ્યા હો
 msgid "Not Set"
 msgstr "સુયોજિત નથી"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:57
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:55
 msgid "Radio"
 msgstr "રેડિયો"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:68
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:66
 msgid "Add Station"
 msgstr "સ્ટેશન ઉમેરો"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:69
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:67
 msgid "Add a new Internet Radio station or playlist"
 msgstr "નવું રેડિયો સ્ટેશન અથવા પ્લેલીસ્ટને ઉમેરો"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:82
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:83
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:64
 msgid "Edit Station"
 msgstr "સ્ટેશનમાં ફેરફાર કરો"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:131
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:135
 msgid "Station"
 msgstr "સ્ટેશન"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:132
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
 msgid "Creator"
 msgstr "રચનાર"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:133
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
 msgid "Description"
 msgstr "વર્ણન"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:218
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:237
 msgid "Please provide a valid station URI"
 msgstr "મહેરબાની કરીને યોગ્ય સ્ટેશન URI ને પૂરુ પાડો"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:231
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:250
 msgid "Please provide a station genre"
 msgstr ""
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:239
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:258
 msgid "Please provide a station title"
 msgstr "મહેરબાની કરીને સ્ટેશન શીર્ષકને પૂરુ પાડો"
 
@@ -3183,8 +4149,8 @@ msgid "Station Creator:"
 msgstr "સ્ટેશન બનાવનાર:"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs:123
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:74
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:87
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:79
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:89
 msgid "Description:"
 msgstr "વર્ણન:"
 
@@ -3193,223 +4159,223 @@ msgstr "વર્ણન:"
 msgid "Rating:"
 msgstr "ક્રમાંકન:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:125
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:126
 msgid "_Last.fm"
 msgstr "Last.fm (_L)"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:126
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:127
 msgid "Configure the Audioscrobbler plugin"
 msgstr "Audioscrobbler પ્લગઈન રૂપરેખાંકિત કરો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:129
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:130
 msgid "Visit _User Profile Page"
 msgstr "વપરાશકર્તા રૂપરેખા પાનાંની મુલાકાત લો (_U)"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:130
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:131
 msgid "Visit Your Last.fm Profile Page"
 msgstr "તમારા Last.fm રૂપરેખા પાનાંની મુલાકાત લો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:133
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:134
 msgid "_Configure..."
 msgstr "રૂપરેખાંકિત કરો (_C)..."
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:134
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:135
 msgid "Configure the Last.fm Extension"
 msgstr "Last.fm એક્સટેન્શનને રૂપરેખાંકિત કરો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:139
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:140
 msgid "_Enable Song Reporting"
 msgstr "ગીત અહેવાલીકરણ સક્રિય કરો (_E)"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:140
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:141
 msgid "Enable song reporting"
 msgstr "ગીત અહેવાલીકરણ સક્રિય કરો"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:66
-msgid "_Add Station"
+#, fuzzy
+#| msgid "_Add Station"
+msgid "_Add Station..."
 msgstr "સ્ટેશન ઉમેરો (_A)"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:67
 msgid "Add a new Last.fm radio station"
 msgstr "નવું Last.fm રેડિયો સ્ટેશન ઉમેરો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:74
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:80
 msgid "Connect"
 msgstr "જોડાવો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:79
-msgid "Sort Stations by"
-msgstr "તે દ્દારા સ્ટેશનોને ક્રમમાં કરો"
-
 #. Translators: {0} is a type of Last.fm station, eg "Fans of" or "Similar to".
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:85
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:86
 #, fuzzy, csharp-format
 msgid "Listen to {0} Station"
 msgstr "રેડિયો સ્ટેશનમાં ફેરફાર કરો"
 
 #. Translators: {0} is a type of Last.fm station, eg "Fans of" or "Similar to".
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:87
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:88
 #, csharp-format
 msgid "Listen to the Last.fm {0} station for this artist"
 msgstr ""
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:92
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:126
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:151
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:93
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:127
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:152
 msgid "View on Last.fm"
 msgstr "Last.fm પર દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:93
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:94
 msgid "View this artist's Last.fm page"
 msgstr "આ કલાકારનાં Last.fm પાનાંને દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:96
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:97
 msgid "View Artist on Wikipedia"
 msgstr "વિકીપીડિયા પર કલાકારને દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:97
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:98
 msgid "Find this artist on Wikipedia"
 msgstr "વિકીપીડિયા પર આ કલાકારને શોધો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:104
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:105
 msgid "View Artist's Videos"
 msgstr "કલાકારનાં વિડિઓને દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:105
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:106
 msgid "Find videos by this artist"
 msgstr "આ કલાકાર દ્દારા વિડિઓને શોધો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:108
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:109
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:110
 msgid "Fans of"
 msgstr "નાં ચાહકો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:113
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:114
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:115
 msgid "Similar to"
 msgstr "નાં જેવુ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:118
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:134
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:155
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:119
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:135
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:156
 msgid "Recommend to"
 msgstr "માં આગ્રહણીય"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:119
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:120
 #, fuzzy
 msgid "Recommend this artist to someone"
 msgstr "આગ્રહણીય કલાકારો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:127
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:128
 msgid "View this album's Last.fm page"
 msgstr "આલ્બમ last.fm પાનાંને દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:135
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:136
 #, fuzzy
 msgid "Recommend this album to someone"
 msgstr "આગ્રહણીય કલાકારો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:142
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:143
 #, fuzzy
 msgid "Love Track"
 msgstr "ટ્રેક"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:143
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:144
 msgid "Mark current track as loved"
 msgstr ""
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:147
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:148
 msgid "Ban Track"
 msgstr "બેન ટ્રેક"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:148
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:149
 msgid "Mark current track as banned"
 msgstr ""
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:152
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:153
 msgid "View this track's Last.fm page"
 msgstr "ટ્રેકનાં last.fm પાનાંને દેખાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:156
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:157
 #, fuzzy
 msgid "Recommend this track to someone"
 msgstr "આગ્રહણીય કલાકારો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:166
-msgid "Station Name"
-msgstr "સ્ટેશન નામ"
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:171
-msgid "Total Play Count"
-msgstr "કુલ રમત ગણતરી"
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:176
-msgid "Station Type"
-msgstr "સ્ટેશન પ્રકાર"
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:258
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:241
 #, csharp-format
 msgid "http://last.fm/music/{0}"
 msgstr "http://last.fm/music/{0}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:266
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:249
 #, csharp-format
 msgid "http://last.fm/music/{0}/{1}"
 msgstr "http://last.fm/music/{0}/{1}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:274
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:257
 #, csharp-format
 msgid "http://last.fm/music/{0}/_/{1}"
 msgstr "http://last.fm/music/{0}/_/{1}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:282
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:265
 #, csharp-format
 msgid "http://www.last.fm/music/{0}/+videos"
 msgstr "http://www.last.fm/music/{0}/+videos"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:290
+#. Translators: this is used for looking up artist pages on Wikipedia; change to your wikipedia language if you want
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:273
+#: ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/WikipediaView.cs:48
 #, csharp-format
 msgid "http://en.wikipedia.org/wiki/{0}"
 msgstr "http://en.wikipedia.org/wiki/{0}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:324
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:307
 #, csharp-format
 msgid "Fans of {0}"
 msgstr "{0} નાં ચાહકો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:345
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:328
 #, csharp-format
 msgid "Similar to {0}"
 msgstr "{0} નાં જેવું"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:124
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:401
+msgid "_Add Station"
+msgstr "સ્ટેશન ઉમેરો (_A)"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:126
 msgid "Recently Loved Tracks"
 msgstr ""
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:125
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:127
 msgid "Recently Played Tracks"
 msgstr "તાજેતરમાં રમાયેલ ટ્રેકો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:126
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:128
 msgid "My Top Artists"
 msgstr "મારા ઊંચા કલાકારો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:206
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:208
 #, csharp-format
 msgid "{0} plays"
 msgstr "{0} વગાડો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:106
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:102
 msgid "Edit Last.fm Settings"
 msgstr "Last.fm સુયોજનોમાં ફેરફાર કરો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:324
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:103
+msgid "Sort Stations by"
+msgstr "તે દ્દારા સ્ટેશનોને ક્રમમાં કરો"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:156
+msgid "Total Play Count"
+msgstr "કુલ રમત ગણતરી"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:256
 msgid "Account Settings"
 msgstr "ખાતા સુયોજનો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:326
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:258
 msgid "Join Last.fm"
-msgstr ""
+msgstr "Last.fm માં જોડાવો"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:72
 msgid "New Station"
@@ -3427,128 +4393,141 @@ msgstr "Last.fm સ્ટેશનમાં ફેરફાર કરો"
 msgid "Delete Last.fm Station"
 msgstr "Last.fm સ્ટેશનને કાઢી નાંખો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:237
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:238
 #, csharp-format
 msgid "Tuning Last.fm to {0}."
 msgstr ""
 
 #. Translators: {0} is an error message sentence from RadioConnection.cs.
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:247
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:248
 #, fuzzy, csharp-format
 msgid "Failed to tune in station. {0}"
 msgstr "રેડિયો સ્ટેશનો લાવવામાં નિષ્ફળ: "
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:346
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:349
 #, csharp-format
 msgid "Getting new songs for {0}."
 msgstr "{0} માટે નવાં ગીતોને મેળવી રહ્યા છે."
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:353
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:356
 #, csharp-format
 msgid "No new songs available for {0}."
 msgstr "{0} માટે નવાં ગીતો ઉપલ્બધ નથી."
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:379
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:382
 #, csharp-format
 msgid "Failed to get new songs for {0}."
 msgstr "{0} માટે નવા ગીતોને મેળવવામાં નિષ્ફળ."
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:440
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:443
 #, csharp-format
 msgid "{0} song played"
 msgid_plural "{0} songs played"
 msgstr[0] "{0} ગીત વગાડેલ છે"
 msgstr[1] "{0} ગીતો વગાડેલ છે"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:560
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:83
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:575
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:84
 msgid "Recommended"
 msgstr "આગ્રહણીય"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:561
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:92
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:576
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:93
 msgid "Personal"
 msgstr "વ્યક્તિગત"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:562
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:101
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:577
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:102
 msgid "Loved"
 msgstr ""
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:563
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:578
 msgid "Banshee Group"
 msgstr "Banshee જૂથ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:564
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:110
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:579
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:111
 msgid "Neighbors"
 msgstr "પાડોશીઓ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:84
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:93
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:580
+msgid "Creative Commons"
+msgstr ""
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:85
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:94
 msgid "For User:"
 msgstr "વપરાશકર્તા માટે:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:102
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:103
 msgid "By User:"
 msgstr "વપરાશકર્તા દ્દારા:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:111
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:112
 msgid "Of User:"
 msgstr "વપરાશકર્તાનું:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:119
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:120
 msgid "Group"
 msgstr "જૂથ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:120
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:121
 msgid "Group Name:"
 msgstr "જૂથ નામ:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:128
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:129
 msgid "Tag"
 msgstr "ટેગ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:129
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:130
 msgid "Tag Name:"
 msgstr "ટેગ નામ:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:137
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:138
 msgid "Fan"
 msgstr "ચાહક"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:138
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:139
 msgid "Fans of:"
 msgstr "નાં ચાહકો:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:146
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:147
 msgid "Similar"
 msgstr "સરખુ"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:147
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:148
 msgid "Similar to:"
 msgstr "નાં જેવુ:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationActions.cs:66
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationActions.cs:67
-msgid "Show Recommendations"
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:156
+msgid "lastfm:// URL"
+msgstr "lastfm:// URL"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:157
+msgid "lastfm://"
+msgstr "lastfm://"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/ContextPage.cs:44
+#, fuzzy
+#| msgid "Show Recommendations"
+msgid "Last.fm Recommendations"
 msgstr "આગ્રહો બતાવો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:79
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:81
 #, csharp-format
 msgid "Top Albums by {0}"
 msgstr "{0} પ્રમાણે ટોચના ટ્રેકો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:80
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:82
 #, csharp-format
 msgid "Top Tracks by {0}"
 msgstr "{0} પ્રમાણે ટોચના ટ્રેકો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:161
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:179
 msgid "Recommended Artists"
 msgstr "આગ્રહણીય કલાકારો"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:188
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs:207
 msgid "No similar artists found"
 msgstr "કોઈ આવા કલાકારો મળ્યા નહિં"
 
@@ -3569,20 +4548,16 @@ msgstr "સ્ટેશન પ્રકાર (_T):"
 msgid "_Mini Mode"
 msgstr ""
 
-#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:73
-msgid "Banshee Music Player"
-msgstr "Banshee મ્યુઝીક પ્લેયર"
-
-#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:136
+#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:127
 msgid "Switch back to full mode"
 msgstr "સંપૂર્ણ સ્થિતિમાં બદલાઈ જાવ"
 
-#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:137
+#: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:128
 msgid "Change repeat playback mode"
 msgstr "પુનરાવર્તીય પ્લેબેક સ્થિતિ બદલો"
 
 #: ../src/Extensions/Banshee.MiniMode/Resources/minimode.glade.h:1
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs:64
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs:65
 msgid "Banshee"
 msgstr "Banshee"
 
@@ -3594,27 +4569,33 @@ msgstr "વર્તમાન સ્રોત:"
 msgid "Full Mode"
 msgstr "સંપૂર્ણ સ્થિતિ"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:116
-msgid "_Close"
-msgstr "બંધ કરો (_C)"
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:62
+msgid "Music Library"
+msgstr "મ્યુઝીક લાઈબ્રેરી"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:117
-msgid "Close"
-msgstr "બંધ કરો"
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:78
+msgid "Play Queue"
+msgstr "કતારને વગાડો"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+#| msgid "_Media"
+msgid "Media"
+msgstr "મીડિયા"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:123
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "સૂચનો બતાવો (_S)"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:124
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:133
 msgid "Show notifications when item changes"
 msgstr "જ્યારે વસ્તુ બદલાય ત્યારે સૂચનો બતાવો"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:297
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:334
 msgid "Still Running"
 msgstr "હજુ પણ ચાલી રહ્યું છે"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:298
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:335
 msgid ""
 "Banshee was closed to the notification area. Use the <i>Quit</i> option to "
 "end your session."
@@ -3622,100 +4603,214 @@ msgstr ""
 "Banshee સૂચન વિસ્તારમાં બંધ થયું હતું. તમારા સત્રનો અંત કરવા માટે <i>બહાર નીકળો</i> "
 "વિકલ્પ વાપરો."
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:402
-#: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:52
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:457
+#: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:48
 msgid "Now Playing"
 msgstr "હમણાં વગાડી રહ્યા છે"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:407
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "આ વસ્તુને છોડો"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:413
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "સૂચન બતાવી શકતા નથી"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:62
-msgid "Play Queue"
-msgstr "કતારને વગાડો"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:143
+#, fuzzy, csharp-format
+msgid "Unable to import track: {0}"
+msgstr "{0} માંથી ટ્રેક આયાત કરી શકતા નથી"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:68
-msgid "Remove From Play Queue"
-msgstr "વગાડવાની કતારમાંથી દૂર કરો"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:177
+msgid "Importing from Amarok failed"
+msgstr "Amarok નિષ્ફળ થયેલ માંથી આયાત કરી રહ્યા છે"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:188
+msgid "Amarok"
+msgstr "Amarok"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
+#, fuzzy
+msgid "Unable to import song."
+msgstr "{0} માંથી ટ્રેક આયાત કરી શકતા નથી"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
+#| msgid "Banshee Music Player"
+msgid "Rhythmbox Music Player"
+msgstr "Rhythmbox મ્યુઝીક પ્લેયર"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
+#, fuzzy
+#| msgid "imported"
+msgid "iTunes Importer"
+msgstr "આયાત થયેલ"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
+#| msgid "Import a playlist"
+msgid "Import _playlists"
+msgstr "પ્લેલીસ્ટો ને આયાત કરો (_p)"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
+#, csharp-format
+msgid "Locate your \"{0}\" file..."
+msgstr "તમારી \"{0}\" ફાઇલને સ્થાપિત કરો..."
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
+#, fuzzy, csharp-format
+#| msgid "Loading {0}"
+msgid "Locate \"{0}\""
+msgstr "{0} ને લોડ કરી રહ્યા છીએ"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:389
+msgid "Locate iTunes Music Directory"
+msgstr "iTunes સંગીત ડિરેક્ટરીને સ્થાપિત કરો"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:391
+#, csharp-format
+msgid ""
+"The iTunes library refers to your music directory as \"{0}\" but Banshee was "
+"not able to infer the location of this directory. Please locate it."
+msgstr ""
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
+#, fuzzy
+#| msgid "Media Player"
+msgid "iTunes Media Player"
+msgstr "મીડિયા પ્લેયર"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:395
+msgid ""
+"Banshee is not familiar with this version of the iTunes library format. "
+"Importing may or may not work as expected, or at all. Would you like to "
+"attempt to import anyway?"
+msgstr ""
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:47
+msgid "manually"
+msgstr ""
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:48
+msgid "by song"
+msgstr ""
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:49
+#| msgid "album"
+msgid "by album"
+msgstr "આલ્બમ દ્દારા"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:50
+#| msgid "artist"
+msgid "by artist"
+msgstr "કલાકાર દ્દારા"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:82
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:51
+msgid "by rating"
+msgstr "ક્રમાંકન દ્દારા"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:52
+msgid "by score"
+msgstr ""
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:59
+msgid "_Fill"
+msgstr "ભરવું (_F)"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:73
+#| msgid "from"
+msgid "f_rom"
+msgstr "તરફથી (_r)"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:49
 msgid "Add to Play Queue"
 msgstr "વગાડવાની કતારમાં ઉમેરો"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:83
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:50
 #, fuzzy
 msgid "Append selected songs to the play queue"
 msgstr "પસંદિત ગીતોને પ્લેલીસ્ટમાં ઉમેરો કે પસંદગીમાંથી નવું પ્લેલીસ્ટ બનાવો"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:90
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
+#, fuzzy
+#| msgid "Remove all tracks from the play queue"
+msgid "Refresh random tracks in the play queue"
+msgstr "વગાડવાનાં કતારમાંથી બધા ટ્રેકોને દૂર કરો"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
+msgid "Add More"
+msgstr "વધારે ઉમેરો"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
+#, fuzzy
+#| msgid "Remove all tracks from the play queue"
+msgid "Add more random tracks to the play queue"
+msgstr "વગાડવાનાં કતારમાંથી બધા ટ્રેકોને દૂર કરો"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:71
 msgid "Remove all tracks from the play queue"
 msgstr "વગાડવાનાં કતારમાંથી બધા ટ્રેકોને દૂર કરો"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:97
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:78
 msgid "Clear the play queue when quitting"
 msgstr "જ્યારે બહાર નીકળી રહ્યા હોય ત્યારે વગાડવાની કતારને સાફ કરો"
 
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:87
+msgid "Remove From Play Queue"
+msgstr "વગાડવાની કતારમાંથી દૂર કરો"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:752
+msgid "Number of _played songs to show"
+msgstr "બતાવવા માટે વગાડેલ ગીતોની સંખ્યા (_p)"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:758
+msgid "Number of _upcoming songs to show"
+msgstr ""
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
+msgid "Podcast"
+msgstr "પોડકાસ્ટ"
+
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:69
 #, csharp-format
 msgid "All Podcasts ({0})"
 msgstr "બધા Podcasts ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:96
-msgid "Podcasts"
-msgstr "પોડકાસ્ટ"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:158
-msgid "Downloading"
-msgstr "ડાઉનલોડ કરી રહ્યા છે"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:159
-msgid "Waiting to download"
-msgstr "ડાઉનલોડ માટે રાહ જોઇ રહ્યા છે"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:160
-msgid "Download paused"
-msgstr "ડાઉનલોડ અટકાવેલ છે"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
+msgid "Published"
+msgstr "પ્રકાશિત થયેલ"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:161
-msgid "Download failed"
-msgstr "ડાઉનલોડ નિષ્ફળ થયેલ છે"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+msgid "New"
+msgstr "નવું"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:164
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
 msgid "Downloaded"
 msgstr "ડાઉનલોડ થયેલ"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:165
-msgid "Stream Available"
-msgstr "સ્ટ્રીમ ઉપલ્બધ"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:167
-msgid "New"
-msgstr "નવું"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:169
-#, fuzzy
-msgid "Watched"
-msgstr "સરખાવો (_M)"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:58
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:58
+msgid "All Items"
+msgstr "બધી વસ્તુઓ"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:170
-msgid "Heard"
-msgstr "સંભળાયેલ"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:59
+#| msgid "Downloaded"
+msgid "Not Downloaded"
+msgstr "ડાઉનલોડ થયેલ નથી"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:111
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:113
 msgid "Never updated"
 msgstr "ક્યારેય નહિં સુધારેલ"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:113
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:115
 #, csharp-format
 msgid "Updated at {0}"
 msgstr "{0} પર સુધારેલ છે"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:115
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs:117
 #, csharp-format
 msgid "Updated {0}"
 msgstr "સુધારેલ {0}"
@@ -3724,10 +4819,6 @@ msgstr "સુધારેલ {0}"
 msgid "New Items"
 msgstr "નવી વસ્તુઓ"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:58
-msgid "All Items"
-msgstr "બધી વસ્તુઓ"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:59
 msgid "Old Items"
 msgstr "જૂની વસ્તુઓ"
@@ -3750,8 +4841,8 @@ msgstr "બધા podcast ડાઉનલોડો ને રદ કરો?"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:120
 #, fuzzy, csharp-format
-msgid "Currently transfering {0} file at {1} KB/s"
-msgid_plural "Currently transfering {0} files at {1} KB/s"
+msgid "Transferring {0} file at {1} KB/s"
+msgid_plural "Transferring {0} of {2} files at {1} KB/s"
 msgstr[0] ""
 "વર્તમાનમાં 1 ફાઈલ {0} kB/s ઝડપે પરિવહન કરી રહ્યા છીએવર્તમાનમાં {1} ફાઈલો {0} kB/s "
 "ઝડપે પરિવહન કરી રહ્યા છીએ"
@@ -3767,102 +4858,115 @@ msgstr "ડાઉનલોડ રદ કરી રહ્યા છીએ"
 msgid "Waiting for downloads to terminate..."
 msgstr "ડાઉનલોડને બંધ થવા માટે રાહ જોઈ રહ્યા છીએ..."
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:68
-msgid "Update Podcasts"
-msgstr "પોડકાસ્ટ સુધારો"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:66
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:90
+msgid "Check for New Episodes"
+msgstr "નવાં ભાગ(ઓ) માટે ચકાસો"
 
 #. "<control><shift>U",
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:69
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:67
 msgid "Refresh All Podcasts"
 msgstr "બધા પોડકાસ્ટ ને તાજુ કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:74
-msgid "Subscribe to Podcast"
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:72
+#, fuzzy
+#| msgid "Subscribe to Podcast"
+msgid "Subscribe to Podcast..."
 msgstr "પોડકાસ્ટમાં ઉમેદવારી નોંધાવો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:75
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:73
 msgid "Subscribe to a new podcast"
 msgstr "નવા પોડકાસ્ટમાં ઉમેદવારી નોંધાવો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:86
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:84
 msgid "Unsubscribe and Delete"
 msgstr "ઉમેદવારી ન કરો અને કાઢી નાંખો"
 
-#. Translators: this is a verb used as a button name, not a noun
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:93
-msgid "Check for New Episodes"
-msgstr "નવાં ભાગ(ઓ) માટે ચકાસો"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:99
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:96
 msgid "Download All Episodes"
 msgstr "બધા ભાગો ડાઉનલોડ કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:105
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:102
 msgid "Visit Podcast Homepage"
 msgstr "પોડકાસ્ટ ઘરપાનાંની મુલાકાત લો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:111
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:153
-msgid "Properties"
-msgstr "ગુણધર્મો"
-
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:117
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:114
 msgid "Mark as New"
 msgstr "નવા તરીકે ચિહ્નિત કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:123
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:120
 msgid "Mark as Old"
 msgstr "જૂના તરીકે ચિહ્નિત કરો"
 
 #. Translators: this is a verb used as a button name, not a noun
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:129
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:126
 msgid "Download Podcast(s)"
 msgstr "પોડકાસ્ટ (ઓ) ને ડાઉનલોડ કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:135
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:132
 msgid "Cancel Download"
 msgstr "ડાઉનલોડ રદ કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:141
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:138
 msgid "Remove Downloaded File(s)"
 msgstr "ડાઉનલોડ થયેલ ફાઇલ (ઓ) ને દૂર કરો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:147
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:144
 msgid "Visit Website"
 msgstr "વેબસાઇટની મુલાકાત લો"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:260
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:156
+msgid "Subscribe to Podcast"
+msgstr "પોડકાસ્ટમાં ઉમેદવારી નોંધાવો"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:316
 msgid "Invalid URL"
 msgstr "અયોગ્ય URL"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:261
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:317
 msgid "Podcast URL is invalid."
 msgstr "પોડકાસ્ટ URL અયોગ્ય છે."
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:78
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:87
+#| msgid "Authors:"
+msgid "Author"
+msgstr "લેખક"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:109
+#, fuzzy
+#| msgid "Error Details"
+msgid "Episode Details"
+msgstr "ક્ષતિ વિગતો"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:83
 msgid "Last updated:"
 msgstr "છેલ્લે સુધારેલ:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:82
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:83
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:87
+#| msgid "Podcast:"
+msgid "Podcast Name:"
+msgstr "પોડકાસ્ટ નામ:"
+
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:97
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:85
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:146
 msgid "URL:"
 msgstr "URL:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:86
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:101
 msgid "When feed is updated:"
 msgstr "જ્યારે અભિપ્રાય સુધારાય છે:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:102
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:103
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs:117
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:105
 msgid "No description available"
 msgstr "કોઈ વર્ણન ઉપલબ્ધ નથી"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:75
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:77
 msgid "Podcast:"
 msgstr "પોડકાસ્ટ:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:79
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:81
 msgid "Date:"
 msgstr "તારીખ:"
 
@@ -3896,6 +5000,12 @@ msgstr "એકદમ છેલ્લો ભાગ ડાઉનલોડ કર
 msgid "Let me decide which episodes to download"
 msgstr "મને નક્કી કરવા દો કે કયા ભાગો ડાઉનલોડ કરવા છે"
 
+#: ../src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteSpeakersWidget.cs:51
+#, fuzzy
+#| msgid "_Search:"
+msgid "_Speaker:"
+msgstr "શોધો (_S):"
+
 #: ../src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs:40
 msgid "Sample"
 msgstr "નમૂનો"
@@ -3912,20 +5022,27 @@ msgstr "SQL મોનીટરીંગને શરૂ કરો"
 msgid "Stop SQL Monitoring"
 msgstr "SQL મોનીટરીંગને બંધ કરો"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:465
+#: ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/ContextPage.cs:44
+#, fuzzy
+#| msgid "skipped"
+msgid "Wikipedia"
+msgstr "છોડેલ છે"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:551
 #, csharp-format
-msgid "Hide {0}"
-msgstr "{0} છુપાવો"
+#| msgid "Hide {0}"
+msgid "Hide <i>{0}</i>"
+msgstr "<i>{0}</i> છુપાવો"
 
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:52
 msgid "Banshee Encountered a Fatal Error"
 msgstr "Banshee ને ઘાતક ભૂલ મળી આવી"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:89
+#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:90
 msgid "Error Details"
 msgstr "ક્ષતિ વિગતો"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:133
+#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:134
 msgid "An unhandled exception was thrown: "
 msgstr "એક અનિયંત્રિત અપવાદ ફેકાયો હતો: "
 
@@ -3937,10 +5054,6 @@ msgstr "એસેમ્બલી આવૃત્તિ જાણકારી"
 msgid "Assembly Name"
 msgstr "એસેમ્બલી નામ"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
-msgid "bytes"
-msgstr "બાઇટો"
-
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:62
 msgid "KB"
 msgstr "KB"
@@ -3969,7 +5082,7 @@ msgstr "નીચેનામાંનુ:"
 msgid "_Limit to"
 msgstr "સુધી મર્યાદા (_L)"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs:82
+#: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs:85
 msgid "selected by"
 msgstr "દ્વારા પસંદિત"
 
@@ -4010,12 +5123,12 @@ msgid "after"
 msgstr "પછી"
 
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:41
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:43
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:45
 msgid "is"
 msgstr "છે"
 
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:42
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:44
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:46
 msgid "is not"
 msgstr "છે નથી"
 
@@ -4044,24 +5157,24 @@ msgstr "કરતાં વધુ"
 msgid "empty"
 msgstr "ખાલી"
 
-#: ../src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs:88
+#: ../src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs:90
 #, csharp-format
 msgid "{0} ago"
 msgstr "{0} અગાઉ"
 
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:41
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:43
 msgid "contains"
 msgstr "સમાવે છે"
 
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:42
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:44
 msgid "doesn't contain"
 msgstr "સમાવતું નથી"
 
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:45
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:47
 msgid "starts with"
 msgstr "થી શરૂ થાય"
 
-#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:46
+#: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:48
 msgid "ends with"
 msgstr "થી અંત થાય છે"
 
@@ -4085,7 +5198,7 @@ msgstr "સંગ્રહો અને માં પ્રવેશો"
 msgid "Sign up for Last.fm"
 msgstr ""
 
-#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:439
+#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:446
 #: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:458
 msgid "Last.fm username or password is invalid."
 msgstr "Last.fm વપરાશકર્તા નામ અથવા પાસવર્ડ અયોગ્ય છે."
diff --git a/po/it.po b/po/it.po
index b5ce263..0413240 100644
--- a/po/it.po
+++ b/po/it.po
@@ -9,8 +9,8 @@ msgstr ""
 "Project-Id-Version: Banshee 1.5\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=banshee&component=general\n"
-"POT-Creation-Date: 2009-07-02 22:06+0000\n"
-"PO-Revision-Date: 2009-06-18 12:38+0200\n"
+"POT-Creation-Date: 2009-10-17 15:05+0000\n"
+"PO-Revision-Date: 2009-10-18 12:47+0200\n"
 "Last-Translator: Gianvito Cavasoli <janvitus at ubuntu-it.org>\n"
 "Language-Team: Italian <tp at lists.linux.it>\n"
 "MIME-Version: 1.0\n"
@@ -66,42 +66,32 @@ msgid "Constant Bitrate"
 msgstr "Bitrate costante"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:6
-#, fuzzy
-#| msgid "Extra"
 msgid "Extreme"
-msgstr "Supplementari"
+msgstr "Estrema"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:7
-#, fuzzy
-#| msgid "name"
 msgid "Insane"
-msgstr "nome"
+msgstr "Folle"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:8
-#, fuzzy
-#| msgid "New Preset"
 msgid "LAME Preset"
-msgstr "Nuova preselezione"
+msgstr "Preselezione LAME"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:9
 msgid "MP3 (LAME Encoder)"
 msgstr "MP3 (codificatore LAME)"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:10
-#, fuzzy
-#| msgid "_Media"
 msgid "Medium"
-msgstr "M_ultimediale"
+msgstr "Media"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:11
-#, fuzzy
-#| msgid "New Preset"
 msgid "Preset"
-msgstr "Nuova preselezione"
+msgstr "Preselezione"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:12
 msgid "Standard"
-msgstr ""
+msgstr "Predefinita"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:13
 msgid "VBR Mode"
@@ -212,7 +202,7 @@ msgid ""
 "size than MP3. A 96 kbps WMA is equivalent to a 128 kbps MP3."
 msgstr ""
 "Formato audio proprietario con perdita che crea file audio di alta qualità "
-"con dimensioni minori dell'MP3. Un WMA a 96 kbps equivale a un MP3 di 128 "
+"con dimensioni minori dell'MP3. Un WMA a 96 kbps equivale a un MP3 a 128 "
 "kbps."
 
 #: ../data/audio-profiles/wma.xml.in.h:2
@@ -401,7 +391,7 @@ msgstr "Mostra opzioni per gli sviluppatori e il debug"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:153
 msgid "Show all option groups"
-msgstr "Mostra tutte le opzioni dei gruppi"
+msgstr "Mostra tutti i gruppi di opzioni"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:154
 msgid "Show version information"
@@ -465,7 +455,7 @@ msgstr "Scorre a un punto specifico (secondi, float)"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:171
 msgid "Player Engine Query Options"
-msgstr "Opzioni delle verifiche del motore del riproduttore"
+msgstr "Opzioni delle interrogazioni del motore del riproduttore"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:172
 msgid "Current player state"
@@ -493,24 +483,27 @@ msgstr "Posizione del riproduttore nella traccia corrente"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:180
 msgid "Playing Track Metadata Query Options"
-msgstr "Opzioni di verifica dei metadati della traccia in riproduzione"
+msgstr "Opzioni di interrogazione dei metadati della traccia in riproduzione"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:181
 msgid "URI"
 msgstr "URI"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:149
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "Nome dell'artista"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:150
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "Titolo dell'album"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:148
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "Titolo della traccia"
 
@@ -535,9 +528,10 @@ msgid "Disc Number"
 msgstr "Numero del disco"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:189
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "Anno"
 
@@ -551,50 +545,54 @@ msgstr "Giudizio"
 msgid "Score"
 msgstr "Punteggio"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:194
+#. Translators: noun
+#: ../src/Clients/Booter/Booter/Entry.cs:192
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
+msgid "Bit Rate"
+msgstr "Bitrate"
+
+#: ../src/Clients/Booter/Booter/Entry.cs:195
 msgid "User Interface Options"
 msgstr "Opzioni dell'interfaccia utente"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:195
+#: ../src/Clients/Booter/Booter/Entry.cs:196
 msgid "Present the user interface on the active workspace"
 msgstr "Presenta l'interfaccia utente sullo spazio di lavoro attivo"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:196
+#: ../src/Clients/Booter/Booter/Entry.cs:197
 msgid "Hide the user interface"
 msgstr "Nasconde l'interfaccia utente"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:197
+#: ../src/Clients/Booter/Booter/Entry.cs:198
 msgid "Do not present the user interface, regardless of any other options"
 msgstr ""
 "Non presenta l'interfaccia utente, indipendentemente da ogni altra opzione"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:200
+#: ../src/Clients/Booter/Booter/Entry.cs:201
 msgid "Debugging and Development Options"
 msgstr "Opzioni di debug e sviluppo"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:201
+#: ../src/Clients/Booter/Booter/Entry.cs:202
 msgid "Enable general debugging features"
 msgstr "Abilita le funzioni generali di debug"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:202
+#: ../src/Clients/Booter/Booter/Entry.cs:203
 msgid "Enable debugging output of SQL queries"
-msgstr "Abilita l'output di debug delle verifiche di SQL"
+msgstr "Abilita l'output di debug delle interrogazioni di SQL"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:203
+#: ../src/Clients/Booter/Booter/Entry.cs:204
 msgid "Enable debugging output of Mono.Addins"
 msgstr "Abilita l'output di debug di Mono.Addins"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:204
+#: ../src/Clients/Booter/Booter/Entry.cs:205
 msgid "Specify an alternate database to use"
 msgstr "Specifica un database alternativo da usare"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:205
-#, fuzzy
-#| msgid "Specify an alternate database to use"
+#: ../src/Clients/Booter/Booter/Entry.cs:206
 msgid "Specify an alternate key, default is /apps/banshee-1/"
-msgstr "Specifica un database alternativo da usare"
+msgstr "Specifica una chiave alternativa, la predefinita è /apps/banshee-1/"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:206
+#: ../src/Clients/Booter/Booter/Entry.cs:207
 msgid ""
 "Optimize instance for running uninstalled; most notably, this will create an "
 "alternate Mono.Addins database in the working directory"
@@ -603,16 +601,16 @@ msgstr ""
 "particolare questo creerà un database alternativo di Mono.Addins nella "
 "directory di lavoro"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:208
+#: ../src/Clients/Booter/Booter/Entry.cs:209
 msgid "Disable DBus support completely"
 msgstr "Disabilita completamente il supporto a DBus"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:210
+#: ../src/Clients/Booter/Booter/Entry.cs:211
 #, csharp-format
 msgid "Skip loading a custom gtkrc file ({0}) if it exists"
 msgstr "Salta il caricamento del file gtkrc personalizzato ({0}) se esiste"
 
-#: ../src/Clients/Booter/Booter/Entry.cs:241
+#: ../src/Clients/Booter/Booter/Entry.cs:242
 #, csharp-format
 msgid "The following help arguments are invalid: {0}"
 msgstr "I seguenti argomenti di aiuto non sono validi: {0}"
@@ -648,13 +646,13 @@ msgid "Add an album to the playlist"
 msgstr "Aggiunge un album alla scaletta"
 
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:76
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:177
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
 msgid "Banshee Media Player"
-msgstr "Banshee - Riproduttore multimediale"
+msgstr "Riproduttore multimediale Banshee"
 
-#: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:254
+#: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:252
 #, csharp-format
 msgid "{0} remaining"
 msgstr "{0} rimanenti"
@@ -663,23 +661,31 @@ msgstr "{0} rimanenti"
 msgid "Play Song"
 msgstr "Riproduce il brano"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:89
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:92
 msgid "_Search:"
 msgstr "Ce_rca:"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:147
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "Artista, album o titolo"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:155
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "Genere"
 
+#. Translators: noun
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:157
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
+msgid "Comment"
+msgstr "Commento"
+
 #. Translators: this is a verb (command), not a noun (things)
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:173
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:178
 #, csharp-format
 msgid "Filter Results"
 msgstr "Filtra i risultati"
@@ -708,11 +714,11 @@ msgstr "Artista della traccia"
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:95
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:105
 msgid "Album Artist"
-msgstr "Artista album"
+msgstr "Artista dell'album"
 
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:100
 msgid "Album Artist Initial"
-msgstr "Iniziale artista album"
+msgstr "Iniziale artista dell'album"
 
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:110
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:63
@@ -750,37 +756,37 @@ msgid "Various Artists"
 msgstr "Artisti vari"
 
 #. TODO turn this into a PrimarySource-owned delegate?
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:517
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:522
 msgid "_Restart Podcast"
 msgstr "Riav_via podcast"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:518
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:523
 msgid "_Restart Video"
 msgstr "Riav_via video"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:519
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:524
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
 msgid "_Restart Song"
 msgstr "Riav_via brano"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:520
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:525
 msgid "_Restart Item"
 msgstr "Riav_via elemento"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:534
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:539
 msgid "_Jump to Playing Podcast"
 msgstr "_Vai al podcast in riproduzione"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:535
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:540
 msgid "_Jump to Playing Video"
 msgstr "_Vai al video in riproduzione"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:536
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:541
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
 msgid "_Jump to Playing Song"
 msgstr "_Vai al brano in riproduzione"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:537
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:542
 msgid "_Jump to Playing Item"
 msgstr "_Vai all'elemento in riproduzione"
 
@@ -799,7 +805,7 @@ msgid "Scanning for media"
 msgstr "Scansione dei file multimediali"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1180
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1206
 msgid "Scanning..."
 msgstr "Scansione..."
 
@@ -838,7 +844,7 @@ msgid ""
 "Please wait while your old Banshee database is migrated to the new format."
 msgstr "Attendere che il vecchio database di Banshee migri al nuovo formato."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1177
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1203
 msgid "Refreshing Metadata"
 msgstr "Aggiornamento dei metadati"
 
@@ -856,98 +862,100 @@ msgstr "Rimuovi dalla libreria"
 msgid "{0} Folder"
 msgstr "Cartella {0}"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:45
-msgid "Music Library"
-msgstr "Discoteca"
+#. Catalog.GetString ("Music Library")
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:46
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/MusicGroupSource.cs:38
+msgid "Music"
+msgstr "Musica"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:61
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:62
 msgid "File System Organization"
 msgstr "Organizzazione del file system"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:64
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:65
 msgid "Folder hie_rarchy"
 msgstr "_Gerarchia cartelle"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:67
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:68
 msgid "File _name"
 msgstr "_Nome del file"
 
 #. Misc section
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:69
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:70
 #: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:63
 msgid "Miscellaneous"
 msgstr "Varie"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:86
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:84
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "Preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr "Brani giudicati con quattro o cinque stelle"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:91
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "Preferiti recenti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr "Brani ascoltati spesso nelle passata settimana"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:96
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
 msgid "Recently Added"
 msgstr "Aggiunti di recente"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "Brani importati nell'ultima settimana"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:101
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "Non ascoltati"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
 msgstr "Brani che non sono stati riprodotti o saltati"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "Preferiti dimenticati"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
 msgid "Favorites not played in over two months"
 msgstr "Preferiti non riprodotti da oltre due mesi"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:113
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "Meno preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr "Brani giudicati con una o due stelle o frequentemente saltati"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:118
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "700 MB di preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr "Un pregevole CD di dati con brani preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "80 minuti di preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr "Un pregevole CD audio con brani preferiti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr "Non giudicati"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr "Brani non ancora giudicati"
 
@@ -960,23 +968,25 @@ msgstr "Importazione dei brani"
 msgid "Importing From {0}"
 msgstr "Importazione da {0}"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:42
-msgid "Video Library"
-msgstr "Videoteca"
+#. Catalog.GetString ("Video Library")
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:43
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs:38
+msgid "Videos"
+msgstr "Video"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:63
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:64
 msgid "Produced By"
 msgstr "Prodotto da"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:86
 msgid "Videos rated four and five stars"
 msgstr "Video giudicati con quattro o cinque stelle"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:89
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:90
 msgid "Unwatched"
 msgstr "Non visti"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:90
+#: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:91
 msgid "Videos that haven't been played yet"
 msgstr "Video non ancora riprodotti"
 
@@ -1039,6 +1049,27 @@ msgstr ""
 "L'attivazione di questa opzione garantisce che i file e le cartelle verranno "
 "rinominati in accordo con i metadati."
 
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:129
+msgid "Write _ratings and play counts to files"
+msgstr "Scrivere i _giudizi e i contatori di riproduzione nei file"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:130
+msgid ""
+"Enable this option to save rating and play count metadata inside supported "
+"audio files whenever the rating is changed."
+msgstr ""
+"Abilitare questa opzione per salvare i metadati di giudizi e i  contatori di "
+"riproduzione all'interno dei file audio supportati ogni qualvolta cambia il "
+"giudizio."
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:131
+msgid "Import _ratings"
+msgstr "Importa _giudizi"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:132
+msgid "Import play _counts"
+msgstr "Importare _contatori di riproduzione"
+
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:52
 msgid "There is no available network connection"
 msgstr "Nessuna connessione di rete disponibile"
@@ -1063,6 +1094,12 @@ msgstr ""
 "Alcune funzionalità richiedono una connessione Internet a banda larga come "
 "Last.fm o il recupero delle copertine"
 
+#: ../src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:219
+msgid "The track's rating was set differently on the device and in Banshee"
+msgstr ""
+"Il giudizio della traccia è stato impostato in modo differente sul "
+"dispositivo e nell'applicazione"
+
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:59
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:314
 msgid "Playlist"
@@ -1139,7 +1176,7 @@ msgstr "Artista"
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
 #: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:659
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:78
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:88
 msgid "Name"
 msgstr "Nome"
 
@@ -1169,11 +1206,11 @@ msgstr "Riprodotto meno spesso"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
 msgid "Most Recently Played"
-msgstr "Riprodotte più recentemente"
+msgstr "Riprodotto più recentemente"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:79
 msgid "Least Recently Played"
-msgstr "Riprodotte meno recentemente"
+msgstr "Riprodotto meno recentemente"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:81
 msgid "Most Recently Added"
@@ -1207,7 +1244,7 @@ msgstr "MB"
 msgid "GB"
 msgstr "GB"
 
-#. Translators: These are unique search aliases for "artist".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:99
 msgid "artist"
 msgstr "artista"
@@ -1220,7 +1257,7 @@ msgstr "di"
 msgid "artists"
 msgstr "artisti"
 
-#. Translators: These are unique search aliases for "album artist".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "album artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:107
 msgid "albumartist"
 msgstr "artistaalbum"
@@ -1229,7 +1266,7 @@ msgstr "artistaalbum"
 msgid "compilationartist"
 msgstr "compilationartista"
 
-#. Translators: These are unique search aliases for "album".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "album". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "album"
 msgstr "album"
@@ -1246,7 +1283,7 @@ msgstr "da"
 msgid "Disc"
 msgstr "Disco"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "disc"
 msgstr "disco"
@@ -1263,7 +1300,7 @@ msgstr "numerodisco"
 msgid "Disc Count"
 msgstr "Contatore disco"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:133
 msgid "discs"
 msgstr "dischi"
@@ -1272,7 +1309,7 @@ msgstr "dischi"
 msgid "cds"
 msgstr "cd"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:142
 msgid "track"
 msgstr "traccia"
@@ -1285,7 +1322,7 @@ msgstr "numerotraccia"
 msgid "tracknum"
 msgstr "traccianum"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:151
 msgid "tracks"
 msgstr "tracce"
@@ -1298,17 +1335,12 @@ msgstr "contatoretraccia"
 msgid "Beats per Minute"
 msgstr "Battiti per minuto"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:159
 msgid "bpm"
 msgstr "bpm"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:166
-msgid "Bit Rate"
-msgstr "Bitrate"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:168
 msgid "bitrate"
 msgstr "bitrate"
@@ -1321,7 +1353,7 @@ msgstr "kbs"
 msgid "kps"
 msgstr "kps"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "title"
 msgstr "titolo"
@@ -1338,7 +1370,7 @@ msgstr "nome"
 msgid "named"
 msgstr "nominato"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:184
 msgid "year"
 msgstr "anno"
@@ -1351,7 +1383,7 @@ msgstr "rilasciato"
 msgid "yr"
 msgstr "yr"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:192
 msgid "genre"
 msgstr "genere"
@@ -1360,7 +1392,7 @@ msgstr "genere"
 msgid "Composer"
 msgstr "Compositore"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:199
 msgid "composer"
 msgstr "compositore"
@@ -1369,7 +1401,7 @@ msgstr "compositore"
 msgid "Conductor"
 msgstr "Conduttore"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:206
 msgid "conductor"
 msgstr "conduttore"
@@ -1378,17 +1410,12 @@ msgstr "conduttore"
 msgid "Grouping"
 msgstr "Raggruppamento"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:213
 msgid "grouping"
 msgstr "raggruppamento"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
-msgid "Comment"
-msgstr "Commento"
-
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:221
 msgid "comment"
 msgstr "commento"
@@ -1398,7 +1425,7 @@ msgstr "commento"
 msgid "License"
 msgstr "Licenza"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:229
 msgid "license"
 msgstr "licenza"
@@ -1412,7 +1439,7 @@ msgid "under"
 msgstr "sotto"
 
 #. , typeof(NullQueryValue)},
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:237
 msgid "rating"
 msgstr "giudizio"
@@ -1425,7 +1452,7 @@ msgstr "stelle"
 msgid "Play Count"
 msgstr "Contatore riproduzioni"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:245
 msgid "plays"
 msgstr "riproduzioni"
@@ -1442,7 +1469,7 @@ msgstr "ascolti"
 msgid "Skip Count"
 msgstr "Contatore salti"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:253
 msgid "skips"
 msgstr "salti"
@@ -1455,7 +1482,7 @@ msgstr "contatoresalti"
 msgid "File Size"
 msgstr "Dimensione file"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:261
 msgid "size"
 msgstr "dimensione"
@@ -1468,7 +1495,7 @@ msgstr "dimensionefile"
 msgid "File Location"
 msgstr "Posizione del file"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "uri"
 msgstr "uri"
@@ -1489,7 +1516,7 @@ msgstr "posizione"
 msgid "Time"
 msgstr "Durata"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:277
 msgid "duration"
 msgstr "durata"
@@ -1506,7 +1533,7 @@ msgstr "tempo"
 msgid "Mime Type"
 msgstr "Tipo mime"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "type"
 msgstr "tipo"
@@ -1527,7 +1554,7 @@ msgstr "ext"
 msgid "Last Played"
 msgstr "Ultima riproduzione"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 msgid "lastplayed"
 msgstr "ultimariproduzione"
@@ -1538,13 +1565,13 @@ msgstr "riprodotto"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 msgid "playedon"
-msgstr "riproduzionesu"
+msgstr "riprodottoil"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:299
 msgid "Last Skipped"
 msgstr "Ultimo salto"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "lastskipped"
 msgstr "ultimosalto"
@@ -1555,16 +1582,16 @@ msgstr "salto"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "skippedon"
-msgstr "saltosu"
+msgstr "saltotoil"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:307
 msgid "Date Added"
 msgstr "Data di aggiunta"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "added"
-msgstr "aggiunti"
+msgstr "aggiunto"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "imported"
@@ -1572,7 +1599,7 @@ msgstr "importato"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "addedon"
-msgstr "aggiuntosu"
+msgstr "aggiuntoil"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "dateadded"
@@ -1587,7 +1614,7 @@ msgstr "importatoil"
 msgid "Smart Playlist"
 msgstr "Scaletta intelligente"
 
-#. Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:329
 msgid "score"
 msgstr "punteggio"
@@ -1606,10 +1633,10 @@ msgid "Plays"
 msgstr "Riproduzioni"
 
 #: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:309
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:154
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:370
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:200
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:376
 msgid "Unknown"
 msgstr "Sconosciuto"
 
@@ -1809,12 +1836,20 @@ msgstr "{0} kbps"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:119
 msgid "Make the context pane larger or smaller"
-msgstr "Rende il riquadro contestuale largo o piccolo"
+msgstr "Rende il riquadro contestuale grande o piccolo"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:123
 msgid "Hide context pane"
 msgstr "Nasconde il riquadro contestuale"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:144
+msgid "Waiting for playback to begin..."
+msgstr "In attesa che inizi la riproduzione..."
+
+#: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:150
+msgid "Loading..."
+msgstr "Caricamento..."
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs:52
 msgid "Equalizer"
 msgstr "Equalizzatore"
@@ -1829,7 +1864,7 @@ msgstr "Nuova preselezione"
 
 #. Translators: this is the window title when a track is playing
 #. {0} is the track title, {1} is the artist name
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:174
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:194
 #, csharp-format
 msgid "{0} by {1}"
 msgstr "{0} di {1}"
@@ -1958,7 +1993,7 @@ msgstr "Scansiona di nuovo la cartella della discoteca"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:67
 msgid "Open _Location..."
-msgstr "Apri _posizione..."
+msgstr "Apri posi_zione..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:68
 msgid "Open a remote location for playback"
@@ -2083,7 +2118,7 @@ msgstr "Scorri _a..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:79
 msgid "Seek to a specific location in current item"
-msgstr "Scorre a una specifica posizione del corrente elemento"
+msgstr "Scorre a una specifica posizione dell'attuale elemento"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:83
 msgid "Jump to the currently playing item"
@@ -2137,7 +2172,7 @@ msgstr "Riproduce tutti i brani prima di ripetere la scaletta"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:88
 msgid "Repeat Singl_e"
-msgstr "Ripeti sin_golarmente"
+msgstr "Ripeti s_ingolarmente"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:89
 msgid "Repeat the current playing song"
@@ -2171,8 +2206,7 @@ msgstr "Mischia per artist_a"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:92
 msgid "Play all songs by an artist, then randomly choose another artist"
 msgstr ""
-"Riproduce tutti i brani di un artista, quindi ne sceglie casualmente un "
-"altro."
+"Riproduce tutti i brani di un artista, dopo sceglie casualmente un altro"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:96
 msgid "Shuffle by A_lbum"
@@ -2184,16 +2218,20 @@ msgstr ""
 "Riproduce tutti i brani di un album, dopo sceglie casualmente un altro album"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:101
-#, fuzzy
-#| msgid "Shuffle by _Song"
 msgid "Shuffle by _Rating"
-msgstr "Mischia per _brano"
+msgstr "Mischia per gi_udizio"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:102
-#, fuzzy
-#| msgid "Play songs randomly from the playlist"
 msgid "Play songs randomly, prefer higher rated songs"
-msgstr "Riproduce casualmente i brani dalla scaletta"
+msgstr "Riproduce casualmente i brani, preferendo brani con giudizio alto"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:106
+msgid "Shuffle by S_core"
+msgstr "Mischia per pu_nteggio"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:107
+msgid "Play songs randomly, prefer higher scored songs"
+msgstr "Riproduce casualmente i brani, preferendo i brani con punteggio alto"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:73
 msgid "_New Playlist"
@@ -2258,6 +2296,7 @@ msgstr "Nuova scaletta intell_igente"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:122
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:74
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
 msgid "Refresh"
 msgstr "Ricarica"
 
@@ -2303,7 +2342,7 @@ msgid "Edit information on selected tracks"
 msgstr "Modifica informazioni delle tracce selezionate"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:188
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:234
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:108
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:150
 msgid "Properties"
@@ -2350,10 +2389,13 @@ msgstr "Elim_ina dall'unità"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:102
 msgid "Permanently delete selected item(s) from medium"
 msgstr ""
-"Elimina permanentemente l'elemento o gli elementi selezionati dal mezzo "
+"Elimina permanentemente l'elemento o gli elementi selezionati dal supporto "
 "multimediale"
 
+#. Translators: this is a verb (command), not a noun (things)
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "Cer_ca"
 
@@ -2446,59 +2488,59 @@ msgstr "Artist_a della traccia:"
 msgid "Set all compilation album artists to these values"
 msgstr "Imposta tutti gli artisti dell'album compilation a questo valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:100
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:106
 msgid "Set all album titles to this value"
 msgstr "Imposta tutti i titoli degli album a questo valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:101
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:107
 msgid "Albu_m Title:"
 msgstr "Titolo dell'albu_m:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:107
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:113
 msgid "Set all genres to this value"
 msgstr "Imposta tutti i generi a questo valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:108
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:114
 msgid "_Genre:"
 msgstr "_Genere:"
 
 #. Right
 #. Translators: "of" is the word beteen a track/disc number and the total count.
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:116
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:148
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:122
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:154
 msgid "of"
 msgstr "di"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:132
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:138
 msgid "Automatically set track number and count"
 msgstr "Imposta automaticamente il numero e il contatore di traccia"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:134
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:140
 msgid "Track _Number:"
 msgstr "Numer_o della traccia:"
 
 #. Catalog.GetString ("Automatically set disc number and count"),
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:150
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:156
 msgid "Set all disc numbers and counts to these values"
 msgstr "Imposta tutti i numeri di disco e contatori a questi valori"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:151
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:157
 msgid "_Disc Number:"
 msgstr "Numero del _disco:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:172
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:178
 msgid "Set all years to this value"
 msgstr "Imposta tutti gli anni a questo valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:173
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:179
 msgid "_Year:"
 msgstr "An_no:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:180
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:186
 msgid "Set all ratings to this value"
 msgstr "Imposta tutti i giudizi a questo valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:181
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:187
 msgid "_Rating:"
 msgstr "Giud_izio:"
 
@@ -2520,7 +2562,7 @@ msgstr "Imposta tutti i conduttori a questo valore"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:58
 msgid "Con_ductor:"
-msgstr "Con_duttore:"
+msgstr "_Direttore d'orchestra:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs:69
 msgid "Set all groupings to this value"
@@ -2610,85 +2652,85 @@ msgstr "Imposta tutti i disponi titoli dell'album a questo valore"
 msgid "Sort Album Title:"
 msgstr "Disponi titolo dell'album:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
 msgid "Value"
 msgstr "Valore"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:110
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
 msgid "File Name:"
 msgstr "Nome del file:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:111
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
 msgid "Directory:"
 msgstr "Directory:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:112
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
 msgid "Full Path:"
 msgstr "Percorso completo:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:118
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:164
 msgid "URI:"
 msgstr "URI:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:127
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:173
 msgid "Duration:"
 msgstr "Durata:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:130
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
 msgid "Audio Bitrate:"
 msgstr "Bitrate audio:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:132
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:178
 msgid "Audio Sample Rate:"
 msgstr "Campionatura audio:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:134
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:180
 msgid "Audio Channels:"
 msgstr "Canali audio:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:137
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
 msgid "Video Dimensions:"
 msgstr "Dimensioni del video:"
 
 #. Translators: {0} is the description of the codec
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:144
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:190
 #, csharp-format
 msgid "{0} Codec:"
 msgstr "Codec {0}:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:149
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:195
 msgid "Container Formats:"
 msgstr "Formati contenitore:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:153
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:199
 msgid "Imported On:"
 msgstr "Importato il:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:155
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:201
 msgid "Last Played:"
 msgstr "Ultima riproduzione:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
 msgid "Last Skipped:"
 msgstr "Ultimo salto:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
 msgid "Play Count:"
 msgstr "Contatore riproduzioni:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
 msgid "Skip Count:"
 msgstr "Contatore salti:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
 msgid "Score:"
 msgstr "Punteggio:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:213
 msgid "File Size:"
 msgstr "Dimensione del file:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:168
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:214
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
 msgid "bytes"
 msgstr "byte"
@@ -2881,13 +2923,33 @@ msgstr "File multimediali"
 msgid "Local Files"
 msgstr "File locali"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:92
+msgid "_Files to import:"
+msgstr "_File da importare:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:93
+msgid "Select Files"
+msgstr "Seleziona file"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:94
+msgid "(none selected)"
+msgstr "(nessuno selezionato)"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
-msgid "Import Folder to Library"
-msgstr "Importa cartella nella libreria"
+msgid "Import Folders to Library"
+msgstr "Importa cartelle nella libreria"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:62
-msgid "Local Folder"
-msgstr "Cartella locale"
+msgid "Local Folders"
+msgstr "Cartelle locali"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:80
+msgid "_Folders to import:"
+msgstr "_Cartelle da importare:"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:81
+msgid "Select Folders"
+msgstr "Seleziona cartelle"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
 msgid "Videos from Photos Folder"
@@ -2926,6 +2988,11 @@ msgstr "Selezionare la posizione della libreria"
 msgid "Reset"
 msgstr "Ripristina"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
+#, csharp-format
+msgid "Reset location to default ({0})"
+msgstr "Ripristina la posizione alla predefinita ({0})"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
 msgstr "Impossibile mostrare le preferenze"
@@ -2973,7 +3040,7 @@ msgstr "<big><b>Importa file multimediali nella libreria</b></big>"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
 msgid "Choose an import _source:"
-msgstr "Scegliere una sor_gente di importazione:"
+msgstr "Scegliere una _sorgente di importazione:"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Create and save"
@@ -3039,11 +3106,11 @@ msgstr "Contattando..."
 msgid "Buffering"
 msgstr "Riempimento buffer"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
 msgid "Muted"
 msgstr "Muto"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
 msgid "Full Volume"
 msgstr "Volume massimo"
 
@@ -3057,38 +3124,44 @@ msgstr "Sincronizzare {0}"
 msgid "{0} to add, {1} to remove"
 msgstr "{0} da aggiungere, {1} da rimuovere"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:168
+#. Note to translators: {0}, {1} and {2} will be replaced with numbers.
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:248
+#, csharp-format
+msgid "{0} to add, {1} to remove, {2} to update"
+msgstr "{0} da aggiungere, {1} da rimuovere, {2} da aggiornare"
+
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:174
 msgid "Device Properties"
 msgstr "Proprietà del dispositivo"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:185
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:191
 msgid "Media Player"
 msgstr "Riproduttore multimediale"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:192
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:198
 msgid "Product"
 msgstr "Prodotto"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:193
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:199
 msgid "Vendor"
 msgstr "Fornitore"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:271
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:277
 #, csharp-format
 msgid "Loading {0}"
 msgstr "Caricamento {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:351
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:37
 msgid "Yes"
 msgstr "Sì"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:351
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:38
 msgid "No"
 msgstr "No"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:372
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:378
 #, csharp-format
 msgid ""
 "The {0} format is not supported by the device, and no converter was found to "
@@ -3097,11 +3170,11 @@ msgstr ""
 "Il formato {0} non è supportato da questo dispositivo, e nessun convertitore "
 "è stato trovato per convertirlo."
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:378
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:384
 msgid "File format conversion support is not available"
 msgstr "Il supporto di conversione del formato del file non è disponibile"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:404
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:410
 msgid "Error converting file"
 msgstr "Errore nella conversione del file"
 
@@ -3193,10 +3266,6 @@ msgstr "Dettagli avanzati"
 msgid "Import Purchased Music"
 msgstr "Importa la musica acquistata"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/MusicGroupSource.cs:38
-msgid "Music"
-msgstr "Musica"
-
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:94
 msgid "Podcasts"
@@ -3217,10 +3286,6 @@ msgstr "Espulsione di {0}..."
 msgid "Could not eject {0}: {1}"
 msgstr "Impossibile espellere {0}: {1}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs:38
-msgid "Videos"
-msgstr "Video"
-
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:92
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:95
 msgid "Rebuilding Database"
@@ -3263,7 +3328,7 @@ msgid "Capacity"
 msgstr "Capacità"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "Numero seriale"
 
@@ -3379,10 +3444,14 @@ msgstr "Ricostruzione database"
 msgid "Rebuilding iPod Database..."
 msgstr "Ricostruzione database iPod..."
 
-#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AndroidDevice.cs:153
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AmazonMp3GroupSource.cs:43
 msgid "Purchased Music"
 msgstr "Musica acquistata"
 
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs:82
+msgid "Rockbox Device"
+msgstr "Dispositivo Rockbox"
+
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:114
 #, csharp-format
 msgid "Audio Folder"
@@ -3390,21 +3459,32 @@ msgid_plural "Audio Folders"
 msgstr[0] "Cartella audio"
 msgstr[1] "Cartelle audio"
 
-#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:120
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:121
+#, csharp-format
+msgid "Video Folder"
+msgid_plural "Video Folders"
+msgstr[0] "Cartella video"
+msgstr[1] "Cartelle video"
+
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:127
 msgid "Required Folder Depth"
 msgstr "Profondità della cartella richiesta"
 
-#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:123
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:130
 msgid "Supports Playlists"
 msgstr "Supporta scalette"
 
+#: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/WebOSDevice.cs:188
+msgid "Ringtones"
+msgstr "Toni di chiamata"
+
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:117
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "Il supporto MTP ignora il dispositivo"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:118
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid ""
 "Banshee's MTP audio player support can only handle one device at a time."
 msgstr ""
@@ -3434,19 +3514,19 @@ msgstr ""
 "Rilevato un dispositivo MTP, ma non è possibile ottenere supporto "
 "dall'applicazione."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:145
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "Versione"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:147
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "Livello batteria"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
 #. track currently being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:163
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "Caricamento di {0} - {1} di {2}"
@@ -3482,23 +3562,23 @@ msgstr ""
 msgid "Cannot Import CD"
 msgstr "Impossibile importare il CD"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:232
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:233
 msgid "Audio CDs"
 msgstr "CD audio"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:234
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:235
 msgid "Audio CD Importing"
 msgstr "Importazione CD audio"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:237
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:238
 msgid "_Import format"
 msgstr "Formato di _importazione"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:241
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:242
 msgid "_Automatically import audio CDs when inserted"
 msgstr "Importare _automaticamente i CD audio quando inseriti"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:242
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:243
 msgid ""
 "When an audio CD is inserted, automatically begin importing it if metadata "
 "can be found and it is not already in the library."
@@ -3506,19 +3586,19 @@ msgstr ""
 "Quando un CD audio è inserito, automaticamente comincia l'importazione se i "
 "metadati possono essere trovati e non è già nella libreria."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:246
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:247
 msgid "_Eject when done importing"
 msgstr "_Espellere al termine dell'importazione"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:247
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:248
 msgid "When an audio CD has been imported, automatically eject it."
 msgstr "Quando un CD audio è stato importato, sarà espulso automaticamente."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:250
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:251
 msgid "Use error correction when importing"
 msgstr "Usare correzione degli errori nell'importazione"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:251
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:252
 msgid ""
 "Error correction tries to work around problem areas on a disc, such as "
 "surface scratches, but will slow down importing substantially."
@@ -3526,20 +3606,20 @@ msgstr ""
 "La correzione di errori prova a risolvere problemi di aree su un disco, "
 "quali i graffi, ma renderà notevolmente più lenta l'importazione."
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:319
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:320
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:440
 msgid "Import CD"
 msgstr "Importa CD"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:320
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:321
 msgid "Import this audio CD to the library"
 msgstr "Importa questo CD audio nella libreria"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:326
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:327
 msgid "Duplicate CD"
 msgstr "Duplica CD"
 
-#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:327
+#: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:328
 msgid "Duplicate this audio CD"
 msgstr "Duplica questo CD audio"
 
@@ -3696,9 +3776,9 @@ msgid ""
 "unfortunate inconvenience."
 msgstr ""
 "iTunes® 7 introduce nuovi problemi di compatibilità e attualmente funziona "
-"solo con altri clienti iTunes® 7.\n"
+"solo con altri client iTunes® 7.\n"
 "\n"
-"Nessun cliente di terze parti può connettersi alla condivisione musicale di "
+"Nessun client di terze parti può connettersi alla condivisione musicale di "
 "iTunes®. Questa è una limitazione internazionale di Apple in iTunes® 7 e ci "
 "scusiamo per lo sfortunato inconveniente."
 
@@ -3788,7 +3868,7 @@ msgid "File System Queue"
 msgstr "Coda del file system"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:72
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:70
 msgid "Clear"
 msgstr "Svuota"
 
@@ -3797,7 +3877,7 @@ msgid "Remove all tracks from the file system queue"
 msgstr "Rimuove tutte le tracce dalla coda del file system"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:79
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:77
 msgid "Clear on Quit"
 msgstr "Svuota all'uscita"
 
@@ -3819,7 +3899,7 @@ msgstr "Aggiungi stazione"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:67
 msgid "Add a new Internet Radio station or playlist"
-msgstr "Aggiungi una nuova stazione radio di internet oppure una scaletta"
+msgstr "Aggiungi una nuova stazione radio di Internet oppure una scaletta"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:83
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:64
@@ -3835,7 +3915,7 @@ msgid "Creator"
 msgstr "Creatore"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
 msgid "Description"
 msgstr "Descrizione"
@@ -4068,7 +4148,7 @@ msgstr "Similare a {0}"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:401
 msgid "_Add Station"
-msgstr "Aggiung_i stazione"
+msgstr "A_ggiungi stazione"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs:126
 msgid "Recently Loved Tracks"
@@ -4297,6 +4377,10 @@ msgstr "Sorgente attuale:"
 msgid "Full Mode"
 msgstr "Modalità completa"
 
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+msgid "Media"
+msgstr "Multimediale"
+
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "Mostr_a le notifiche"
@@ -4322,11 +4406,11 @@ msgstr ""
 msgid "Now Playing"
 msgstr "In riproduzione"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:462
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "Salta questo elemento"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:468
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "Impossibile mostrare le notifiche"
 
@@ -4344,6 +4428,7 @@ msgid "Amarok"
 msgstr "Amarok"
 
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
 msgid "Unable to import song."
 msgstr "Impossibile importare il brano."
 
@@ -4351,6 +4436,88 @@ msgstr "Impossibile importare il brano."
 msgid "Rhythmbox Music Player"
 msgstr "Rhythmbox - Riproduttore musicale"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
+msgid "iTunes Importer"
+msgstr "Importatore iTunes"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+msgid "_Import"
+msgstr "I_mporta"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
+msgid "Import _playlists"
+msgstr "Importare _scalette"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
+#, csharp-format
+msgid "Locate your \"{0}\" file..."
+msgstr "Individuare file «{0}»..."
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
+#, csharp-format
+msgid "Locate \"{0}\""
+msgstr "Individuare «{0}»"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:389
+msgid "Locate iTunes Music Directory"
+msgstr "Individua directory musicale di iTunes"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:391
+#, csharp-format
+msgid ""
+"The iTunes library refers to your music directory as \"{0}\" but Banshee was "
+"not able to infer the location of this directory. Please locate it."
+msgstr ""
+"La libreria di iTunes fa riferimento alla directory di musica come «{0}» ma "
+"Banshee non è stato in grado di dedurre la posizione di questa directory. "
+"Individuarla manualmente."
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
+msgid "iTunes Media Player"
+msgstr "Riproduttore multimediale iTunes"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:395
+msgid ""
+"Banshee is not familiar with this version of the iTunes library format. "
+"Importing may or may not work as expected, or at all. Would you like to "
+"attempt to import anyway?"
+msgstr ""
+"Banshee non ha familiarità con questa versione del formato della libreria di "
+"iTunes. L'importazione può o non può funzionare come previsto, o affatto. "
+"Tentare di importarla comunque?"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:47
+msgid "manually"
+msgstr "manualmente"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:48
+msgid "by song"
+msgstr "per brano"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:49
+msgid "by album"
+msgstr "per album"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:50
+msgid "by artist"
+msgstr "per artista"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:51
+msgid "by rating"
+msgstr "per giudizio"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:52
+msgid "by score"
+msgstr "per punteggio"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:59
+msgid "_Fill"
+msgstr "Riem_pi"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:73
+msgid "f_rom"
+msgstr "_da"
+
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:49
 msgid "Add to Play Queue"
 msgstr "Aggiungi alla coda di riproduzione"
@@ -4360,23 +4527,43 @@ msgid "Append selected songs to the play queue"
 msgstr "Aggiungi i brani selezionati alla coda di riproduzione"
 
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
+msgid "Refresh random tracks in the play queue"
+msgstr "Ricarica le tracce casuali nella coda di riproduzione"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
+msgid "Add More"
+msgstr "Aggiungi ancora"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
+msgid "Add more random tracks to the play queue"
+msgstr "Aggiunge ancora tracce casuali alla coda di riproduzione"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:71
 msgid "Remove all tracks from the play queue"
 msgstr "Rimuovi tutte le tracce dalla coda di riproduzione"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:78
 msgid "Clear the play queue when quitting"
 msgstr "Svuota la coda di riproduzione quando esce"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:63
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:77
 msgid "Play Queue"
 msgstr "Coda di riproduzione"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:72
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:86
 msgid "Remove From Play Queue"
 msgstr "Rimuovi dalla coda di riproduzione"
 
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:755
+msgid "Number of _played songs to show"
+msgstr "Numero di brani _riprodotti da mostrare"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:761
+msgid "Number of _upcoming songs to show"
+msgstr "Numero di brani _prossimi da mostrare"
+
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
 msgid "Podcast"
 msgstr "Podcast"
@@ -4386,16 +4573,16 @@ msgstr "Podcast"
 msgid "All Podcasts ({0})"
 msgstr "Tutti i podcast ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
 msgid "Published"
 msgstr "Pubblicato"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
 msgid "New"
 msgstr "Nuovo"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
 msgid "Downloaded"
 msgstr "Scaricati"
@@ -4449,10 +4636,10 @@ msgstr "Annullare tutti gli scaricamenti di podcast?"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:120
 #, csharp-format
-msgid "Transfering {0} file at {1} KB/s"
-msgid_plural "Transfering {0} of {2} files at {1} KB/s"
-msgstr[0] "Trasferimento di {0} file a {1} kB/s"
-msgstr[1] "Trasferimento di {0} di {2} file a {1} kB/s"
+msgid "Transferring {0} file at {1} KB/s"
+msgid_plural "Transferring {0} of {2} files at {1} KB/s"
+msgstr[0] "Trasferimento di {0} file a {1} KB/s"
+msgstr[1] "Trasferimento di {0} di {2} file a {1} KB/s"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:133
 msgid "Canceling Downloads"
@@ -4631,11 +4818,11 @@ msgstr "Nascondi <i>{0}</i>"
 msgid "Banshee Encountered a Fatal Error"
 msgstr "L'applicazione ha riscontrato un errore fatale"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:89
+#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:90
 msgid "Error Details"
 msgstr "Dettagli dell'errore"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:133
+#: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs:134
 msgid "An unhandled exception was thrown: "
 msgstr "È stata lanciata un'eccezione non gestita: "
 
diff --git a/po/sl.po b/po/sl.po
index f2be9a3..1b2a72b 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,9 +8,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: banshee\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=banshee&component=general\n"
-"POT-Creation-Date: 2009-10-08 12:49+0000\n"
-"PO-Revision-Date: 2009-10-09 08:49+0100\n"
-"Last-Translator: Matej Urbančič <mateju at svn.gnome.org>\n"
+"POT-Creation-Date: 2009-11-12 06:16+0000\n"
+"PO-Revision-Date: 2009-11-12 20:35+0100\n"
+"Last-Translator: Andrej Žnidaršič <andrej.znidarsic at gmail.com>\n"
 "Language-Team: Slovenian GNOME Translation Team <gnome-si at googlegroups.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -197,15 +197,15 @@ msgstr "Windows zvočna datoteka"
 #: ../libbanshee/banshee-bpmdetector.c:202
 #: ../libbanshee/banshee-ripper.c:268
 msgid "Could not create pipeline"
-msgstr "Ni mogoče ustvariti cevovoda"
+msgstr "Cevovoda ni mogoče ustvariti"
 
 #: ../libbanshee/banshee-bpmdetector.c:208
 msgid "Could not create filesrc element"
-msgstr "Ni mogoče ustvariti filesrc elementa"
+msgstr "Elementa filesrc ni mogoče ustvariti"
 
 #: ../libbanshee/banshee-bpmdetector.c:214
 msgid "Could not create decodebin plugin"
-msgstr "Ni mogoče ustvariti decodebin vstavka"
+msgstr "Vstavka decodebin ni mogoče ustvariti"
 
 #: ../libbanshee/banshee-bpmdetector.c:220
 msgid "Could not create audioconvert plugin"
@@ -247,7 +247,7 @@ msgstr "Vstavka 'filesrc' ni mogoče najti"
 
 #: ../libbanshee/banshee-transcoder.c:246
 msgid "Could not create 'decodebin' plugin"
-msgstr "'decodebin' vstavka ni mogoče ustvariti"
+msgstr "Vstavka 'decodebin' ni mogoče ustvariti"
 
 #: ../libbanshee/banshee-transcoder.c:252
 msgid "Could not create 'filesink' plugin"
@@ -283,7 +283,7 @@ msgstr "Zapis izbranih skladb na zvočni CD"
 
 #: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:103
 msgid "Could not write CD"
-msgstr "Ni mogoče zapisati CD-ja"
+msgstr "CD-ja ni mogoče zapisati"
 
 #: ../src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs:104
 msgid "Brasero could not be started"
@@ -308,7 +308,7 @@ msgstr "Gonilnika zaznavanja UNM ni mogoče ustvariti."
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:122
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:153
 msgid "Could not initialize GStreamer library"
-msgstr "GStreamer knjižnice ni mogoče pripraviti"
+msgstr "GStreamer knjižnice ni mogoče zagnati"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:262
 msgid "Unknown Error"
@@ -319,12 +319,15 @@ msgid "_Enable ReplayGain correction"
 msgstr "_Omogoči popravek ReplayGain"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:556
-msgid "For tracks that have ReplayGain data, automatically scale (normalize) playback volume."
-msgstr "Samodejno izenači glasnosti predvajanja za skladbe s ReplayGain podatki."
+#| msgid ""
+#| "For tracks that have ReplayGain data, automatically scale (normalize) "
+#| "playback volume."
+msgid "For tracks that have ReplayGain data, automatically scale (normalize) playback volume"
+msgstr "Samodejno umeri (normaliziraj) glasnost predvajanja skladb s podatki ReplayGain"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs:63
 msgid "Could not create transcoder"
-msgstr "Ni mogoče ustvariti prekodirnika"
+msgstr "Prekodirnika ni mogoče ustvariti"
 
 #: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:87
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:125
@@ -378,11 +381,11 @@ msgstr "Možnosti nadzora predvajanja"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:158
 msgid "Play the next track, optionally restarting if the 'restart' value is set"
-msgstr "Predvajanje naslednje skladbe"
+msgstr "Predvajanje naslednje skladbe, če je nastavljena vrednost ponovnega predvajanja, ponovno predvajanje "
 
 #: ../src/Clients/Booter/Booter/Entry.cs:159
 msgid "Play the previous track, optionally restarting if the 'restart value is set"
-msgstr "Predvajanje predhodne skladbe, po možnosti ponovno predvajanje, če je vrednost ponovnega predvajanja nastavljena"
+msgstr "Predvajanje predhodne skladbe, če je nastavljena vrednost ponovnega predvajanja, ponovno predvajanje "
 
 #: ../src/Clients/Booter/Booter/Entry.cs:160
 msgid "Automatically start playing any tracks enqueued on the command line"
@@ -406,7 +409,7 @@ msgstr "Popolna zaustavitev predvajanja"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:166
 msgid "Enable or disable playback stopping after the currently playing track (value should be either 'true' or 'false')"
-msgstr "Omogoči ali onemogoči zaustavitev predvajanja po koncu trenutno predvajajoče se skladbe (vrednost naj bo "
+msgstr "Omogoči ali onemogoči zaustavitev predvajanja po koncu trenutno predvajajoče se skladbe (vrednost naj bo 'true' ali 'false')"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:167
 msgid "Set the playback volume (0-100)"
@@ -434,7 +437,7 @@ msgstr "Poizvedba ali je mogoče narediti premor predvajanja"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:175
 msgid "Query whether the player can seek"
-msgstr "Poizvedba ali je mogoče iskati po skladbi"
+msgstr "Poizvedba ali je predvajalnik lahko išče"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:176
 msgid "Player volume"
@@ -442,7 +445,7 @@ msgstr "Glasnost predvajalnika"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:177
 msgid "Player position in currently playing track"
-msgstr "Mesto predvajalnika v trenutno predvajani skladbi"
+msgstr "Lega predvajalnika v trenutno predvajani skladbi"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:180
 msgid "Playing Track Metadata Query Options"
@@ -454,16 +457,19 @@ msgstr "URI"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "Ime izvajalca"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "Naslov albuma"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "Naslov skladbe"
 
@@ -484,18 +490,25 @@ msgid "Track Count"
 msgstr "Števec skladbe"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:188
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:174
 msgid "Disc Number"
 msgstr "Številka diska"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:189
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:138
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:132
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:77
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "Leto"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:190
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:235
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:131
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:60
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:96
 msgid "Rating"
 msgstr "Ocena"
 
@@ -540,7 +553,7 @@ msgstr "Omogoči razhroščevalni odvod SQL poizvedb"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:204
 msgid "Enable debugging output of Mono.Addins"
-msgstr "Omogoči odvod razhroščevalnika Mono vstavkov"
+msgstr "Omogoči razhroščevalni odvov Mono vstavkov"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:205
 msgid "Specify an alternate database to use"
@@ -552,7 +565,7 @@ msgstr "Določitev drugega ključa, privzet je /apps/banshee-1/"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:207
 msgid "Optimize instance for running uninstalled; most notably, this will create an alternate Mono.Addins database in the working directory"
-msgstr "Izboljšanje inačice za nenameščeno delovanje; "
+msgstr "Izboljšanje primera za nenameščeno delovanje; najbolj opazno ta možnost ustvari dodatne podatkovno zbirko Mono.Vstavkov v delujoči mapi"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:209
 msgid "Disable DBus support completely"
@@ -584,7 +597,7 @@ msgstr "_Predvajaj"
 
 #: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:47
 msgid "Play _Song"
-msgstr "Predvajanje _skladbe"
+msgstr "Predvajaj _skladbo"
 
 #: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:48
 msgid "Add a song to the playlist"
@@ -592,14 +605,14 @@ msgstr "Dodajanje skladbe na seznam predvajanja"
 
 #: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:52
 msgid "Play _Album"
-msgstr "Predvajanje _albuma"
+msgstr "Predvajaj _album"
 
 #: ../src/Clients/Muinshee/Muinshee/MuinsheeActions.cs:53
 msgid "Add an album to the playlist"
 msgstr "Dodajanje albuma na seznam predvajanja"
 
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:76
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
 msgid "Banshee Media Player"
@@ -619,13 +632,15 @@ msgid "_Search:"
 msgstr "_Išči:"
 
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "Izvajalec, album ali naslov"
 
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:155
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:123
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "Zvrst"
 
@@ -656,46 +671,69 @@ msgstr "Neznan izvajalec"
 msgid "Unknown Album"
 msgstr "Neznan album"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:84
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:92
 msgid "Track Artist"
 msgstr "Izvajalec skladbe"
 
 #. Alias for %album_artist%
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:89
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:95
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:97
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:103
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:105
 msgid "Album Artist"
 msgstr "Izvajalec albuma"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:100
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:108
 msgid "Album Artist Initial"
 msgstr "Začetnice izvajalca albuma"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:110
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:113
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
+msgid "Conductor"
+msgstr "Dirigent"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:118
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
+msgid "Composer"
+msgstr "Skladatelj"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:128
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:63
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:115
 msgid "Album"
 msgstr "Album"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:115
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:133
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:127
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:76
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:97
 msgid "Title"
 msgstr "Naslov"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:125
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:144
 msgid "Count"
 msgstr "Števec"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:130
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:150
 msgid "Number"
 msgstr "Številka skladbe"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:135
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:156
 msgid "Count (unsorted)"
 msgstr "Števec (neurejeno)"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:140
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:162
 msgid "Number (unsorted)"
-msgstr "Število (neurejeno)"
+msgstr "Številka (neurejeno)"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:168
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:131
+msgid "Disc Count"
+msgstr "Število diskov"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:180
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
+msgid "Grouping"
+msgstr "Združevanje"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:48
 msgid "Unknown Title"
@@ -709,20 +747,20 @@ msgstr "Različni izvajalci"
 #. TODO turn this into a PrimarySource-owned delegate?
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:522
 msgid "_Restart Podcast"
-msgstr "_Ponoven zagon podcasta"
+msgstr "_Ponovno predvajaj podcast"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:523
 msgid "_Restart Video"
-msgstr "_Ponoven zagon videa"
+msgstr "_Ponovno predvajaj video"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:524
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
 msgid "_Restart Song"
-msgstr "_Ponovno predvajanje"
+msgstr "_Ponovno predvajaj skladbo"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:525
 msgid "_Restart Item"
-msgstr "_Ponoven zagon predmeta"
+msgstr "_Ponovno zaženi predmet"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:539
 msgid "_Jump to Playing Podcast"
@@ -730,16 +768,16 @@ msgstr "_Skok na predvajan podcast"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:540
 msgid "_Jump to Playing Video"
-msgstr "_Skok na predvajan video"
+msgstr "_Skoči na predvajan video"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:541
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
 msgid "_Jump to Playing Song"
-msgstr "_Skok na predvajano pesem"
+msgstr "_Skoči na predvajano pesem"
 
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:542
 msgid "_Jump to Playing Item"
-msgstr "_Skok na predvajan predmet"
+msgstr "_Skoči na predvajan predmet"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:68
 #, csharp-format
@@ -753,10 +791,10 @@ msgstr "Vsi izvajalci ({0})"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:137
 msgid "Scanning for media"
-msgstr "Preiskovanje za večpredstavnostne datotke"
+msgstr "Preiskovanje za večpredstavnostne datoteke"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1206
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1250
 msgid "Scanning..."
 msgstr "Preiskovanje ..."
 
@@ -772,7 +810,7 @@ msgstr "Uvažanje večpredstavnostnih datotek"
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:244
 #: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:119
 msgid "The import process is currently running. Would you like to stop it?"
-msgstr "Postopek uvažanja je v teku. Ali želite uvoz ustaviti?"
+msgstr "Postopek uvažanja je v teku. Ali ga želite zaustaviti?"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:250
 #: ../src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:81
@@ -788,23 +826,23 @@ msgstr "Ponovno preiskovanje {0} od {1}"
 
 #: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:230
 msgid "Upgrading your Banshee Database"
-msgstr "Posodabljanje zbirke podatkov Banshee"
+msgstr "Nadgrajevanje podatkovne zbirke Banshee"
 
 #: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:231
 msgid "Please wait while your old Banshee database is migrated to the new format."
-msgstr "Počakajte, da se stara Banshee zbirka podatkov pretvori v novo obliko zapisa."
+msgstr "Počakajte, da se stara Banshee podatkovna zbirka pretvori v novo vrsto zapisa."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1203
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1247
 msgid "Refreshing Metadata"
 msgstr "Osveževanje metapodatkov"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Directory"
-msgstr "_Domači imenik:"
+msgid "Home Folder"
+msgstr "Domača mapa"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
 msgid "Remove From Library"
-msgstr "Odstranitev iz knjižnice"
+msgstr "Odstrani iz knjižnice"
 
 #. Translators: {0} is the library name, eg 'Music Library' or 'Podcasts'
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:65
@@ -836,76 +874,77 @@ msgstr "Ime _datoteke"
 msgid "Miscellaneous"
 msgstr "Razno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "Priljubljeno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr "Skladbe ocenjene s štirimi in petimi zvezdicami"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "Nedavno priljubljeno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr "Pogosto poslušane skladbe v zadnjem tednu"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:95
 msgid "Recently Added"
 msgstr "Nedavno dodano"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "Skladbe uvožene v zadnjem tednu"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "Ne slišano"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
-msgstr "Nepredvajanje in nikoli preskočene skladbe"
+msgstr "Nepredvajane in nikoli preskočene skladbe"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "Spregledane priljubljene"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:110
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
 msgid "Favorites not played in over two months"
 msgstr "Priljubljene in nepredvajane v zadnjih 2 mesecih"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "Najmanj priljubljeno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
-msgstr "Skladbe, ki so bile ocenjene z eno ali dvema zvezdicama, ali pa pogosto preskočene"
+msgstr "Skladbe, ki so bile ocenjene z eno ali dvema zvezdicama, ali pogosto preskočene"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "700 MB priljubljenih"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr "Podatkovni CD vreden priljubljenih skladb"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "80 minut priljubljenih"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:126
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr "Zvočni CD vreden priljubljenih skladb"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr "Neocenjeno"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:132
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr "Neocenjene skladbe"
 
@@ -926,7 +965,7 @@ msgstr "Videi"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:64
 msgid "Produced By"
-msgstr "Natiskano z %sssss"
+msgstr "Proizvedeno"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:86
 msgid "Videos rated four and five stars"
@@ -942,15 +981,15 @@ msgstr "Nepredvajanji video posnetki"
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:98
 msgid "Default player engine"
-msgstr "Privzeto orodje predvajalnika"
+msgstr "Privzet motor predvajalnika"
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:105
 msgid "No player engines were found. Please ensure Banshee has been cleanly installed."
-msgstr "Ni mogoče najti orodij za predvajalnik. Preverite nastavitve."
+msgstr "Motorjev predvajalnika ni mogoče najti. Prepričajte se, da je bil Banshee čisto namščen."
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:321
 msgid "Problem with Player Engine"
-msgstr "Težave z predvajalnikom"
+msgstr "Težave z motorjem predvajalnika"
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:134
 #, csharp-format
@@ -963,7 +1002,7 @@ msgstr "Zaganjanje"
 
 #: ../src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs:137
 msgid "Files are currently being converted to another format. Would you like to stop this?"
-msgstr "Datoteke se trenutno pretvarjajo v drugo obliko. Ali bi radi to zaustavili ?"
+msgstr "Datoteke se trenutno pretvarjajo v drugo obliko. Ali želite to zaustavili ?"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs:51
 msgid "Saving Metadata to File"
@@ -971,23 +1010,29 @@ msgstr "Shranjevanje metapodatkov v datoteko"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:48
 msgid "Write _metadata to files"
-msgstr "Zapis _metapodatkov v datoteke"
+msgstr "Zapiši _metapodatke v datoteke"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:49
-msgid "Enable this option to save tags and other metadata inside supported audio files."
-msgstr "Ta možnost omogoča shranjevanje značk in ostalih metapodatkov v podprte zvočne datoteke."
+#| msgid ""
+#| "Enable this option to save tags and other metadata inside supported audio "
+#| "files."
+msgid "Save tags and other metadata inside supported media files"
+msgstr "Shrani oznake in druge metapodatke v podprtih večpredstavnostnih datotekah"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:54
 msgid "_Update file and folder names"
-msgstr "_Posodobitev imen datotek in map"
+msgstr "_Posodobi imena datotek in map"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:55
-msgid "Enabling this option ensures that files and folders are renamed according to the metadata."
-msgstr "Ta možnost zagotavlja da so datoteke in mape preimenovane glede na metapodatke."
+#| msgid ""
+#| "Enabling this option ensures that files and folders are renamed according "
+#| "to the metadata."
+msgid "Rename files and folders according to media metadata"
+msgstr "Preimenovanje datotek in map glede na metapodatke večpredstavnostnih datotek"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:129
 msgid "Write _ratings and play counts to files"
-msgstr "Zapis _ocen in števila predvajanj v datoteke"
+msgstr "Zapiši _ocene in števila predvajanj v datoteke"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:130
 msgid "Enable this option to save rating and play count metadata inside supported audio files whenever the rating is changed."
@@ -995,29 +1040,29 @@ msgstr "Ta možnost omogoča shranjevanje metapodatkov ocen in števila predvaja
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:131
 msgid "Import _ratings"
-msgstr "Uvoz _ocen"
+msgstr "Uvozi _ocene"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:132
 msgid "Import play _counts"
-msgstr "Ukaz _števila predvajanj"
+msgstr "Uvozi _števila predvajanj"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:52
 msgid "There is no available network connection"
 msgstr "Na voljo ni delujoče omrežne povezave"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:78
-msgid "Cannot connect to NetworkManager"
-msgstr "Povezava z urejevalnikom omrežja ni mogoča"
+msgid "Cannot connect to NetworkManager or Wicd"
+msgstr "Na upravljalnik omrežja ali Wicd se ni mogoče povezati"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:79
 msgid "An available, working network connection will be assumed"
 msgstr "Predvidena bo delujoča omrežna povezava"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:150
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:157
 msgid "_Disable features requiring Internet access"
 msgstr "_Onemogoči zmožnosti, ki zahtevajo spletni dostop"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:151
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:158
 msgid "Some features require a broadband Internet connection such as Last.fm or cover art fetching"
 msgstr "Nekatere zmožnosti kot so Last.fm ali pridobivanje ovitkov zahtevajo širokopasovno spletno povezavo "
 
@@ -1028,23 +1073,23 @@ msgstr "Ocena skladbe v Banshee se razlikuje od ocene na napravi"
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:59
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:314
 msgid "Playlist"
-msgstr "Seznam predvajanj"
+msgstr "Seznam predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:134
 msgid "Remove From Playlist"
-msgstr "Odstranitev iz seznama predvajanj"
+msgstr "Odstranitev iz seznama predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:135
 msgid "Delete Playlist"
-msgstr "Izbris seznama predvajanj"
+msgstr "Izbris seznama predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:390
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:396
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:88
-#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:464
+#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:466
 #: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs:211
 msgid "New Playlist"
-msgstr "Nov seznam predvajanj"
+msgstr "Nov seznam predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs:43
 msgid "Windows Media ASX"
@@ -1086,7 +1131,7 @@ msgstr "Pravila datotek"
 
 #: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:57
 msgid "Co_py files to media folders when importing"
-msgstr "_Kopiranje datotek v večpredstavnostne mape med uvažanjem"
+msgstr "_Kopiraj datoteke v večpredstavnostne mape med uvažanjem"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:59
 msgid "Random"
@@ -1100,8 +1145,8 @@ msgstr "Izvajalec"
 #. Translators: noun
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:659
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:662
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
 msgid "Name"
 msgstr "Ime"
 
@@ -1115,7 +1160,7 @@ msgstr "Najnižja ocena"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:72
 msgid "Highest Score"
-msgstr "Najboljši rezultat"
+msgstr "Najvišji rezultat"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:73
 msgid "Lowest Score"
@@ -1130,6 +1175,7 @@ msgid "Least Often Played"
 msgstr "Redko predvajano"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:58
 msgid "Most Recently Played"
 msgstr "Nedavno predvajano"
 
@@ -1219,11 +1265,7 @@ msgstr "cd"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "discnum"
-msgstr "Število diskov"
-
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:131
-msgid "Disc Count"
-msgstr "Število diskov"
+msgstr "Številka diska"
 
 #. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:133
@@ -1313,28 +1355,16 @@ msgstr "leto"
 msgid "genre"
 msgstr "Zvrst"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
-msgid "Composer"
-msgstr "Skladatelj"
-
 #. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:199
 msgid "composer"
 msgstr "skladatelj"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
-msgid "Conductor"
-msgstr "Dirigent"
-
 #. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:206
 msgid "conductor"
 msgstr "dirigent"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
-msgid "Grouping"
-msgstr "Združevanje"
-
 #. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:213
 msgid "grouping"
@@ -1347,6 +1377,9 @@ msgstr "Opomba"
 
 #. Translators: noun
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:227
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:135
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:71
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:72
 msgid "License"
 msgstr "Licenca"
 
@@ -1465,11 +1498,11 @@ msgstr "vrsta"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "mimetype"
-msgstr "mime zvrst"
+msgstr "vrsta mime"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "format"
-msgstr "oblika"
+msgstr "vrsta"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "ext"
@@ -1524,47 +1557,121 @@ msgstr "uvoženo"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "addedon"
-msgstr "dodano ob"
+msgstr "dodanoob"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "dateadded"
-msgstr "datumdodajanja"
+msgstr "datum dodajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "importedon"
-msgstr "uvoženoob"
+msgstr "uvoženo ob"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:320
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:66
 msgid "Smart Playlist"
-msgstr "Pameten seznam predvajanj"
+msgstr "Pameten seznam predvajanja"
 
 #. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:329
 msgid "score"
 msgstr "rezultat"
 
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:335
+#| msgid "_Playback"
+msgid "Playback Error"
+msgstr "Napaka predvajanja"
+
+#. Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:337
+#| msgid "_Playback"
+msgid "playbackerror"
+msgstr "napakapredvajanja"
+
 #. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:346
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:354
 msgid "BPM"
 msgstr "UNM"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:347
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:355
 msgid "Skips"
 msgstr "Preskokov"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:348
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:356
 msgid "Plays"
 msgstr "Predvajanj"
 
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:44
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:96
+msgid "None"
+msgstr "Noben"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+#| msgid "None"
+msgid "none"
+msgstr "brez"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+msgid "no"
+msgstr "ne"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:49
+msgid "Resource Not Found"
+msgstr "Vira ni mogoče najti"
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+msgid "ResourceNotFound"
+msgstr "Virninajden"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+#| msgid "Missing"
+msgid "missing"
+msgstr "manjkajoče"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+msgid "notfound"
+msgstr "ninajden"
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:54
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:56
+msgid "CodecNotFound"
+msgstr "Kodekninajden"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:56
+#| msgid "Encode to"
+msgid "nocodec"
+msgstr "brez kodeka"
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:59
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:61
+msgid "Drm"
+msgstr "Drm"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:61
+msgid "drm"
+msgstr "drm"
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:64
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:66
 #: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:309
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:200
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:376
 msgid "Unknown"
 msgstr "Neznano"
 
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:66
+#| msgid "Unknown"
+msgid "unknown"
+msgstr "neznano"
+
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:79
 msgid "Unable to Migrate Smart Playlists"
 msgstr "Pametnega seznama predvajanja ni mogoče preseliti"
@@ -1572,16 +1679,16 @@ msgstr "Pametnega seznama predvajanja ni mogoče preseliti"
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:80
 #, csharp-format
 msgid "Please file a bug with this error: {0}"
-msgstr "Prosimo, napišite poročilo o hrošču s to napako: {0}"
+msgstr "Napišite poročilo o hrošču s to napako: {0}"
 
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:67
 #: ../src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs:51
 msgid "Edit Smart Playlist"
-msgstr "Urejanje pametnega seznama predvajanj"
+msgstr "Urejanje pametnega seznama predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:229
 msgid "Delete Smart Playlist"
-msgstr "Izbriši pameten seznam predvajanj"
+msgstr "Izbriši pameten seznam predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs:147
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:157
@@ -1637,11 +1744,13 @@ msgid "Close Error Report"
 msgstr "Zapri poročilo o napakah"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:82
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:110
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
 msgid "Error"
 msgstr "Napaka"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:83
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:247
 msgid "Details"
 msgstr "Podrobnosti"
 
@@ -1651,32 +1760,32 @@ msgstr "Napake"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:217
 msgid "Sort Playlists by"
-msgstr "Razvrščanje seznama predvajanja po"
+msgstr "Razvrščanje seznamov predvajanja po"
 
 #. Translators: this is a noun, referring to the harddisk
 #: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:226
 msgid "Drive"
-msgstr "Pogon"
+msgstr "Poženi"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:687
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:678
 #, csharp-format
 msgid "Adding {0} of {1} to {2}"
 msgstr "Dodajanje {0} od {1} k {2}"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:706
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:697
 #, csharp-format
 msgid "Deleting {0} of {1} From {2}"
 msgstr "Brisanje {0} od {1} iz {2}"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:664
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:667
 msgid "Size Ascending"
 msgstr "Velikost; naraščajoče"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:669
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:672
 msgid "Size Descending"
 msgstr "Velikost; padajoče"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:758
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:761
 #, csharp-format
 msgid "{0} item"
 msgid_plural "{0} items"
@@ -1696,11 +1805,11 @@ msgstr "Toka ali seznama predvajanja ni mogoče odpreti"
 
 #: ../src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:92
 msgid "Problem parsing playlist"
-msgstr "Težava med razčlenjevanjem seznama predvajanj"
+msgstr "Težava med razčlenjevanjem seznama predvajanja"
 
 #: ../src/Core/Banshee.Services/Banshee.Web/Browser.cs:61
 msgid "Could not launch URL"
-msgstr "Ni mogoče zagnati URL"
+msgstr "URL-ja ni mogoče zagnati"
 
 #: ../src/Core/Banshee.Services/Banshee.Web/Browser.cs:62
 #, csharp-format
@@ -1748,6 +1857,21 @@ msgstr "Omogoči"
 msgid "{0} of {1}"
 msgstr "{0} od {1}"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:109
+#| msgid "Now Playing"
+msgid "Playing"
+msgstr "Predvajanje"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:109
+#| msgid "_Pause"
+msgid "Paused"
+msgstr "Na premoru"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:110
+#| msgid "Properties"
+msgid "Protected"
+msgstr "Zaščiteno"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:124
 msgid "Track #"
 msgstr "Št. skladbe"
@@ -1771,11 +1895,11 @@ msgstr "{0} kbps"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:119
 msgid "Make the context pane larger or smaller"
-msgstr "Naredi vsebinski pult večji ali manjši"
+msgstr "Naredi vsebinski pladenj večji ali manjši"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:123
 msgid "Hide context pane"
-msgstr "Skrij vsebinski pult"
+msgstr "Skrij vsebinski pladenj"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:144
 msgid "Waiting for playback to begin..."
@@ -1814,7 +1938,7 @@ msgstr "Sodelavci"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:96
 msgid "Extraordinary Multimedia Management and Playback"
-msgstr "Izredno upravljanje in predvajanje večpredstavnostnih datotek."
+msgstr "Izredno upravljanje in predvajanje večpredstavnostnih datotek"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:98
 #, csharp-format
@@ -1829,7 +1953,7 @@ msgstr ""
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:104
 msgid "Banshee Website"
-msgstr "Spletna stran Banshee"
+msgstr "Spletišče Banshee"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:49
 msgid "Important tasks are running"
@@ -1841,11 +1965,11 @@ msgstr "Izhod iz programa Banshee bo prekinil vse trenutno dejavne naloge. Nalog
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:58
 msgid "Quit anyway"
-msgstr "Vseeno zapusti"
+msgstr "Vseeno _končaj"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs:59
 msgid "Continue running"
-msgstr "Nadaljuj predvajanje"
+msgstr "Nadaljuj izvajanje"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:69
 msgid "Make Banshee the default media player?"
@@ -1865,6 +1989,11 @@ msgstr "Tega ne sprašuj več"
 msgid "Make Banshee the Default"
 msgstr "Nastavi Banshee kot privzeti program"
 
+#. Translators: verb
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+msgid "I_mport"
+msgstr "_Uvozi"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs:39
 msgid "Select album cover image"
 msgstr "Izbor slike naslovnice albuma"
@@ -1886,7 +2015,7 @@ msgid "Browse..."
 msgstr "Prebrskaj ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs:98
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
 msgid "Open Location"
 msgstr "Odpri mesto"
 
@@ -1896,7 +2025,7 @@ msgstr "_Večpredstavnost"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:53
 msgid "Import _Media..."
-msgstr "Uvoz _večpredstavnostnih datotek ..."
+msgstr "Uvozi _večpredstavnostne datoteke ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:54
 msgid "Import media from a variety of sources"
@@ -1904,11 +2033,11 @@ msgstr "Uvoz večpredstavnostnih datotek iz različnih virov"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:57
 msgid "Import _Playlist..."
-msgstr "Uvoz _seznama predvajanja ..."
+msgstr "Uvozi _seznam predvajanja ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:58
 msgid "Import a playlist"
-msgstr "Uvoz seznama predvajanj"
+msgstr "Uvoz seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:61
 msgid "Rescan Music Library"
@@ -1916,7 +2045,7 @@ msgstr "Ponovno preišči glasbeno knjižnico"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:62
 msgid "Rescan the Music Library folder"
-msgstr "Ponovno preišči mape z glasbo"
+msgstr "Ponovno preiskovanje mape z glasbo"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:67
 msgid "Open _Location..."
@@ -1924,15 +2053,15 @@ msgstr "Odpri _mesto ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:68
 msgid "Open a remote location for playback"
-msgstr "Odpri oddaljeno mesto za predvajanje"
+msgstr "Odpiranje oddaljenega mesta za predvajanje"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:71
 msgid "_Quit"
-msgstr "_Zaključi"
+msgstr "_Končaj"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:72
 msgid "Quit Banshee"
-msgstr "Zapusti Banshee"
+msgstr "Končaj Banshee"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:76
 msgid "_Edit"
@@ -1948,7 +2077,7 @@ msgstr "Urejanje osebnih nastavitev"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:83
 msgid "Manage _Extensions"
-msgstr "Upravljanje _razširitev"
+msgstr "Upravljaj _razširitve"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:84
 msgid "Manage extensions to add new features to Banshee"
@@ -1959,8 +2088,9 @@ msgid "_Tools"
 msgstr "_Orodja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:92
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:133
 msgid "_Help"
-msgstr "_Pomoč"
+msgstr "Pomo_č"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:95
 msgid "_Web Resources"
@@ -1972,7 +2102,7 @@ msgstr "Banshee _uporabniški vodič (Wiki)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:99
 msgid "Learn about how to use Banshee"
-msgstr "Podrobnosti uporabe programa Banshee"
+msgstr "Naučite se kako uporabljati Banshee"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:104
 msgid "Advanced Collection Searching"
@@ -1984,11 +2114,11 @@ msgstr "Učenje naprednih načinov iskanja zbirke večpredstavnostnih datotek"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:110
 msgid "Banshee _Home Page"
-msgstr "_Spletna stran Banshee"
+msgstr "_Domača stran Banshee"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:111
 msgid "Visit the Banshee Home Page"
-msgstr "Obiščite spletno stran programa Banshee"
+msgstr "Obiščite domačo stran programa Banshee"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:116
 msgid "_Get Involved"
@@ -2006,19 +2136,16 @@ msgstr "_Podrobnosti različice"
 msgid "View detailed version and configuration information"
 msgstr "Pogled podrobnosti različice in nastavitev"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:163
+#. Prompt user for location of the playlist.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:160
 msgid "Import Playlist"
-msgstr "Uvoz seznama predvajanj"
+msgstr "Uvozi seznam predvajanja"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:170
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:161
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:556
 msgid "Playlists"
 msgstr "Seznami predvajanja"
 
-#. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:178
-msgid "I_mport"
-msgstr "_Uvoz"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
 msgid "Play or pause the current item"
 msgstr "Predvajanje ali premor predvajanja trenutne pesmi"
@@ -2040,8 +2167,9 @@ msgid "Play the previous item"
 msgstr "Predvajanje predhodnega predmeta"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:78
-msgid "Seek _to..."
-msgstr "Iskanje _mesta... "
+#| msgid "Seek _to..."
+msgid "Seek _To..."
+msgstr "Išči _do ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:79
 msgid "Seek to a specific location in current item"
@@ -2053,7 +2181,7 @@ msgstr "Skok na trenutno predvajan predmet"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:87
 msgid "Restart the current item"
-msgstr "Ponovi zagon trenutnega predmeta"
+msgstr "Ponoven zagon trenutnega predmeta"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:92
 msgid "_Stop When Finished"
@@ -2073,7 +2201,7 @@ msgstr "_Premor"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:202
 msgid "Sto_p"
-msgstr "_zaustvavitev"
+msgstr "_Zaustvavi"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:72
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:73
@@ -2082,11 +2210,11 @@ msgstr "Ponavljanje"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:78
 msgid "Repeat _Off"
-msgstr "Brez ponvaljanja"
+msgstr "_Brez ponavljanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:79
 msgid "Do not repeat playlist"
-msgstr "Ne ponavljaj seznama predvajanj"
+msgstr "Brez ponavljanja seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:83
 msgid "Repeat _All"
@@ -2094,15 +2222,15 @@ msgstr "Ponovi _vse"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:84
 msgid "Play all songs before repeating playlist"
-msgstr "Predvajaj vse skladbe pred ponovnim začetkom predvajanja seznama"
+msgstr "Predvajanje vseh skladb pred ponovnim začetkom predvajanja seznama"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:88
 msgid "Repeat Singl_e"
-msgstr "Ponovi enkrat"
+msgstr "Ponovi _enkrat"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:89
 msgid "Repeat the current playing song"
-msgstr "Ponovi predvajanje trenutne skladbe"
+msgstr "Ponovitev predvajanja trenutne skladbe"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:75
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:76
@@ -2111,23 +2239,23 @@ msgstr "Mešanje"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:81
 msgid "Shuffle _Off"
-msgstr "Brez mešanja"
+msgstr "_Brez mešanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:82
 msgid "Do not shuffle playlist"
-msgstr "Brez mešanja seznama predvajanj"
+msgstr "Brez mešanja seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:86
 msgid "Shuffle by _Song"
-msgstr "Mešanje _skladb"
+msgstr "Mešaj _skladbe"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:87
 msgid "Play songs randomly from the playlist"
-msgstr "Naključno predvajanje skladb iz seznama predvajanj"
+msgstr "Naključno predvajanje skladb iz seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:91
 msgid "Shuffle by A_rtist"
-msgstr "Mešanje _izvajalcev"
+msgstr "Mešaj_izvajalce"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:92
 msgid "Play all songs by an artist, then randomly choose another artist"
@@ -2135,7 +2263,7 @@ msgstr "Predvajanje vseh pesmi izvajalca, nato naključno izbiranje drugega izva
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:96
 msgid "Shuffle by A_lbum"
-msgstr "Mešanje _albumov"
+msgstr "Mešaj _albume"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:97
 msgid "Play all songs from an album, then randomly choose another album"
@@ -2143,7 +2271,7 @@ msgstr "Predvajanje vseh skladb iz albuma, nato naključno izbiranje drugega alb
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:101
 msgid "Shuffle by _Rating"
-msgstr "Mešanje po _oceni"
+msgstr "Mešaj po _oceni"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:102
 msgid "Play songs randomly, prefer higher rated songs"
@@ -2151,7 +2279,7 @@ msgstr "Naključno predvajanje skladb, prednostno skladbe z višjimi ocenami"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:106
 msgid "Shuffle by S_core"
-msgstr "Mešanje po _rezultatu"
+msgstr "Mešaj po _rezultatu"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs:107
 msgid "Play songs randomly, prefer higher scored songs"
@@ -2159,11 +2287,11 @@ msgstr "Naključno predvajanje skladb, prednostno skladbe z višjimi rezultati"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:73
 msgid "_New Playlist"
-msgstr "_Nov seznam predvajanj"
+msgstr "_Nov seznam predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:74
 msgid "Create a new empty playlist"
-msgstr "Ustvari nov prazen seznam predvajanj"
+msgstr "Ustvari nov prazen seznam predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:77
 msgid "New _Smart Playlist..."
@@ -2171,15 +2299,15 @@ msgstr "Nov _pameten seznam predvajanja ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:78
 msgid "Create a new smart playlist"
-msgstr "Ustvarjanje novega pametnega seznama predvajanj"
+msgstr "Ustvarjanje novega pametnega seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:88
 msgid "Import to Library"
-msgstr "Uvoz v knjižnico"
+msgstr "Uvozi v knjižnico"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:89
 msgid "Import source to library"
-msgstr "Uvozi vir v knjižnico"
+msgstr "Uvoz vira v knjižnico"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:92
 msgid "Rename"
@@ -2187,11 +2315,11 @@ msgstr "Preimenovanje"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:95
 msgid "Export Playlist..."
-msgstr "Izvoz seznama predvajanja ..."
+msgstr "Izvozi seznam predvajanja ..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:96
 msgid "Export a playlist"
-msgstr "Izvoz seznama predvajanj"
+msgstr "Izvoz seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:99
 msgid "Unmap"
@@ -2226,16 +2354,16 @@ msgstr "Osveži"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:123
 msgid "Refresh this randomly sorted smart playlist"
-msgstr "Osveži naključno razvrščen pameten seznam predvajanj"
+msgstr "Osveži naključno razvrščen pameten seznam predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:290
 msgid "Could not export playlist"
-msgstr "Ni mogoče izvoziti seznama predvajanj"
+msgstr "Seznama predvajanja ni mogoče izvoziti"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:418
 #, csharp-format
 msgid "Are you sure you want to delete this {0}?"
-msgstr "Ali zares želite izbrisati {0} ?"
+msgstr "Ali zares želite izbrisati {0}?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:461
 msgid "Separate by Type"
@@ -2259,14 +2387,14 @@ msgstr "Preklic izbora vseh skladb"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:75
 msgid "_Edit Track Information"
-msgstr "_Urejanje podrobnosti o skladbi"
+msgstr "_Uredi podrobnosti skladbe"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:76
 msgid "Edit information on selected tracks"
 msgstr "Urejanje podrobnosti o izbranih skladbah"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:234
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:247
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:108
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:150
 msgid "Properties"
@@ -2274,11 +2402,11 @@ msgstr "Lastnosti"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:80
 msgid "View information on selected tracks"
-msgstr "Ogled podrobnosti o izbranih skladbah"
+msgstr "Ogled podrobnosti izbranih skladb"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:83
 msgid "Add _to Playlist"
-msgstr "Dodaj na _seznam predvajanj"
+msgstr "Dodaj na _seznam predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:84
 msgid "Append selected items to playlist or create new playlist from selection"
@@ -2298,7 +2426,7 @@ msgstr "Odstranitev izbran-e/ih skladb-e iz tega vira"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:97
 msgid "Remove From _Library"
-msgstr "Odstranitev iz _knjižnice"
+msgstr "Odstrani iz _knjižnice"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:98
 msgid "Remove selected track(s) from library"
@@ -2312,7 +2440,11 @@ msgstr "_Izbriši s pogona"
 msgid "Permanently delete selected item(s) from medium"
 msgstr "Trajen izbris izbran-e/ih skladb-e z medija"
 
+#. Translators: this is a verb (command), not a noun (things)
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:169
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "_Iskanje"
 
@@ -2326,7 +2458,7 @@ msgstr "Po skladanju _albuma"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:113
 msgid "Search all songs of this album"
-msgstr "Iskanje po albumu"
+msgstr "Iskanje pesmi iz tega albuma"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:116
 msgid "By Matching A_rtist"
@@ -2363,10 +2495,10 @@ msgstr "Odstranitev izbora iz {0}?"
 #, csharp-format
 msgid "Are you sure you want to remove the selected item from your {1}?"
 msgid_plural "Are you sure you want to remove the selected {0} items from your {1}?"
-msgstr[0] "Ali ste prepričani, da želite odstraniti izbranih predmetov iz {1}?"
-msgstr[1] "Ali ste prepričani, da želite odstraniti izbran predmet iz {1}?"
-msgstr[2] "Ali ste prepričani, da želite odstraniti izbrana predmeta iz {1}?"
-msgstr[3] "Ali ste prepričani, da želite odstraniti izbrane predmete iz {1}?"
+msgstr[0] "Ali ste prepričani, da želite odstraniti {0} izbranih predmetov iz {1}?"
+msgstr[1] "Ali ste prepričani, da želite odstraniti {0} izbran predmet iz {1}?"
+msgstr[2] "Ali ste prepričani, da želite odstraniti {0} izbrana predmeta iz {1}?"
+msgstr[3] "Ali ste prepričani, da želite odstraniti {0} izbrane predmete iz {1}?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:53
 msgid "Com_pilation Album Artist:"
@@ -2374,7 +2506,7 @@ msgstr "Izvajalec _mešanega albuma:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:57
 msgid "Check this if this track is part of an album with tracks by various artists"
-msgstr "Preveri, če je ta skladba dela albuma s skladbami različnih izvajalcev"
+msgstr "Preveri, če je ta skladba del albuma s skladbami različnih izvajalcev"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs:59
 msgid "This value will affect how this album is sorted; if you enter 'Various Artists' then the album will located with other albums that start with 'V'."
@@ -2410,7 +2542,7 @@ msgstr "N_aslov albuma:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:113
 msgid "Set all genres to this value"
-msgstr "Nastavi zvrst na to vrednost"
+msgstr "Nastavi vse zvrsti na to vrednost"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:114
 msgid "_Genre:"
@@ -2550,7 +2682,7 @@ msgstr "Razvrstitev izvajalcev skladb:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:63
 msgid "Set all sort album artists to this value"
-msgstr "Nastavi vse razvrščene izvajalce albumov na to vrednost"
+msgstr "Nastavi vse razvrščene izvajalce skladb na to vrednost"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:64
 msgid "Sort Album Artist:"
@@ -2564,92 +2696,92 @@ msgstr "Nastavi vse razvrščene naslove albumov na to vrednost"
 msgid "Sort Album Title:"
 msgstr "Razvrščanje naslovov albumov:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:90
 msgid "Value"
 msgstr "Vrednost"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
 msgid "File Name:"
 msgstr "Ime datoteke:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
 msgid "Directory:"
 msgstr "Mapa:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
 msgid "Full Path:"
 msgstr "Polna pot:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:164
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
 msgid "URI:"
 msgstr "URI:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:173
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
 msgid "Duration:"
 msgstr "Trajanje:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:179
 msgid "Audio Bitrate:"
 msgstr "Bitna hitrost zvoka:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:178
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:181
 msgid "Audio Sample Rate:"
 msgstr "Vzorčna hitrost zvoka:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:180
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
 msgid "Audio Channels:"
 msgstr "Zvočni kanali:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:186
 msgid "Video Dimensions:"
 msgstr "Mere videa:"
 
 #. Translators: {0} is the description of the codec
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:190
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:193
 #, csharp-format
 msgid "{0} Codec:"
 msgstr "{0} kodek:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:195
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:198
 msgid "Container Formats:"
 msgstr "Vrste zabojnikov:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:199
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
 msgid "Imported On:"
-msgstr "Uvoženo:"
+msgstr "Uvoženo ob:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:201
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
 msgid "Last Played:"
 msgstr "Zadnjič predvajano:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
 msgid "Last Skipped:"
 msgstr "Zadnjič preskočeno:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:208
 msgid "Play Count:"
 msgstr "Števec predvajanj:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:209
 msgid "Skip Count:"
 msgstr "Števec preskokov:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:210
 msgid "Score:"
 msgstr "Rezultat:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:213
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:216
 msgid "File Size:"
 msgstr "Velikost datoteke:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:214
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:217
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
 msgid "bytes"
 msgstr "bajtov"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:84
 msgid "Track Editor"
-msgstr "Urejevalec skladbe"
+msgstr "Urejevalnik skladb"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:84
 msgid "Track Properties"
@@ -2657,15 +2789,15 @@ msgstr "Lastnosti skladbe"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:132
 msgid "Show the previous track"
-msgstr "Prikaz predhodne skladbe"
+msgstr "Prikaži predhodno skladbo"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:138
 msgid "Show the next track"
-msgstr "Prikaz naslednje skladbe"
+msgstr "Prikaži naslednjo skladbo"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:161
 msgid "Title:"
-msgstr "Naslov"
+msgstr "Naslov:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:162
 msgid "Artist:"
@@ -2681,7 +2813,7 @@ msgstr "Usklajevanje vseh vrednosti _polj"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:272
 msgid "Apply the values of all common fields set for this track to all of the tracks selected in this editor"
-msgstr "Uporabi vrednosti vseh skupnih polj te skladbe za vse skladbe izbrane v urejevalniku"
+msgstr "Uporaba vrednosti vseh nastavljenih skupnih polj te skladbe za vse skladbe izbrane v urejevalniku"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs:366
 #, csharp-format
@@ -2720,11 +2852,11 @@ msgstr "Ogled grafičnega uravnalnika"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:72
 msgid "_Context Pane"
-msgstr "_Vsebinski pult"
+msgstr "_Vsebinski pladenj"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:73
 msgid "Show the context pane beneath the track list"
-msgstr "Prikaz vsebinskega pulta pod seznamov skladb"
+msgstr "Prikaz vsebinskega pladnja pod seznamom skladb"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:80
 msgid "_Fullscreen"
@@ -2737,10 +2869,10 @@ msgstr "Preklop celozaslonskega načina"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs:92
 msgid "Active Task Running"
 msgid_plural "Active Tasks Running"
-msgstr[0] "Dejavnih nalog v teku"
-msgstr[1] "Dejavna naloga v teku"
-msgstr[2] "Dejavni nalogi v teku"
-msgstr[3] "Dejavne naloge v teku"
+msgstr[0] "Dejavnih opravil v teku"
+msgstr[1] "Dejavno opravilo v teku"
+msgstr[2] "Dejavni opravili v teku"
+msgstr[3] "Dejavna opravila v teku"
 
 #. Translators: {0} and {1} are for markup so ignore them, {2} and {3}
 #. are Podcast Name and Published Date, respectively;
@@ -2791,21 +2923,21 @@ msgstr "{0}od{1} {2}"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:138
 msgid "Stop Operation"
-msgstr "Ustavi dejanje"
+msgstr "Zaustavi opravilo"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:139
 #, csharp-format
 msgid "Stop {0}"
-msgstr "Ustavi {0}"
+msgstr "Zaustavi {0}"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:142
 msgid "This operation is still performing work. Would you like to stop it?"
-msgstr "Dejanje še vedno teče. Ali ga želite zaustaviti ?"
+msgstr "Opravilo še vedno teče. Ali jo želite zaustaviti ?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:144
 #, csharp-format
 msgid "The '{0}' operation is still performing work. Would you like to stop it?"
-msgstr " '{0}' naloga je v teku. Ali jo želite preklicati?"
+msgstr "Opravilo  '{0}' je v teku. Ali jo želite preklicati?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:148
 msgid "Continue"
@@ -2814,54 +2946,68 @@ msgstr "Nadaljevanje"
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:149
 #, csharp-format
 msgid "Continue {0}"
-msgstr "Nadaljuj {0}"
+msgstr "Nadaljevanje {0}"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs:184
 msgid "Stopping..."
 msgstr "Ustavljanje ..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:45
 msgid "Import Files to Library"
 msgstr "Uvoz datotek v knjižnico"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:48
 msgid "Media Files"
 msgstr "Večpredstavnostne datoteke"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:59
 msgid "Local Files"
 msgstr "Krajevne datoteke"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
+msgid "C_hoose Files"
+msgstr "I_zbor datotek"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
 msgid "_Files to import:"
 msgstr "_Datoteke za uvoz:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:82
 msgid "Select Files"
 msgstr "Izbor datotek"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:83
 msgid "(none selected)"
-msgstr "(noben izbran)"
+msgstr "(nobena izbrana)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:43
 msgid "Import Folders to Library"
 msgstr "Uvoz map v knjižnico"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:53
 msgid "Local Folders"
 msgstr "Krajevne mape"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
+msgid "C_hoose Folders"
+msgstr "I_zberi mape"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
 msgid "_Folders to import:"
 msgstr "_Mape za uvoz:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:81
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:76
 msgid "Select Folders"
 msgstr "Izbor map"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:89
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:82
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+msgid "_Import"
+msgstr "_Uvozi"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
-msgid "Videos from Photos Folder"
+msgid "Videos From Photos Folder"
 msgstr "Videi iz mape fotografij"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
@@ -2879,7 +3025,7 @@ msgstr "Nastavljanje {0}"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:20
 msgid "Export Playlist"
-msgstr "Izvoz seznama predvajanj"
+msgstr "Izvoz seznama predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:29
 msgid "Export"
@@ -2887,7 +3033,7 @@ msgstr "Izvozi"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs:54
 msgid "Select Format: "
-msgstr "Izbor oblike zapisa:"
+msgstr "Izbor vrste zapisa:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:110
 msgid "Select library location"
@@ -2895,7 +3041,7 @@ msgstr "Izbor položaja knjižnice"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:118
 msgid "Reset"
-msgstr "Počisti"
+msgstr "Ponastavi"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
 #, csharp-format
@@ -2904,15 +3050,15 @@ msgstr "Ponastavi mesto na privzeto ({0})"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
-msgstr "Ni mogoče prikazati nastavitev"
+msgstr "Nastavitev ni mogoče prikazati"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:56
 msgid "The preferences service could not be found."
-msgstr "Storitve nastavitev ni bilo mogoče najti"
+msgstr "Storitve nastavitev ni mogoče najti."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs:82
 msgid "New Smart Playlist"
-msgstr "Nov pameten seznam prevajanj"
+msgstr "Nov pameten seznam predvajanja"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs:109
 msgid "Browser on Left"
@@ -2947,46 +3093,38 @@ msgid "<big><b>Import Media to Library</b></big>"
 msgstr "<big><b>Uvoz večpredstavnostnih datotek v knjižnico</b></big>"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
-msgid "Choose an import _source:"
-msgstr "Izbor _vira uvoza:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Create and save"
 msgstr "Ustvari in shrani"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Do not show this dialog again"
 msgstr "Tega okna ne prikaži več"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
 msgid "Enter the address of the file you would like to open:"
 msgstr "Vnesite n_aslov datoteke, ki jo želite odpreti:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
-msgid "I_mport Media Source"
-msgstr "_Uvoz vira večpredstavnostnih datotek"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+msgid "Import _from:"
+msgstr "Uvozi _iz:"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
-msgid "Import Media to Library"
-msgstr "Uvoz večpredstavnostnih datotek v knjižnico"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Open in editor"
 msgstr "Odpri v urejevalniku"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
 msgid "Playlist _Name: "
-msgstr "Ime _seznama predvajanj:"
+msgstr "Ime _seznama predvajanja:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Predefined Smart Playlists"
-msgstr "Predloge pametnih seznamov prevajanj"
+msgstr "Predloge pametnih seznamov prevajanja"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:14
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
 msgid "Seek to Position"
 msgstr "Iskanje mesta"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:15
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
 msgid "Your media library is empty. You may import new music and videos into your library now, or choose to do so later."
 msgstr "Večpredstavnostna knjižnica je prazna. Novo glasbo in video je mogoče uvoziti v knjižnico sedaj ali kasneje."
 
@@ -2995,12 +3133,17 @@ msgid ""
 "Insert\n"
 "Disc"
 msgstr ""
-"Vstavi\n"
+"Vstavite\n"
 "Disk"
 
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs:58
+#| msgid "weeks"
+msgid "Seek"
+msgstr "Išči"
+
 #: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:148
 msgid "Idle"
-msgstr "Nedejaven"
+msgstr "Nedejavno"
 
 #: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:149
 msgid "Contacting..."
@@ -3010,11 +3153,16 @@ msgstr "Vzpostavljanje stika ..."
 msgid "Buffering"
 msgstr "Polnjenje medpomnilnika"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:96
+#| msgid "Value"
+msgid "Volume"
+msgstr "Glasnost"
+
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:548
 msgid "Muted"
 msgstr "Nemo"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:550
 msgid "Full Volume"
 msgstr "Polna glasnost"
 
@@ -3068,11 +3216,11 @@ msgstr "Ne"
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:378
 #, csharp-format
 msgid "The {0} format is not supported by the device, and no converter was found to convert it"
-msgstr "Naprava ne podpira oblike zapisa {0} "
+msgstr "Naprava ne podpira vrste zapisa {0}, in ni mogoče najti pretvornika za njeno pretvarjanje "
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:384
 msgid "File format conversion support is not available"
-msgstr "Pretvorba oblike zapisa ni dostopna"
+msgstr "Podpora za pretvorbo vrste datoteke ni dostopna"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:410
 msgid "Error converting file"
@@ -3092,11 +3240,11 @@ msgstr "Samodejno usklajevanje naprave ob vklopu ali spremembi knjižnic"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:122
 msgid "Begin synchronizing the device as soon as the device is plugged in or the libraries change."
-msgstr "Začne usklajevati napravo takoj, ko je priklopljena ali se spremenijo knjižnice."
+msgstr "Začetek usklajevanja naprave takoj, ko je priklopljena ali se spremenijo knjižnice."
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs:125
 msgid "Sync Preferences"
-msgstr "Nastavitve uskladnje"
+msgstr "Nastavitve usklajevanja"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs:50
 msgid "Synchronize"
@@ -3109,6 +3257,7 @@ msgid "Synchronize {0}"
 msgstr "Uskladi {0}"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:67
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:97
 msgid "Audio"
 msgstr "Zvok"
 
@@ -3124,10 +3273,6 @@ msgstr "Ostalo"
 msgid "Free Space"
 msgstr "Nezaseden prostor"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:96
-msgid "None"
-msgstr "Noben"
-
 #. Translators: {0} is the name assigned to a Digital Audio Player by its owner
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs:55
 #, csharp-format
@@ -3156,7 +3301,8 @@ msgid "Import Purchased Music"
 msgstr "Uvoz kupljene glasbe"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:94
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:107
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:98
 msgid "Podcasts"
 msgstr "Podcasti"
 
@@ -3165,15 +3311,15 @@ msgstr "Podcasti"
 msgid "Eject {0}"
 msgstr "Izvrzi {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:104
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:108
 #, csharp-format
 msgid "Ejecting {0}..."
 msgstr "Izvrzi {0} ..."
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:111
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:115
 #, csharp-format
 msgid "Could not eject {0}: {1}"
-msgstr "Ni mogoče izvreči {0}: {1}"
+msgstr "{0} ni mogoče izvreči: {1}"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:92
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs:95
@@ -3223,7 +3369,7 @@ msgstr "Serijska številka"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:103
 msgid "Produced on"
-msgstr "Proizvedeno"
+msgstr "Proizvedeno ob"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:104
 msgid "Firmware"
@@ -3241,33 +3387,33 @@ msgstr "Podpira ovitke"
 msgid "Supports photos"
 msgstr "Podpira fotografije"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Out of space on device"
 msgstr "Na napravi ni prostora"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Please manually remove some songs"
-msgstr "Skladbe je treba odstraniti ročno"
+msgstr "Skladbe je treba ročno odstraniti"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:661
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:637
 msgid "Syncing iPod"
 msgstr "Usklajevanje iPoda"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:662
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:638
 msgid "Preparing to synchronize..."
 msgstr "Pripravljanje na usklajevanje ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:683
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:659
 msgid "Updating..."
 msgstr "Posodabljanje ..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:687
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:663
 msgid "Flushing to disk..."
-msgstr "Počisti na disk ..."
+msgstr "Čiščenje na disk ..."
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:59
 msgid "Unable to read your iPod"
-msgstr "Ni mogoče brati z iPod naprave"
+msgstr "Z iPod naprave ni mogoče brati"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:75
 msgid ""
@@ -3291,15 +3437,15 @@ msgid ""
 msgstr ""
 "iPod podatkovne zbirke na tej napravi ni mogoče najti.\n"
 "\n"
-"Banshee lahko ustvari novo podatkovno zbirko."
+"Banshee lahko izgradi novo podatkovno zbirko."
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:102
 msgid "What is the reason for this?"
-msgstr "Kaj je razlog?"
+msgstr "Kaj je vzrok?"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:115
 msgid "Your iPod is mounted read only. Banshee can not restore your iPod."
-msgstr "iPod je priklopljen samo za branje, zato ga Banshee ne more obnoviti. "
+msgstr "iPod je priklopljen le za branje, zato ga Banshee ne more obnoviti. "
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:123
 msgid "Rebuild iPod Database..."
@@ -3307,7 +3453,7 @@ msgstr "Ponovno izgradi iPod zbirko podatkov ..."
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:131
 msgid "Confirm Rebuild iPod Database"
-msgstr "Potrditev ponovne izgradnje iPod zbirke podatkov"
+msgstr "Potrdite ponovno izgradnjo iPod zbirke podatkov"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:137
 msgid ""
@@ -3315,13 +3461,13 @@ msgid ""
 "\n"
 "Are you sure you want to rebuild your iPod database?"
 msgstr ""
-"Ponovna izgradnja iPod podatkovne zbirke lahko traja dlje časa. Med ponovno izgradnjo bodo izgubljeni vsi seznami predvajanj, ki so že na iPodu.\n"
+"Ponovna izgradnja iPod podatkovne zbirke lahko traja dlje časa. Med ponovno izgradnjo bodo izgubljeni vsi seznami predvajanja, ki so že na iPodu.\n"
 "\n"
-"Ali želite nadaljevati z izgradnjo podatkovne zbirke?"
+"Ali ste prepričani, da želite izgraditi podatkovno zbirko iPoda?"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:141
 msgid "Rebuild Database"
-msgstr "Ponovna izgradnja podatkovne zbirke ..."
+msgstr "Ponovna izgradnja podatkovne zbirke"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs:155
 msgid "Rebuilding iPod Database..."
@@ -3333,16 +3479,16 @@ msgstr "Kupljena glasba"
 
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs:82
 msgid "Rockbox Device"
-msgstr "Rockbox naprava"
+msgstr "Naprava Rockbox"
 
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:114
 #, csharp-format
 msgid "Audio Folder"
 msgid_plural "Audio Folders"
-msgstr[0] "Zvočna mapa"
-msgstr[1] "Zvočni mapi"
-msgstr[2] "Zvočne mape"
-msgstr[3] "Zvočnih map"
+msgstr[0] "Zvočnih map"
+msgstr[1] "Zvočna mapa"
+msgstr[2] "Zvočni mapi"
+msgstr[3] "Zvočne mape"
 
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:121
 #, csharp-format
@@ -3359,7 +3505,7 @@ msgstr "Zahtevana globina map"
 
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs:130
 msgid "Supports Playlists"
-msgstr "Podpira sezname predvajanj"
+msgstr "Podpira sezname predvajanja"
 
 #: ../src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/WebOSDevice.cs:188
 msgid "Ringtones"
@@ -3373,7 +3519,7 @@ msgstr "Podpora MTP je prezrla napravo"
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid "Banshee's MTP audio player support can only handle one device at a time."
-msgstr "Podpora Banshee MTP predvajalnika zvoka lahko upravlja z eno napravo na enkrat. "
+msgstr "Podpora Banshee MTP predvajalnika zvoka lahko upravlja le eno napravo na enkrat. "
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:91
 msgid "Error Initializing MTP Device Support"
@@ -3381,7 +3527,7 @@ msgstr "Napaka med zaganjanjem podpore MTP napravam"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:92
 msgid "There was an error intializing MTP device support.  See http://www.banshee-project.org/Guide/DAPs/MTP for more information."
-msgstr "Prišlo je do napake med zagon podpore MTP napravam. Več podrobnosti je na voljo na http://www.banshee-project.org/Guide/DAPs/MTP"
+msgstr "Prišlo je do napake med zagon podpore MTP naprave. Več podrobnosti je na voljo na http://www.banshee-project.org/Guide/DAPs/MTP"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:103
 msgid "Error Finding MTP Device Support"
@@ -3424,7 +3570,7 @@ msgstr "Uvažanje zvočnega CD-ja"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:120
 msgid "Initializing Drive"
-msgstr "Priprava pogona"
+msgstr "Zaganjanje pogona"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:122
 #, csharp-format
@@ -3433,7 +3579,7 @@ msgstr "<i>{0}</i> se uvaža v knjižnico. Ali želite postopek prekiniti?"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:247
 msgid "Cannot Import CD"
-msgstr "Ni mogoče uvoziti CD-ja"
+msgstr "CD-ja ni mogoče uvoziti"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:233
 msgid "Audio CDs"
@@ -3445,7 +3591,7 @@ msgstr "Uvažanje zvočnega CD-ja"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:238
 msgid "_Import format"
-msgstr "Oblika zapisa _uvoza"
+msgstr "Vrsta zapisa _uvoza"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:242
 msgid "_Automatically import audio CDs when inserted"
@@ -3453,7 +3599,7 @@ msgstr "_Samodejno uvažanje zvočnih CD-jev ob vstavitvi v pogon"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:243
 msgid "When an audio CD is inserted, automatically begin importing it if metadata can be found and it is not already in the library."
-msgstr "Ob vstavitvi v pogon začne samodejno uvažanje CD-ja, če je mogoče najti metapodatke in še ni prisoten v knjižnico. "
+msgstr "Ob vstavitvi v pogon začne samodejno uvažanje CD-ja, če je mogoče najti metapodatke in CD še ni na voljo v knjižnici."
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:247
 msgid "_Eject when done importing"
@@ -3478,7 +3624,7 @@ msgstr "Uvozi CD"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:321
 msgid "Import this audio CD to the library"
-msgstr "Uvozi ta zvočni CD v knjižnico"
+msgstr "Uvoz tega zvočnega CD-ja v knjižnico"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:327
 msgid "Duplicate CD"
@@ -3486,15 +3632,15 @@ msgstr "Podvoji CD"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:328
 msgid "Duplicate this audio CD"
-msgstr "Podvoji ta zvočni CD"
+msgstr "Podvojitev tega zvočnega CD-ja"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:130
 msgid "Searching for CD metadata..."
-msgstr "Iskanje metapodatkov CD enote ..."
+msgstr "Iskanje metapodatkov CD-ja ..."
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:163
 msgid "Could not fetch metadata for CD."
-msgstr "Ni mogoče pridobiti metapodatkov CD-ja."
+msgstr "Metapodatkov CD-ja ni mogoče pridobiti. "
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:191
 msgid "Automatic import off since this album is already in the Music Library."
@@ -3515,7 +3661,7 @@ msgstr "Izvrzi zvočni CD ..."
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:381
 #, csharp-format
 msgid "Could not eject audio CD: {0}"
-msgstr "Ni mogoče izvreči zvočnega CD-ja: {0}"
+msgstr "Zvočnega CD-ja ni mogoče izvreči: {0}"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:414
 msgid "Audio CD Preferences"
@@ -3540,7 +3686,7 @@ msgstr "_Dodaj zaznamek"
 
 #: ../src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs:88
 msgid "Bookmark the Position in the Current Track"
-msgstr "Zaznamek lege v trenutni skladbi"
+msgstr "Dodajanje zaznamka lege v trenutni skladbi"
 
 #: ../src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs:100
 msgid "_Remove Bookmark"
@@ -3559,11 +3705,11 @@ msgstr "Zaznavanje BPM"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:86
 msgid "D_etect"
-msgstr "_Zaznavanje"
+msgstr "_Zaznaj"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:98
 msgid "T_ap"
-msgstr "_Udarjanje"
+msgstr "_Udarjaj"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:106
 msgid "Have Banshee attempt to auto-detect the BPM of this song"
@@ -3575,11 +3721,11 @@ msgstr "Predvajaj to skladbo"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs:111
 msgid "Tap this button to the beat to set the BPM for this song manually"
-msgstr "Udarjanje gumba po ritmu za določitev UNM skladbe po meri"
+msgstr "Udarjajte gumb po ritmu za ročno določitev UNM skladbe"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:148
 msgid "_Automatically detect BPM for all songs"
-msgstr "_Samodejno zaznavanje UNM za vse skladbe"
+msgstr "_Samodejno zaznaj UNM za vse skladbe"
 
 #: ../src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs:149
 msgid "Detect BPM for all songs that don't already have a value set"
@@ -3587,7 +3733,7 @@ msgstr "Zaznavanje UNM za vse skladbe brez nastavljene vrednosti"
 
 #: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:58
 msgid "Downloading Cover Art"
-msgstr "Prenašanje ovitkov"
+msgstr "Prejemanje ovitkov"
 
 #. Console.WriteLine ("have album {0}/{1} for track uri {2}", track.AlbumId, track.AlbumTitle, track.Uri);
 #: ../src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:121
@@ -3617,11 +3763,11 @@ msgstr "Souporaba glasbe"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:73
 msgid "Disconnected from music share"
-msgstr "Povezava souporabe glasbe je bila prekinjena"
+msgstr "Povezava s souporabo glasbe je bila prekinjena"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:74
 msgid "Unable to connect to music share"
-msgstr "Ni se mogoče povezati za souporabo glasbe"
+msgstr "Ni se mogoče povezati s souporabo glasbe"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:88
 msgid "Back"
@@ -3633,9 +3779,9 @@ msgid ""
 "\n"
 "No third-party clients can connect to iTunes® music shares anymore. This is an intentional limitation by Apple in iTunes® 7 and we apologize for the unfortunate inconvenience."
 msgstr ""
-"Z iTunes® 7 so se pojavile težave združljivosti. Trenutno iTunes® 7 delujejo samo z uporabniki, ki uporabljajo enako različico.\n"
+"Z iTunes® 7 so se pojavile težave združljivosti. Trenutno iTunes® 7 delujejo le z ostalimi uporabniki  iTunes® 7.\n"
 "\n"
-"Drugi uporabniki se ne morejo povezati v iTunes® souporabo glasbe. To je namerna omejitev Applea v iTunes® 7."
+"Drugi uporabniki se ne morejo povezati v iTunes® souporabo glasbe. To je namerna omejitev Appla v iTunes® 7."
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:111
 msgid "Common reasons for connection failures:"
@@ -3643,43 +3789,42 @@ msgstr "Običajni vzroki za spodletelo povezovanje:"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:117
 msgid "The provided login credentials are invalid"
-msgstr "Uporabniški podatki za prijavo niso veljavni"
+msgstr "Podatki za prijavo niso veljavni"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:118
 msgid "The login process was canceled"
-msgstr "Postopek povezave je preklican"
+msgstr "Postopek prijave je preklican"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:119
 msgid "Too many users are connected to this share"
-msgstr "Preveč uporabnikov je povezanih za souporabo glasbe"
+msgstr "Preveč uporabnikov je povezanih s to souporabo glasbe"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:121
 msgid "You are no longer connected to this music share"
-msgstr "Ni več povezave za souporabo glasbe"
+msgstr "Niste več povezani s souporabo glasbe"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:125
 msgid "Try connecting again"
-msgstr "Ponoven poskus povezave"
+msgstr "Poskusite se ponovno povezati"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs:139
 msgid "The music share is hosted by iTunes® 7"
-msgstr "Souporabo glasbe podpira iTunes® 7"
+msgstr "Souporabo glasbe gosti iTunes® 7"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:47
 msgid "Login to Music Share"
-msgstr "Prijava v sodeljenje glasbe"
+msgstr "Prijava v souporabo glasbe"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:80
 msgid "Authentication Required"
 msgstr "Zahtevana je overitev"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:104
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:57
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:54
 msgid "Username:"
 msgstr "Uporabniško ime:"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:112
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:64
 msgid "Password:"
 msgstr "Geslo:"
 
@@ -3717,7 +3862,7 @@ msgstr[3] "Nalaganje {0} skladb"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs:270
 msgid "Loading playlists"
-msgstr "Nalaganje seznama predvajanj"
+msgstr "Nalaganje seznama predvajanja"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:57
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:58
@@ -3736,11 +3881,599 @@ msgstr "Odstranitev vseh skladb iz vrste datotečnega sistema"
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:79
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:77
 msgid "Clear on Quit"
-msgstr "Počisti ob izhodu"
+msgstr "Počisti ob končanju"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:80
 msgid "Clear the file system queue when quitting"
-msgstr "Počisti vrsto datotečnega sistema ob izhodu"
+msgstr "Čiščenje čakalne vrste datotečnega sistema ob končanju"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:48
+#| msgid "Episode Details"
+msgid "View Item Details"
+msgstr "Ogled podrobnosti predmeta"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:57
+msgid "Open Webpage"
+msgstr "Odpri spletno stran"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:76
+msgid "Visit Archive.org"
+msgstr "Obisk archive.org"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:76
+#| msgid "Close"
+msgid "Close Item"
+msgstr "Zapri predmet"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:84
+msgid "Getting item details from the Internet Archive"
+msgstr "Pridobivanje podrobnosti predmeta s spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:135
+msgid "Timed out getting item details from the Internet Archive"
+msgstr "Zakasnitev med pridobivanjem podrobnosti predmeta s spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:136
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:189
+msgid "Try Again"
+msgstr "Poskusite ponovno"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:138
+msgid "Error getting item details from the Internet Archive"
+msgstr "Napaka med pridobivanjem podrobnosti iz spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:201
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:130
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:66
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
+msgid "Description"
+msgstr "Opis"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:217
+#| msgid "Creator"
+msgid "Creator:"
+msgstr "Ustvarjalec:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:218
+#| msgid "_Genre:"
+msgid "Venue:"
+msgstr "Prizorišče:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:219
+#| msgid "location"
+msgid "Location:"
+msgstr "Mesto:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:221
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:81
+msgid "Date:"
+msgstr "Datum:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:223
+#| msgid "_Year:"
+msgid "Year:"
+msgstr "Leto:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:225
+#| msgid "Published"
+msgid "Publisher:"
+msgstr "Založnik:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:226
+msgid "Keywords:"
+msgstr "Ključne besede:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:227
+#| msgid "_License URI:"
+msgid "License URL:"
+msgstr "URL licence:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:228
+msgid "Language:"
+msgstr "Jezik:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:232
+#| msgid "_Download Cover Art"
+msgid "Downloads, overall:"
+msgstr "Prejemi, skupaj:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:233
+msgid "Downloads, past month:"
+msgstr "Prejemi, prejšnji mesec:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:234
+#| msgid "Download all episodes"
+msgid "Downloads, past week:"
+msgstr "Prejemi, prejšnji teden:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:238
+#| msgid "added"
+msgid "Added:"
+msgstr "Dodano:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:239
+msgid "Added by:"
+msgstr "Dodal:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:240
+#| msgid "Condition:"
+msgid "Collections:"
+msgstr "Zbirke:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:241
+#| msgid "Score:"
+msgid "Source:"
+msgstr "Vir:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:242
+#| msgid "Contributors"
+msgid "Contributor:"
+msgstr "Sodelavec:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:243
+#| msgid "Recommended"
+msgid "Recorded by:"
+msgstr "Posnel:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:244
+msgid "Lineage:"
+msgstr "Združenje:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:245
+msgid "Transferred by:"
+msgstr "Prenesel:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:262
+#| msgid "Overview"
+msgid "Reviews"
+msgstr "Pregledi"
+
+#. Translators: {0} is the number of reviewers, {1} is the average rating (not really relevant if there's only 1)
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:266
+#, csharp-format
+#| msgid "{0} Properties"
+msgid "{0} reviewer"
+msgid_plural "{0} reviewers, avg {1}"
+msgstr[0] "{0} pregledovalcev, povp {1}"
+msgstr[1] "{0} pregledovalec, povp {1}"
+msgstr[2] "{0} pregledovalca, povp {1}"
+msgstr[3] "{0} pregledovalci, povp {1}"
+
+#. Translators: {0} is the unicode-stars-rating, {1} is the name of a person who reviewed this item, and {1} is a date/time string
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:285
+#, csharp-format
+#| msgid "{0}by{1} {2}"
+msgid "{0} by {1} on {2}"
+msgstr "{0} od {1} od {2}"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:315
+msgid "Write your own review"
+msgstr "Napišite svoj pregled"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:84
+msgid "All"
+msgstr "Vse"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:109
+#| msgid "Condition:"
+msgid "Collection:"
+msgstr "Zbirka:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:118
+#, csharp-format
+msgid "Optional Query"
+msgstr "Izbirna poizvedba"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:163
+msgid "Sort by:"
+msgstr "Razvrsti po:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:58
+msgid "Internet Archive"
+msgstr "Spletni arhiv"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:119
+msgid "Preferred Media Types"
+msgstr "Prednostne vrste večpredstavnostnih datotek"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:122
+#| msgid "Audio"
+msgid "_Audio"
+msgstr "_Zvok"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:125
+#| msgid "Video"
+msgid "_Video"
+msgstr "_Video"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:128
+#| msgid "_Next"
+msgid "_Text"
+msgstr "_Besedilo"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:100
+#, csharp-format
+#| msgid "_Search"
+msgid "Search..."
+msgstr "Poišči ..."
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:108
+msgid "_Go"
+msgstr "Po_jdi"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:116
+msgid "Staff Picks"
+msgstr "Izbor osebja"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:117
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:580
+msgid "Creative Commons"
+msgstr "Creative Commons"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:118
+#| msgid "Highest Score"
+msgid "History"
+msgstr "Zgodovina"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:119
+msgid "Classic Cartoons"
+msgstr "Običajne risanke"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:120
+#| msgid "Select Files"
+msgid "Speeches"
+msgstr "Onemelo"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:121
+#| msgid "Sort Children by"
+msgid "For Children"
+msgstr "Za otroke"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:122
+msgid "Poetry"
+msgstr "Poezija"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:123
+msgid "Creator is United States"
+msgstr "Ustvarjalec so Združene Države"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:124
+#| msgid "Old Items"
+msgid "Old Movies"
+msgstr "Stari filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:125
+#| msgid "Remove From Library"
+msgid "New From LibriVox"
+msgstr "Novo od LibiVox"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:126
+#| msgid "Old Items"
+msgid "Old Texts"
+msgstr "Stara besedila"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:127
+msgid "Charlie Chaplin"
+msgstr "Charlie Chaplin"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:128
+msgid "NASA"
+msgstr "NASA"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:129
+#| msgid "Library location"
+msgid "Library of Congress"
+msgstr "Kongresna knjižnica"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:145
+msgid "The Internet Archive, a 501(c)(3) non-profit, is building a digital library of Internet sites and other cultural artifacts in digital form. Like a paper library, we provide free access to researchers, historians, scholars, and the general public."
+msgstr "Spletni arhiv, gradi digitalno knjižnico spletnih strani in drugih kulturnih značilnosti v digitalni obliki. Podobno kot papirnata knjižnica zagotavlja brezplačen dostop raziskovalcem, zgodovinarjem, učenjakom in splošni javnosti."
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:148
+msgid "Visit the Internet Archive online at archive.org"
+msgstr "Obisk spletnega Arhiva na archive.org"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:304
+#| msgid "Audio"
+msgid "Audiobooks"
+msgstr "Zvočne knjige"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:305
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:78
+#| msgid "Mode"
+msgid "Movies"
+msgstr "Filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:306
+msgid "Lectures"
+msgstr "Predavanja"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:307
+#| msgid "Connect"
+msgid "Concerts"
+msgstr "Koncerti"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:308
+#| msgid "_Bookmarks"
+msgid "Books"
+msgstr "Knjige"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:57
+#| msgid "Filter Results"
+msgid "Search Results"
+msgstr "Rezultati iskanja"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:138
+msgid "Searching the Internet Archive"
+msgstr "Iskanje spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:174
+msgid "No matches."
+msgstr "Ni skladanj."
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:179
+#, csharp-format
+msgid "Showing 1 match"
+msgid_plural "Showing 1 to {0:N0} of {1:N0} total matches"
+msgstr[0] "Prikaz 1 do {0:N0} od {1:N0} skupnih skladanj"
+msgstr[1] "Prikaz 1 do {0:N0} od {1:N0} skupnega skladanja"
+msgstr[2] "Prikaz 1 do {0:N0} od {1:N0} skupnih skladanj"
+msgstr[3] "Prikaz 1 do {0:N0} od {1:N0} skupnih skladanj"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:188
+msgid "Timed out searching the Internet Archive"
+msgstr "Zakasnitev med iskanjem spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:193
+msgid "Error searching the Internet Archive"
+msgstr "Napaka med iskanjem spletnega arhiva"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:88
+msgid "Fetch more results from the Internet Archive?"
+msgstr "Pridobi več rezultatov iz spletnega arhiva?"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:94
+msgid "Fetch More"
+msgstr "Pridobi več"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:128
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:61
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:98
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
+msgid "Creator"
+msgstr "Ustvarjalec"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:129
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:75
+#| msgid "Published"
+msgid "Publisher"
+msgstr "Založnik"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:133
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:67
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:91
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:46
+msgid "Downloads"
+msgstr "Prejemi"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:134
+#| msgid "format"
+msgid "Formats"
+msgstr "Vrste zapisov"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:136
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:65
+#| msgid "added"
+msgid "Added"
+msgstr "Dodano"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:62
+#| msgid "location"
+msgid "Collection"
+msgstr "Zbirka"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:63
+#| msgid "Contributors"
+msgid "Contributor"
+msgstr "Sodelavec"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:64
+#| msgid "Unrated"
+msgid "Created"
+msgstr "Ustvarjeno"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:68
+#| msgid "format"
+msgid "Format"
+msgstr "Vrsta"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:69
+msgid "ID"
+msgstr "ID"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:70
+msgid "Language"
+msgstr "Jezik"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:73
+#| msgid "Mime Type"
+msgid "Media Type"
+msgstr "Vrsta večpredstavnostne datoteke"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:74
+#| msgid "Disc Count"
+msgid "Review Count"
+msgstr "Število pregledov"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:71
+msgid "Moving Images"
+msgstr "Filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:72
+msgid "Animation & Cartoons"
+msgstr "Animacija in risanke"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:73
+msgid "Arts & Music"
+msgstr "Umetnost in glasba"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:74
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:99
+msgid "Computers & Technology"
+msgstr "Računalniki in tehnologija"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:75
+msgid "Cultural & Academic Films"
+msgstr "Kulturni in akademski filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:76
+msgid "Ephemeral Films"
+msgstr "Filmi Ephermeral"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:77
+#| msgid "Home Folder"
+msgid "Home Movies"
+msgstr "Domači filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:79
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:104
+msgid "News & Public Affairs"
+msgstr "Novice in javne zadeve"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:80
+#| msgid "Source Properties"
+msgid "Open Source Movies"
+msgstr "Odprto kodni filmi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:81
+msgid "Prelinger Archives"
+msgstr "Arhivi Prelinger"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:82
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:109
+msgid "Spirituality & Religion"
+msgstr "Duhovnost in vera"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:83
+#| msgid "Supports photos"
+msgid "Sports Videos"
+msgstr "Športni videi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:84
+#| msgid "Video Dimensions:"
+msgid "Videogame Videos"
+msgstr "Videi videoiger "
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:85
+#| msgid "Close"
+msgid "Vlogs"
+msgstr "Video blogi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:86
+#| msgid "Media"
+msgid "Youth Media"
+msgstr "Mladinski mediji"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:88
+#| msgid "ext"
+msgid "Texts"
+msgstr "Besedila"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:89
+msgid "American Libraries"
+msgstr "Ameriške knjižnice"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:90
+msgid "Canadian Libraries"
+msgstr "Kanadske knjižnice"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:91
+#| msgid "Remove From Library"
+msgid "Universal Library"
+msgstr "Splošna knjižnica"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:92
+msgid "Project Gutenberg"
+msgstr "Projekt Gutenberg"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:93
+#| msgid "Sort Children by"
+msgid "Children's Library"
+msgstr "Otroška knjižnica"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:94
+msgid "Biodiversity Heritage Library"
+msgstr "Knjižnica zapuščine bioraznolikosti"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:95
+msgid "Additional Collections"
+msgstr "Dodatne zbirke"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:98
+msgid "Audio Books & Poetry"
+msgstr "Zvočne knjige in poezija"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:100
+msgid "Grateful Dead"
+msgstr "Hvaležni mrtveci"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:101
+msgid "Live Music Archive"
+msgstr "Živi glasbeni arhiv"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:102
+#| msgid "Music Share"
+msgid "Music & Arts"
+msgstr "Glasba in umetnost"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:103
+#| msgid "Details"
+msgid "Netlabels"
+msgstr "Spletne oznake"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:105
+msgid "Non-English Audio"
+msgstr "Ne-angleški zvok"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:106
+#| msgid "Open Location"
+msgid "Open Source Audio"
+msgstr "Odprto kodni zvok"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:108
+msgid "Radio Programs"
+msgstr "Radijski programi"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:111
+#| msgid "duration"
+msgid "Education"
+msgstr "Izobraževanje"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:112
+#| msgid "Score"
+msgid "Software"
+msgstr "Program"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:113
+msgid "CLASP"
+msgstr "CLASP"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:92
+#| msgid "Downloads"
+msgid "Downloads This Week"
+msgstr "Prejemi ta teden"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:93
+#| msgid "New Preset"
+msgid "Newest"
+msgstr "Najnovejše"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:94
+#| msgid "Old Items"
+msgid "Oldest"
+msgstr "Najstarejše"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs:62
 msgid "Not Set"
@@ -3756,7 +4489,7 @@ msgstr "Dodajanje postaje"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:67
 msgid "Add a new Internet Radio station or playlist"
-msgstr "Dodajanje novega spletnega radia ali seznama predvajanj"
+msgstr "Dodajanje novega spletnega radia ali seznama predvajanja"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:83
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:64
@@ -3767,16 +4500,6 @@ msgstr "Urejanje postaje"
 msgid "Station"
 msgstr "Postaja"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
-msgid "Creator"
-msgstr "Ustvarjalec"
-
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
-msgid "Description"
-msgstr "Opis"
-
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:237
 msgid "Please provide a valid station URI"
 msgstr "Vnesti je treba veljaven URI postaje"
@@ -3799,7 +4522,7 @@ msgstr "Urejanje radijske postaje"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs:97
 msgid "Enter the Genre, Title and URL of the radio station you wish to add. A description is optional."
-msgstr "Vnos zvrsti, naslova in URL radijske postaje za dodajanje. Opis je poljuben."
+msgstr "Vnesite zvrst, naslov in URL radijske postaje za dodajanje. Opis je poljuben."
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs:118
 msgid "Station Genre:"
@@ -3828,37 +4551,37 @@ msgstr "Opis:"
 msgid "Rating:"
 msgstr "Ocena:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:126
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:125
 msgid "_Last.fm"
 msgstr "_Last.fm"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:127
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:126
 msgid "Configure the Audioscrobbler plugin"
 msgstr "Nastavitve Audioscrobbler vstavka"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:130
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:129
 msgid "Visit _User Profile Page"
-msgstr "Obisk spletne strani _uporabniškega profila"
+msgstr "Obišči spletno strano _uporabniškega profila"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:131
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:130
 msgid "Visit Your Last.fm Profile Page"
-msgstr "Obišče stran vašega Last.fm profila"
+msgstr "Obisk strani vašega Last.fm profila"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:134
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:133
 msgid "_Configure..."
 msgstr "_Nastavitve ..."
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:135
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:134
 msgid "Configure the Last.fm Extension"
 msgstr "Nastavitve Last.fm razširitve"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:140
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:139
 msgid "_Enable Song Reporting"
 msgstr "_Omogoči poročanje o skladbah"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:141
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:140
 msgid "Enable song reporting"
-msgstr "Omogoči poročanje o skladbah"
+msgstr "Omogočitev poročanja o skladbah"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:66
 msgid "_Add Station..."
@@ -3908,7 +4631,7 @@ msgstr "Ogled videov izvajalca"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:106
 msgid "Find videos by this artist"
-msgstr "Najde videoposnetke tega izvajalca"
+msgstr "Najdi videoposnetke tega izvajalca"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:109
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:110
@@ -3924,7 +4647,7 @@ msgstr "Podobno z"
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:135
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:156
 msgid "Recommend to"
-msgstr "Priporoči"
+msgstr "Priporoči izvajalca"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:120
 msgid "Recommend this artist to someone"
@@ -3948,11 +4671,11 @@ msgstr "Oznaka skladbe za priljubljeno"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:148
 msgid "Ban Track"
-msgstr "Skladbe ne maram"
+msgstr "Izobči skladbo"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:149
 msgid "Mark current track as banned"
-msgstr "Oznaka skladbe za nepriljubljeno"
+msgstr "Oznaka skladbe za izbončeno"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:153
 msgid "View this track's Last.fm page"
@@ -3960,7 +4683,7 @@ msgstr "Ogled Last.fm strani te skladbe"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:157
 msgid "Recommend this track to someone"
-msgstr "Priporočilo te skladbe"
+msgstr "Priporočite to skladbo"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:241
 #, csharp-format
@@ -4020,25 +4743,51 @@ msgstr "Moji najljubši izvajalci"
 msgid "{0} plays"
 msgstr "{0} predvajanj"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:102
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:104
 msgid "Edit Last.fm Settings"
 msgstr "Urejanje Last.fm nastavitev"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:103
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:105
 msgid "Sort Stations by"
 msgstr "Razvrščanje postaj po"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:156
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:160
 msgid "Total Play Count"
 msgstr "Števec vseh predvajanj"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:256
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:261
 msgid "Account Settings"
 msgstr "Nastavitve računa"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:258
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:263
 msgid "Join Last.fm"
-msgstr "Pridružitev Last.fm"
+msgstr "Pridružite se Last.fm"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:281
+#| msgid "trackcount"
+msgid "Account"
+msgstr "Račun"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:285
+#| msgid "Username:"
+msgid "_Username"
+msgstr "_Uporabniško ime"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:308
+msgid "Authorize Banshee with Last.fm"
+msgstr "Pooblastitev Banshee z Last.fm"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:315
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:331
+#| msgid "Banshee _Home Page"
+msgid "Banshee not authorized"
+msgstr "Banshee ni pooblaščen"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:316
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:330
+#| msgid "Banshee Music Share"
+msgid "Banshee authorized!"
+msgstr "Banshee je pooblaščen!"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:72
 msgid "New Station"
@@ -4108,17 +4857,13 @@ msgstr "Všeč"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:578
 msgid "Banshee Group"
-msgstr "Banshee skupina"
+msgstr "Skupina Banshee "
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:579
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:111
 msgid "Neighbors"
 msgstr "Sosedje"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:580
-msgid "Creative Commons"
-msgstr "Creative Commons"
-
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:85
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:94
 msgid "For User:"
@@ -4146,7 +4891,7 @@ msgstr "Oznaka"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:130
 msgid "Tag Name:"
-msgstr "Ime značke:"
+msgstr "Ime oznake:"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:138
 msgid "Fan"
@@ -4205,7 +4950,7 @@ msgstr "Neznana podobnost"
 
 #: ../src/Extensions/Banshee.Lastfm/Resources/lastfm.glade.h:1
 msgid "Station _Type:"
-msgstr "_Zvrst postaje:"
+msgstr "_Vrsta postaje:"
 
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs:25
 msgid "_Mini Mode"
@@ -4232,13 +4977,26 @@ msgstr "Trenutni vir:"
 msgid "Full Mode"
 msgstr "Polni način"
 
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:62
+msgid "Music Library"
+msgstr "Glasbena knjižnica"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:78
+msgid "Play Queue"
+msgstr "Predvajalna vrsta"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+msgid "Media"
+msgstr "Večpredstavnostna datoteka"
+
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "_Prikaži obvestila"
 
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:133
 msgid "Show notifications when item changes"
-msgstr "Prikaži obvestila ob spremembi predmeta"
+msgstr "Prikaz obvestil ob spremembi predmeta"
 
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:334
 msgid "Still Running"
@@ -4246,18 +5004,18 @@ msgstr "Še vedno teče"
 
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:335
 msgid "Banshee was closed to the notification area. Use the <i>Quit</i> option to end your session."
-msgstr "Program Banshee je skrit v območju z obvestili. Uporabite možnost <i>Izhod</i> za končanje seje."
+msgstr "Program Banshee je skrit v obvestilnem področju. Uporabite možnost <i>Končaj</i> za končanje seje."
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:451
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:457
 #: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:48
 msgid "Now Playing"
 msgstr "Predvaja se"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:461
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "Preskoči predmet"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:465
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "Obvestil ni mogoče prikazati"
 
@@ -4274,54 +5032,73 @@ msgstr "Uvoz iz Amaroka je spodletel"
 msgid "Amarok"
 msgstr "Amarok"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
-msgid "Unable to import song."
-msgstr "Skladbe ni mogoče uvoziti."
-
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
-msgid "Rhythmbox Music Player"
-msgstr "Rhythmbox predvajalnik glasbe"
-
+#. TODO add Help button and dialog/tooltip
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:68
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
 msgid "iTunes Importer"
 msgstr "iTunes uvoznik"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
-msgid "_Import"
-msgstr "_Uvozi"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:90
+#| msgid "Import _ratings"
+msgid "Import song ratings"
+msgstr "Uvoz ocen skladb"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
-msgid "Import _playlists"
-msgstr "Uvoz sezname _predvajanj"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:93
+msgid "Import play statistics (playcount, etc.)"
+msgstr "Uvoz statistike predvajanja (število predvajanj, itn.)"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:96
+#| msgid "Import _playlists"
+msgid "Import playlists"
+msgstr "Uvoz seznamov predvajanja"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:120
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
 #, csharp-format
 msgid "Locate your \"{0}\" file..."
 msgstr "Najdi datoteko \"{0}\" ..."
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:138
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
 #, csharp-format
 msgid "Locate \"{0}\""
 msgstr "Najdi \"{0}\""
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:167
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:389
 msgid "Locate iTunes Music Directory"
 msgstr "Najdi iTunes mapo glasbe"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:196
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:391
 #, csharp-format
 msgid "The iTunes library refers to your music directory as \"{0}\" but Banshee was not able to infer the location of this directory. Please locate it."
 msgstr "Knjižnica iTunes mapo z glasbo imenuje \"{0}\", vendar mesta te mape ni mogoče najti. Določiti jo je treba ročno."
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:72
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
 msgid "iTunes Media Player"
 msgstr "iTunes večpredstavnostni predvajalnik"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:132
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:395
 msgid "Banshee is not familiar with this version of the iTunes library format. Importing may or may not work as expected, or at all. Would you like to attempt to import anyway?"
 msgstr "Banshee ne pozna te različice zapisa iTunes knjižnice. Uvažanje morda ne bo delovalo po pričakovanjih ali pa sploh ne. Ali želite vseeno poskusiti z uvozom ?"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:437
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
+msgid "Unable to import song."
+msgstr "Skladbe ni mogoče uvoziti."
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
+msgid "Rhythmbox Music Player"
+msgstr "Rhythmbox predvajalnik glasbe"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
+msgid "Import _playlists"
+msgstr "Uvoz sezname _predvajanja"
+
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:47
 msgid "manually"
 msgstr "ročno"
@@ -4380,26 +5157,22 @@ msgstr "Odstrani vse skladbe s čakalne vrste predvajanja"
 
 #: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:78
 msgid "Clear the play queue when quitting"
-msgstr "Počisti čakalno vrsto predvajanja ob izhodu"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:77
-msgid "Play Queue"
-msgstr "Predvajalna vrsta"
+msgstr "Počisti čakalno vrsto predvajanja ob končanju"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:86
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:87
 msgid "Remove From Play Queue"
 msgstr "Odstrani s čakalne vrste predvajanja"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:747
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:781
 msgid "Number of _played songs to show"
 msgstr "Število _predvajanih skladb za prikaz"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:753
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:787
 msgid "Number of _upcoming songs to show"
 msgstr "Število _prihajajočih skladb za prikaz"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
 msgid "Podcast"
 msgstr "Podcast"
@@ -4409,16 +5182,16 @@ msgstr "Podcast"
 msgid "All Podcasts ({0})"
 msgstr "Vsi podcasti ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
 msgid "Published"
 msgstr "Objavljeno"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 msgid "New"
 msgstr "Novo"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
 msgid "Downloaded"
 msgstr "Prejeto"
@@ -4454,10 +5227,6 @@ msgstr "Novi predmeti"
 msgid "Old Items"
 msgstr "Stari predmeti"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:46
-msgid "Downloads"
-msgstr "Prenosi"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:50
 msgid "Downloading Podcast(s)"
 msgstr "Prejemanje podcast-a/ov"
@@ -4481,7 +5250,7 @@ msgstr[3] "Prenašanje {0} od {2} datotek pri {1} KB/s"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:133
 msgid "Canceling Downloads"
-msgstr "Preklicevanje prenosov"
+msgstr "Preklicevanje prejemanj"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:135
 msgid "Waiting for downloads to terminate..."
@@ -4490,7 +5259,7 @@ msgstr "Čakanje na konec prejemanja ..."
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:66
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:90
 msgid "Check for New Episodes"
-msgstr "Preveri nove epizode"
+msgstr "Preveri za nove epizode"
 
 #. "<control><shift>U",
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:67
@@ -4499,7 +5268,7 @@ msgstr "Osvežitev vseh podcastov"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:72
 msgid "Subscribe to Podcast..."
-msgstr "Naročanje podcasta ..."
+msgstr "Naročanje na podcast ..."
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:73
 msgid "Subscribe to a new podcast"
@@ -4511,7 +5280,7 @@ msgstr "Odjava naročnine in izbris"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:96
 msgid "Download All Episodes"
-msgstr "Prenos vseh epizod"
+msgstr "Prejem vseh epizod"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:102
 msgid "Visit Podcast Homepage"
@@ -4528,7 +5297,7 @@ msgstr "Označi kot staro"
 #. Translators: this is a verb used as a button name, not a noun
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:126
 msgid "Download Podcast(s)"
-msgstr "Prenos podcast-a/ov"
+msgstr "Prejmi podcast(e)"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:132
 msgid "Cancel Download"
@@ -4536,11 +5305,11 @@ msgstr "Preklic prenosa"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:138
 msgid "Remove Downloaded File(s)"
-msgstr "Odstranitev prenesen-e/ih datotek-e"
+msgstr "Odstranitev prejet-e/ih datotek-e"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:144
 msgid "Visit Website"
-msgstr "Obisk spletne strani"
+msgstr "Obisk spletišča"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:156
 msgid "Subscribe to Podcast"
@@ -4589,10 +5358,6 @@ msgstr "Opis ni na voljo"
 msgid "Podcast:"
 msgstr "Podcast:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:81
-msgid "Date:"
-msgstr "Datum:"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:61
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:170
 msgid "Subscribe"
@@ -4604,7 +5369,7 @@ msgstr "Naročilo na nov podcast"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:100
 msgid "Please enter the URL of the podcast to which you would like to subscribe."
-msgstr "Prosimo, vnesite URL podcasta, na katerega bi se radi naročili."
+msgstr "Vnesite URL podcasta, na katerega bi se radi naročili."
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:112
 msgid "When new episodes are available:  "
@@ -4612,7 +5377,7 @@ msgstr "Ko so dostopne nove epizode:"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs:41
 msgid "Download all episodes"
-msgstr "Prenos vseh epizod"
+msgstr "Prejem vseh epizod"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs:42
 msgid "Download the most recent episode"
@@ -4646,7 +5411,20 @@ msgstr "Zaustavitev SQL nadziranja"
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:551
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:36
+#| msgid "Hide context pane"
+msgid "open context menu"
+msgstr "odpri vsebinski meni"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:37
+msgid "click"
+msgstr "kliknite"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:37
+msgid "menu"
+msgstr "meni"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:606
 #, csharp-format
 msgid "Hide <i>{0}</i>"
 msgstr "Skrij <i>{0}</i>"
@@ -4739,11 +5517,13 @@ msgstr "pred"
 msgid "after"
 msgstr "za"
 
+#: ../src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs:43
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:41
 #: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:45
 msgid "is"
 msgstr "je"
 
+#: ../src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs:44
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:42
 #: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:46
 msgid "is not"
@@ -4805,85 +5585,131 @@ msgstr "Last.fm prijava računa"
 
 #: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs:79
 msgid "Please enter your Last.fm account credentials."
-msgstr "Prosimo, vnesite uporabniške podatke Last.fm računa."
+msgstr "Vnesite uporabniške podatke Last.fm računa."
 
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs:105
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs:106
 msgid "Save and Log In"
 msgstr "Shrani in se prijavi"
 
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:113
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:86
 msgid "Sign up for Last.fm"
-msgstr "Vpis za Last.fm"
+msgstr "Vpis v Last.fm"
 
-#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:446
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:458
-msgid "Last.fm username or password is invalid."
-msgstr "Last.fm uporabniško ime ali geslo je neveljavno."
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:98
+#| msgid "View on Last.fm"
+msgid "Authorize for Last.fm"
+msgstr "Pooblasti za Last.fm"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:301
-msgid "Failed to Login to Last.fm"
-msgstr "Prijava v Last.fm je spodletela"
+#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:448
+msgid "Last.fm username is invalid or Banshee is not authorized to access you account."
+msgstr "Uporabniško ime Last.fm je neveljavno ali pa Banshee ni pooblaščen za dostop do vašega računa."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:302
-msgid "Either your username or password is invalid."
-msgstr "Uporabniško ime ali geslo je neveljavno."
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:271
+msgid "This service does not exist."
+msgstr "Ta storitev ne obstaja."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:275
+msgid "This station is only available to subscribers."
+msgstr "Ta postaja je dostopna le naročnikom."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:277
+msgid "This station is not available."
+msgstr "Ta postaja ni dostopna."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:279
+msgid "The request is missing a required parameter."
+msgstr "Zahtevi manjka zahtevan parameter."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:281
+msgid "The specified resource is invalid."
+msgstr "Določen vir je neveljaven."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:283
+msgid "Server error, please try again later."
+msgstr "Napaka strežnika, poskusite ponovno kasneje."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:285
+msgid "Invalid authentication information, please re-authenticate."
+msgstr "Neveljavni podatki overitve, ponovno overite."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:287
+msgid "The API key used by this application is invalid."
+msgstr "Ključ API, ki ga uporablja ta program, je neveljaven."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:440
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:289
+msgid "The streaming system is offline for maintenance, please try again later."
+msgstr "Sistem pretakanja ni povezan zaradi vzdrževanja. Poskusite kasneje."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:291
+msgid "The method signature is invalid."
+msgstr "Način podpisa je neveljave"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:294
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:321
+msgid "You need to allow Banshee to access your Last.fm account."
+msgstr "Banshee morate dovoliti dostop do vašega Last.fm računa."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:296
 msgid "There is not enough content to play this station."
 msgstr "Na tej postaji ni dovolj vsebine za predvajanje."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:441
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:298
 msgid "This group does not have enough members for radio."
 msgstr "Skupina nima dovolj članov za radio."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:442
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:300
 msgid "This artist does not have enough fans for radio."
 msgstr "Izvajalec nima dovolj oboževalcev za radio."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:443
-msgid "This station is not available."
-msgstr "Ta postaja ni dostopna."
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:444
-msgid "This station is only available to subscribers."
-msgstr "Ta postaja je dostopna samo naročnikom."
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:445
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:302
 msgid "There are not enough neighbours for this station."
 msgstr "Za to postajo ni dovolj sosedov. "
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:446
-msgid "The streaming system is offline for maintenance, please try again later."
-msgstr "Sistem pretakanja ni povezan zaradi vzdrževanja. Poskusite kasneje."
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:447
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:304
 msgid "There was an unknown error."
 msgstr "Prišlo je do neznane napake."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:455
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:313
 msgid "Not connected to Last.fm."
 msgstr "Ni povezave z Last.fm"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:456
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:315
 msgid "Account details are needed before you can connect to Last.fm"
 msgstr "Pred povezavo z Last.fm so potrebne podrobnosti o računu"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:457
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:317
 msgid "No network connection detected."
 msgstr "Omrežna povezava ni bila zaznana."
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:459
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:319
+#| msgid "Last.fm username or password is invalid."
+msgid "Last.fm username is invalid."
+msgstr "Last.fm uporabniško ime je neveljavno."
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:323
 msgid "Connecting to Last.fm."
 msgstr "Povezovanje z Last.fm"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:460
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:325
 msgid "Connected to Last.fm."
-msgstr "Povezan z Last.fm "
+msgstr "Povezano z Last.fm "
 
 #: ../src/Libraries/Migo/Migo.Syndication/Feed.cs:149
 msgid "Unknown Podcast"
 msgstr "Neznan Podcast"
 
+#~ msgid "Failed to Login to Last.fm"
+#~ msgstr "Prijava v Last.fm je spodletela"
+#~ msgid "Either your username or password is invalid."
+#~ msgstr "Uporabniško ime ali geslo je neveljavno."
+#~ msgid "Home Directory"
+#~ msgstr "_Domači imenik:"
+#~ msgid "Choose an import _source:"
+#~ msgstr "Izbor _vira uvoza:"
+#~ msgid "I_mport Media Source"
+#~ msgstr "_Uvoz vira večpredstavnostnih datotek"
+#~ msgid "Import Media to Library"
+#~ msgstr "Uvoz večpredstavnostnih datotek v knjižnico"
 #~ msgid "0"
 #~ msgstr "0"
 #~ msgid "0 MB"
@@ -4913,7 +5739,7 @@ msgstr "Neznan Podcast"
 #~ msgid "<b>Play count:</b>"
 #~ msgstr "<b>Števec predvajanj:</b>"
 #~ msgid "<b>Sample rate:</b>"
-#~ msgstr "<b>Vzorčna stopnja:</b>"
+#~ msgstr "<b>Vzorčna raven:</b>"
 #~ msgid "<b>Session Information</b>"
 #~ msgstr "<b>Podrobnosti seje</b>"
 #~ msgid "<b>Write Options</b>"
@@ -4961,9 +5787,9 @@ msgstr "Neznan Podcast"
 #~ msgid "Could not link cdparanoiasrc to mbtrm"
 #~ msgstr "Ni mogoče povezati cdparanoiasrc z mbtrm"
 #~ msgid "Could not link mbtrm to queue"
-#~ msgstr "Ni mogoče povezati mbtrm z queue"
+#~ msgstr "Ni mogoče povezati mbtrm s queue"
 #~ msgid "Could not link queue to encoder"
-#~ msgstr "Nei mogoče povezati vrste z kodirnikom"
+#~ msgstr "Ne se mogoče povezati vrste s kodirnikom"
 #~ msgid "Could not link encoder to gnomevfssink"
 #~ msgstr "Ni mogoče povezat kodirnika z gnomevfssink"
 #~ msgid "Encoding element does not support tagging!"
@@ -5040,8 +5866,6 @@ msgstr "Neznan Podcast"
 #~ msgstr "Širina stolpca letnice"
 #~ msgid "N/A"
 #~ msgstr "N/A"
-#~ msgid "Missing"
-#~ msgstr "Manjka"
 #~ msgid "Columns..."
 #~ msgstr "Stolpci ..."
 #~ msgid "Import _Folder..."
@@ -5095,7 +5919,7 @@ msgstr "Neznan Podcast"
 #~ msgid "Search all songs of this genre"
 #~ msgstr "Iskanje po zvrsti"
 #~ msgid "Ratin_g"
-#~ msgstr "_Stopnja"
+#~ msgstr "_Ocena"
 #~ msgid "Repeat N_one"
 #~ msgstr "_Ne ponovi"
 #~ msgid "Repeat Si_ngle"
@@ -5157,7 +5981,7 @@ msgstr "Neznan Podcast"
 #~ msgid "Insert Blank CD"
 #~ msgstr "Vstavite prazen CD"
 #~ msgid "Please insert a blank CD disk for the write process."
-#~ msgstr "Prosim, vstavite prazen CD za zapis."
+#~ msgstr "Vstavite prazen CD za zapis."
 #~ msgid "The inserted media is not large enough to hold your selected music."
 #~ msgstr "Vstavljen medij ni dovolj velik za izbrano glasbo."
 #~ msgid "{0} more minute is needed on the media."
@@ -5205,7 +6029,7 @@ msgstr "Neznan Podcast"
 #~ msgid "Insert blank disc"
 #~ msgstr "Vstavi prazen disk"
 #~ msgid "Please insert a blank disc for the write process."
-#~ msgstr "Prosim, vstavite prazen disk za pisanje."
+#~ msgstr "Vstavite prazen disk za pisanje."
 #~ msgid "New Audio CD"
 #~ msgstr "Nov zvočni CD"
 #~ msgid "CD Session"
@@ -5283,8 +6107,6 @@ msgstr "Neznan Podcast"
 #~ msgstr "Vzorec imena zbirke"
 #~ msgid "Library Folder Pattern"
 #~ msgstr "Vzorec map zbirke"
-#~ msgid "Library location"
-#~ msgstr "Položaj zbirke"
 #~ msgid "Library source expansion"
 #~ msgstr "Razširitev virov zbirke"
 #~ msgid "List of URIs in the history drop-down for the open location dialog"
@@ -5464,8 +6286,6 @@ msgstr "Neznan Podcast"
 #~ msgstr "Banshee vstavki"
 #~ msgid "Plugin Name"
 #~ msgstr "Ime vstavka"
-#~ msgid "Overview"
-#~ msgstr "Pregled"
 #~ msgid "This plugin could not be initialized."
 #~ msgstr "Vstavka ni mogoče pripraviti."
 #~ msgid "Playing Music"
@@ -5486,7 +6306,7 @@ msgstr "Neznan Podcast"
 #~ msgid "Copy CD"
 #~ msgstr "Kopiraj CD"
 #~ msgid "Synchronizing your Device, Please Wait..."
-#~ msgstr "Usklajevanje naprave. Prosim, počakajte ..."
+#~ msgstr "Usklajevanje naprave. Počakajte ..."
 #~ msgid "You are currently importing from {0}. Would you like to stop it?"
 #~ msgstr "Trenutno uvažate glasbo preko {0}. Ali želite uvoz preklicati?"
 #~ msgid "Copying from {0}"
@@ -5501,12 +6321,9 @@ msgstr "Neznan Podcast"
 #~ msgstr "Ni mogoče preimenovati predvajalne liste"
 #~ msgid ""
 #~ "A playlist with this name already exists. Please choose another name."
-#~ msgstr ""
-#~ "Predvajalna lista s tem imenom že obstaja. Prosim, izberite novo ime."
+#~ msgstr "Predvajalna lista s tem imenom že obstaja. Izberite novo ime."
 #~ msgid "{0:0.00} GB"
 #~ msgstr "{0:0.00} GB"
-#~ msgid "All"
-#~ msgstr "Vse"
 #~ msgid "Write selection to CD"
 #~ msgstr "Zapiši izbor na CD"
 #~ msgid "Import CD into library"
@@ -5554,11 +6371,11 @@ msgstr "Neznan Podcast"
 #~ "<big>•</big> <i>Save Manual Changes</i>: save only the manual changes you "
 #~ "made"
 #~ msgstr ""
-#~ "Spremenjen je {0}. Prosim, izberite način posodabljanja vsebine za {0}.\n"
+#~ "Spremenjen je {0}. Izberite način posodabljanja vsebine za {0}.\n"
 #~ "\n"
 #~ "<big>•</big> <i>Usklajevanje zbirke</i>: usklajevanje Banshee zbirke z "
 #~ "{0}\n"
-#~ "<big>•</big> <i>Shrani ročne spremembe</i>: shrani samo ročne spremembe"
+#~ "<big>•</big> <i>Shrani ročne spremembe</i>: shrani le ročne spremembe"
 #~ msgid ""
 #~ "<b>Warning:</b> Actions will alter or erase existing iPod contents and "
 #~ "may cause incompatibility with iTunes!"
@@ -5569,8 +6386,6 @@ msgstr "Neznan Podcast"
 #~ msgstr "Usklajevanje zvirke"
 #~ msgid "Save Manual Changes"
 #~ msgstr "Shrani spremembe"
-#~ msgid "Choose Columns"
-#~ msgstr "Izbor stolpcev"
 #~ msgid "Visible Playlist Columns"
 #~ msgstr "Vidni stolpci predvajalne liste"
 #~ msgid "Searching: {0}"
@@ -5583,8 +6398,8 @@ msgstr "Neznan Podcast"
 #~ "Please consider submitting information about your iPod to the Banshee "
 #~ "Project so your iPod may be more fully identified in the future.\n"
 #~ msgstr ""
-#~ "Prosim, razmislite o pošiljanju podrobnosti o različici iPoda Banshee "
-#~ "projektu, za boljšo podporo in delovanje v prihodnosti.\n"
+#~ "Razmislite o pošiljanju podrobnosti o različici iPoda Banshee projektu, "
+#~ "za boljšo podporo in delovanje v prihodnosti.\n"
 #~ msgid "Do not ask me again"
 #~ msgstr "Ne sprašuj me več."
 #~ msgid "Go to Web Site"
@@ -5681,8 +6496,6 @@ msgstr "Neznan Podcast"
 #~ msgstr "Izmenjaj mojo glasbeno zbirko z drugimi"
 #~ msgid "Share name:"
 #~ msgstr "Ime izmenjave:"
-#~ msgid "Banshee Music Share"
-#~ msgstr "Banshee izmenjava glasbe"
 #~ msgid ""
 #~ "Allow browsing and listening to songs from music shares and share your "
 #~ "Banshee library with others. Works with other instances of Banshee, "
@@ -5728,9 +6541,9 @@ msgstr "Neznan Podcast"
 #~ msgid "Notification area plugin enabled"
 #~ msgstr "Vstavek ikone opozorilne vrstice omogočen"
 #~ msgid "Quit instead of hide to notification area on close"
-#~ msgstr "Zapusti program namesto shrivanja v opozorilni vrstici"
+#~ msgstr "Končaj program namesto skrivanja v opozorilni vrstici"
 #~ msgid "Quit on close"
-#~ msgstr "Zapusti ob izhodu"
+#~ msgstr "Končaj ob zapiranju okna"
 #~ msgid "Show a notification when closing main window"
 #~ msgstr "Pokaži opozorila ob spremembi zaprtju okna"
 #~ msgid "Show track information notifications when track starts playing"
@@ -5742,7 +6555,7 @@ msgstr "Neznan Podcast"
 #~ msgid "Notification Area Icon"
 #~ msgstr "Ikona opozorilne vrstice"
 #~ msgid "Quit Banshee when title bar close button is clicked"
-#~ msgstr "Zapusti program Banshee ob kliku na gumb zapri"
+#~ msgstr "Končaj program Banshee ob kliku na gumb zapri"
 #~ msgid "Shows the Notification Area Icon"
 #~ msgstr "Prikaže ikono v opozorilni vrstici"
 
diff --git a/po/sv.po b/po/sv.po
index ce4270b..f272f38 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: banshee\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-18 13:11+0200\n"
-"PO-Revision-Date: 2009-09-18 13:12+0100\n"
+"POT-Creation-Date: 2009-11-05 07:39+0100\n"
+"PO-Revision-Date: 2009-11-05 07:40+0100\n"
 "Last-Translator: Daniel Nylander <po at danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv at listor.tp-sv.se>\n"
 "MIME-Version: 1.0\n"
@@ -451,16 +451,19 @@ msgstr "Uri"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "Artistnamn"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "Albumtitel"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "Spårtitel"
 
@@ -488,6 +491,7 @@ msgstr "Skivnummer"
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "År"
 
@@ -596,7 +600,7 @@ msgid "Add an album to the playlist"
 msgstr "Lägg till ett album i spellistan"
 
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:76
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
 msgid "Banshee Media Player"
@@ -616,6 +620,7 @@ msgid "_Search:"
 msgstr "_Sök:"
 
 #: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "Artist, Album eller Titel"
 
@@ -623,6 +628,7 @@ msgstr "Artist, Album eller Titel"
 #: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "Genre"
 
@@ -753,7 +759,7 @@ msgid "Scanning for media"
 msgstr "Söker efter media"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1206
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1250
 msgid "Scanning..."
 msgstr "Söker av..."
 
@@ -791,13 +797,13 @@ msgstr "Uppgradering av din Banshee-databas"
 msgid "Please wait while your old Banshee database is migrated to the new format."
 msgstr "Vänta under tiden din gamla Banshee-databas migreras till det nya formatet."
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1203
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1247
 msgid "Refreshing Metadata"
 msgstr "Uppdaterar metadata"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Directory"
-msgstr "Hemkatalog"
+msgid "Home Folder"
+msgstr "Hemmapp"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
 msgid "Remove From Library"
@@ -833,76 +839,76 @@ msgstr "Fil_namn"
 msgid "Miscellaneous"
 msgstr "Diverse"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "Favoriter"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr "Låtar betygsatta med fyra och fem stjärnor"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "Senaste favoriter"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr "Låtar som spelats ofta den senaste veckan"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
 msgid "Recently Added"
 msgstr "Senaste tillagda"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "Låtar som importerats den senaste veckan"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "Inte hörda"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
 msgstr "Låtar som inte har spelats eller hoppats över"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "Försummade favoriter"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:110
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
 msgid "Favorites not played in over two months"
 msgstr "Favoriter som inte har spelats de senaste två månaderna"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "Minst omtyckta"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr "Låtar betygsatta med en eller två stjärnor eller som du har ofta hoppat över"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "700 MB favoriter"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr "En dataskiva full med favoritlåtar"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "80 minuter favoriter"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:126
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr "En ljudskiva full med favoritlåtar"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr "Inte betygsatt"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:132
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr "Låtar som inte har blivit betygsatta"
 
@@ -1004,19 +1010,19 @@ msgid "There is no available network connection"
 msgstr "Det finns ingen tillgänglig nätverksanslutning"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:78
-msgid "Cannot connect to NetworkManager"
-msgstr "Kan inte ansluta till NetworkManager"
+msgid "Cannot connect to NetworkManager or Wicd"
+msgstr "Kan inte ansluta till NetworkManager eller Wicd"
 
 # Intressant engelska
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:79
 msgid "An available, working network connection will be assumed"
 msgstr "En tillgänglig, fungerande nätverksanslutning kommer att antas"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:150
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:157
 msgid "_Disable features requiring Internet access"
 msgstr "_Inaktivera funktioner som kräver internetåtkomst"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:151
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:158
 msgid "Some features require a broadband Internet connection such as Last.fm or cover art fetching"
 msgstr "Vissa funktioner kräver en bredbandsanslutning till Internet såsom Last.fm eller hämtning av albumomslag"
 
@@ -1099,8 +1105,8 @@ msgstr "Artist"
 #. Translators: noun
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:659
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:662
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
 msgid "Name"
 msgstr "Namn"
 
@@ -1129,6 +1135,7 @@ msgid "Least Often Played"
 msgstr "Minst spelade"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:58
 msgid "Most Recently Played"
 msgstr "Mest spelade det senaste"
 
@@ -1559,9 +1566,9 @@ msgid "Plays"
 msgstr "Spelningar"
 
 #: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:309
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:200
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:376
 msgid "Unknown"
 msgstr "Okänd"
@@ -1630,7 +1637,7 @@ msgid "Close Error Report"
 msgstr "Stäng felrapport"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:82
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
 msgid "Error"
 msgstr "Fel"
 
@@ -1652,25 +1659,25 @@ msgstr "Sortera spellistor efter"
 msgid "Drive"
 msgstr "Disk"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:687
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:678
 #, csharp-format
 msgid "Adding {0} of {1} to {2}"
 msgstr "Lägger till {0} av {1} till {2}"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:706
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:697
 #, csharp-format
 msgid "Deleting {0} of {1} From {2}"
 msgstr "Tar bort {0} av {1} från {2}"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:664
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:667
 msgid "Size Ascending"
 msgstr "Storlek stigande"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:669
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:672
 msgid "Size Descending"
 msgstr "Storlek fallande"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:758
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:761
 #, csharp-format
 msgid "{0} item"
 msgid_plural "{0} items"
@@ -1859,6 +1866,11 @@ msgstr "Fråga mig inte igen"
 msgid "Make Banshee the Default"
 msgstr "Gör Banshee till standardspelare"
 
+#. Translators: verb
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+msgid "I_mport"
+msgstr "I_mportera"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs:39
 msgid "Select album cover image"
 msgstr "Välj albumomslagsbild"
@@ -1880,7 +1892,7 @@ msgid "Browse..."
 msgstr "Bläddra..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs:98
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
 msgid "Open Location"
 msgstr "Öppna plats"
 
@@ -2000,19 +2012,15 @@ msgstr "_Versionsinformation"
 msgid "View detailed version and configuration information"
 msgstr "Visa detaljerad versions- och konfigurationsinformation"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:163
+#. Prompt user for location of the playlist.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:160
 msgid "Import Playlist"
 msgstr "Importera spellista"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:170
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:161
 msgid "Playlists"
 msgstr "Spellistor"
 
-#. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:178
-msgid "I_mport"
-msgstr "I_mportera"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
 msgid "Play or pause the current item"
 msgstr "Spela upp eller pausa aktuellt objekt"
@@ -2260,7 +2268,7 @@ msgid "Edit information on selected tracks"
 msgstr "Redigera information för markerade spår"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:234
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:247
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:108
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:150
 msgid "Properties"
@@ -2306,7 +2314,10 @@ msgstr "Ta _bort från enhet"
 msgid "Permanently delete selected item(s) from medium"
 msgstr "Ta permanent bort markerade objekt från lagringsmedia"
 
+#. Translators: this is a verb (command), not a noun (things)
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "_Sök"
 
@@ -2554,86 +2565,86 @@ msgstr "Ställ in alla sorterade albumtitlar till detta värde"
 msgid "Sort Album Title:"
 msgstr "Sortera albumtitel:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:90
 msgid "Value"
 msgstr "Värde"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
 msgid "File Name:"
 msgstr "Filnamn:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
 msgid "Directory:"
 msgstr "Katalog:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
 msgid "Full Path:"
 msgstr "Fullständig sökväg:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:164
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
 msgid "URI:"
 msgstr "URI:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:173
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
 msgid "Duration:"
 msgstr "Speltid:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:179
 msgid "Audio Bitrate:"
 msgstr "Bitfrekvens för ljud:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:178
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:181
 msgid "Audio Sample Rate:"
 msgstr "Ljudsamplingsfrekvens:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:180
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
 msgid "Audio Channels:"
 msgstr "Ljudkanaler:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:186
 msgid "Video Dimensions:"
 msgstr "Videodimensioner:"
 
 #. Translators: {0} is the description of the codec
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:190
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:193
 #, csharp-format
 msgid "{0} Codec:"
 msgstr "{0}-kodek:"
 
 # Mycket underlig sträng
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:195
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:198
 msgid "Container Formats:"
 msgstr "Behållarformat:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:199
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
 msgid "Imported On:"
 msgstr "Importerades:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:201
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
 msgid "Last Played:"
 msgstr "Senast spelad:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
 msgid "Last Skipped:"
 msgstr "Senast överhoppad:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:208
 msgid "Play Count:"
 msgstr "Spelräknare:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:209
 msgid "Skip Count:"
 msgstr "Överhoppad:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:210
 msgid "Score:"
 msgstr "Poäng:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:213
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:216
 msgid "File Size:"
 msgstr "Filstorlek:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:214
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:217
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
 msgid "bytes"
 msgstr "byte"
@@ -2807,49 +2818,62 @@ msgstr "Fortsätt {0}"
 msgid "Stopping..."
 msgstr "Stoppar..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:45
 msgid "Import Files to Library"
 msgstr "Importera filer till bibliotek"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:48
 msgid "Media Files"
 msgstr "Mediafiler"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:59
 msgid "Local Files"
 msgstr "Lokala filer"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
+msgid "C_hoose Files"
+msgstr "V_älj filer"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
 msgid "_Files to import:"
 msgstr "_Filer att importera:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:82
 msgid "Select Files"
 msgstr "Välj filer"
 
 # FIXME. This is confusing.
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:83
 msgid "(none selected)"
 msgstr "(inga valda)"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:43
 msgid "Import Folders to Library"
 msgstr "Importera mappar till bibliotek"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:53
 msgid "Local Folders"
 msgstr "Lokala mappar"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
+msgid "C_hoose Folders"
+msgstr "V_älj mappar"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
 msgid "_Folders to import:"
 msgstr "_Mappar att importera:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:81
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:76
 msgid "Select Folders"
 msgstr "Välj mappar"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:89
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+msgid "_Import"
+msgstr "_Importera"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
-msgid "Videos from Photos Folder"
+msgid "Videos From Photos Folder"
 msgstr "Videoklipp från mappen Foton"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
@@ -2885,6 +2909,11 @@ msgstr "Välj biblioteksplats"
 msgid "Reset"
 msgstr "Återställ"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
+#, csharp-format
+msgid "Reset location to default ({0})"
+msgstr "Återställ plats till standard ({0})"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
 msgstr "Kunde inte visa inställningar"
@@ -2930,46 +2959,38 @@ msgid "<big><b>Import Media to Library</b></big>"
 msgstr "<big><b>Importera media till bibliotek</b></big>"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
-msgid "Choose an import _source:"
-msgstr "Välj en import_källa:"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Create and save"
 msgstr "Skapa och spara"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Do not show this dialog again"
 msgstr "Visa inte denna dialogruta igen"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
 msgid "Enter the address of the file you would like to open:"
 msgstr "Ange adressen till filen du vill öppna:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
-msgid "I_mport Media Source"
-msgstr "I_mportera mediakälla"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+msgid "Import _from:"
+msgstr "Importera _från:"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
-msgid "Import Media to Library"
-msgstr "Importera media till bibliotek"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Open in editor"
 msgstr "Öppna i redigerare"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
 msgid "Playlist _Name: "
 msgstr "Spelliste_namn: "
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Predefined Smart Playlists"
 msgstr "Fördefinierade smarta spellistor"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:14
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
 msgid "Seek to Position"
 msgstr "Spola till position"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:15
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
 msgid "Your media library is empty. You may import new music and videos into your library now, or choose to do so later."
 msgstr "Ditt mediabibliotek är tomt. Du kan importera ny musik och video till ditt bibliotek nu eller välja att göra det senare."
 
@@ -2993,11 +3014,11 @@ msgstr "Kontaktar..."
 msgid "Buffering"
 msgstr "Buffrar"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:547
 msgid "Muted"
 msgstr "Tystad"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
 msgid "Full Volume"
 msgstr "Full volym"
 
@@ -3140,7 +3161,7 @@ msgid "Import Purchased Music"
 msgstr "Importera köpt musik"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:94
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:98
 msgid "Podcasts"
 msgstr "Poddsändningar"
 
@@ -3149,12 +3170,12 @@ msgstr "Poddsändningar"
 msgid "Eject {0}"
 msgstr "Mata ut {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:104
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:108
 #, csharp-format
 msgid "Ejecting {0}..."
 msgstr "Matar ut {0}..."
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:111
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:115
 #, csharp-format
 msgid "Could not eject {0}: {1}"
 msgstr "Kunde inte mata ut {0}: {1}"
@@ -3201,7 +3222,7 @@ msgid "Capacity"
 msgstr "Kapacitet"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "Serienummer"
 
@@ -3225,27 +3246,27 @@ msgstr "Stöd för omslagsbilder"
 msgid "Supports photos"
 msgstr "Stöd för foton"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Out of space on device"
 msgstr "Slut på ledigt utrymme på enheten"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Please manually remove some songs"
 msgstr "Ta manuellt bort några låtar"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:661
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:637
 msgid "Syncing iPod"
 msgstr "Synkroniserar iPod"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:662
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:638
 msgid "Preparing to synchronize..."
 msgstr "Förbereder synkronisering..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:683
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:659
 msgid "Updating..."
 msgstr "Uppdaterar..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:687
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:663
 msgid "Flushing to disk..."
 msgstr "Skriver till disk..."
 
@@ -3346,12 +3367,12 @@ msgid "Ringtones"
 msgstr "Ringsignaler"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:117
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "MTP-stöd ignorerar enhet"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:118
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid "Banshee's MTP audio player support can only handle one device at a time."
 msgstr "Banshees stöd för MTP-ljudspelare kan endast hantera en enhet åt gången."
 
@@ -3371,19 +3392,19 @@ msgstr "Fel vid sökning efter MTP-enhetsstöd"
 msgid "An MTP device was detected, but Banshee was unable to load support for it."
 msgstr "En MTP-enhet hittades men Banshee kunde inte läsa in stöd för den."
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:145
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "Version"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:147
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "Batterinivå"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
 #. track currently being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:163
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "Läser in {0} - {1} av {2}"
@@ -3751,7 +3772,7 @@ msgid "Creator"
 msgstr "Skapare"
 
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
 msgid "Description"
 msgstr "Beskrivning"
@@ -4209,6 +4230,19 @@ msgstr "Aktuell källa:"
 msgid "Full Mode"
 msgstr "Normalt läge"
 
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:62
+msgid "Music Library"
+msgstr "Musikbibliotek"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:78
+msgid "Play Queue"
+msgstr "Spelkö"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+msgid "Media"
+msgstr "Media"
+
 #: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
 msgid "_Show Notifications"
 msgstr "Visa not_ifieringar"
@@ -4230,11 +4264,11 @@ msgstr "Banshee stängdes till notifieringsytan. Använd alternativet <i>Avsluta
 msgid "Now Playing"
 msgstr "Spelar nu"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:462
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:467
 msgid "Skip this item"
 msgstr "Hoppa över detta objekt"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:468
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:471
 msgid "Cannot show notification"
 msgstr "Kan inte visa notifiering"
 
@@ -4264,10 +4298,6 @@ msgstr "Musikspelaren Rhythmbox"
 msgid "iTunes Importer"
 msgstr "iTunes-importerare"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
-msgid "_Import"
-msgstr "_Importera"
-
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
 msgid "Import _playlists"
 msgstr "Importera _spellistor"
@@ -4359,24 +4389,20 @@ msgstr "Ta bort alla spår från spelkön"
 msgid "Clear the play queue when quitting"
 msgstr "Töm spelkön vid avslut"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:77
-msgid "Play Queue"
-msgstr "Spelkö"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:86
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:87
 msgid "Remove From Play Queue"
 msgstr "Ta bort från spelkö"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:747
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:775
 msgid "Number of _played songs to show"
 msgstr "Antalet s_pelade låtar att visa"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:753
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:781
 msgid "Number of _upcoming songs to show"
 msgstr "Antalet k_ommande låtar att visa"
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
 msgid "Podcast"
 msgstr "Poddsändning"
@@ -4386,16 +4412,16 @@ msgstr "Poddsändning"
 msgid "All Podcasts ({0})"
 msgstr "Alla poddsändningar ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
 msgid "Published"
 msgstr "Publicerad"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 msgid "New"
 msgstr "Ny"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:159
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
 msgid "Downloaded"
 msgstr "Hämtad"
@@ -4622,7 +4648,7 @@ msgstr "Stoppa SQL-övervakning"
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:551
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:569
 #, csharp-format
 msgid "Hide <i>{0}</i>"
 msgstr "Dölj <i>{0}</i>"
@@ -4861,8 +4887,14 @@ msgstr "Ansluten till Last.fm."
 msgid "Unknown Podcast"
 msgstr "Okänd poddsändning"
 
-#~ msgid "Music Library"
-#~ msgstr "Musikbibliotek"
+#~ msgid "Home Directory"
+#~ msgstr "Hemkatalog"
+#~ msgid "Choose an import _source:"
+#~ msgstr "Välj en import_källa:"
+#~ msgid "I_mport Media Source"
+#~ msgstr "I_mportera mediakälla"
+#~ msgid "Import Media to Library"
+#~ msgstr "Importera media till bibliotek"
 #~ msgid "Video Library"
 #~ msgstr "Videobibliotek"
 #~ msgid "No background tasks running"
@@ -5657,8 +5689,6 @@ msgstr "Okänd poddsändning"
 #~ msgstr "Synkronisera bibliotek"
 #~ msgid "Save Manual Changes"
 #~ msgstr "Spara manuella ändringar"
-#~ msgid "Choose Columns"
-#~ msgstr "Välj kolumner"
 #~ msgid "Visible Playlist Columns"
 #~ msgstr "Synliga spellistekolumner"
 #~ msgid "Order of Album column"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 968835a..6ce1ded 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -4,13 +4,17 @@
 # 甘露(Gan Lu) <rhythm.gan at gmail.com>, 2008.
 # Aron Xu <happyaron.xu at gmail.com>, 2009.
 #
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:122
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:125
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:128
 msgid ""
 msgstr ""
 "Project-Id-Version: banshee\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-08 23:46+0800\n"
-"PO-Revision-Date: 2008-10-19 11:17+0700\n"
-"Last-Translator: Aron Xu <happyaron.xu at gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=banshee&component=general\n"
+"POT-Creation-Date: 2009-11-17 07:11+0000\n"
+"PO-Revision-Date: 2009-11-15 21:55+0100\n"
+"Last-Translator: Tao Wei <weitao1979 at gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh at googlegroups.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,14 +27,15 @@ msgstr "声道"
 
 #: ../data/audio-profiles/flac.xml.in.h:1
 msgid "Free Lossless Audio Codec"
-msgstr "FLAC"
+msgstr "自由无损音频编码解码器"
 
 #: ../data/audio-profiles/flac.xml.in.h:2
 msgid ""
 "Free Lossless Audio Codec (FLAC) is an open source codec that compresses but "
 "does not degrade audio quality."
 msgstr ""
-"自由无损音频格式(FLAC)是一个开源编码格式,能够进行压缩而不降低音频质量"
+"自由无损音频编码解码器(FLAC)是一个开源编码解码器格式,能够进行压缩而不降低音"
+"频质量。"
 
 #: ../data/audio-profiles/mp3-lame.xml.in.h:1
 #: ../data/audio-profiles/mp3-xing.xml.in.h:1
@@ -131,8 +136,7 @@ msgstr "Vorbis 是一个开源的有损音频格式,在高质量输出下文
 msgid ""
 "A fast and efficient open source audio format offering lossless and high-"
 "quality lossy encoding with great dynamic range."
-msgstr ""
-"一个快速高效的开源音频格式,提供无损和高质量有损的大动态范围编码。"
+msgstr "一个快速高效的开源音频格式,提供无损和高质量有损的大动态范围编码。"
 
 #: ../data/audio-profiles/wavpack.xml.in.h:4
 msgid "Default"
@@ -182,8 +186,7 @@ msgstr "Wavpack"
 msgid ""
 "WAV+PCM is a lossless format that holds uncompressed, raw pulse-code "
 "modulated (PCM) audio."
-msgstr ""
-"WAV+PCM 是一个无损的格式,保存未压缩的原始脉冲码的调制(PCM)音频。"
+msgstr "WAV+PCM 是一个无损的格式,保存未压缩的原始脉冲码的调制(PCM)音频。"
 
 #: ../data/audio-profiles/wav.xml.in.h:2
 msgid "Waveform PCM"
@@ -194,8 +197,8 @@ msgid ""
 "A proprietary lossy audio format with high quality output at a lower file "
 "size than MP3. A 96 kbps WMA is equivalent to a 128 kbps MP3."
 msgstr ""
-"一个有版权的有损音频格式,在高质量输出下文件比 MP3 小。一个 96 kbps WMA 相当于"
-"一个 128 kbps MP3"
+"一个有版权的有损音频格式,在高质量输出下文件比 MP3 小。一个 96 kbps WMA 相当"
+"于一个 128 kbps MP3"
 
 #: ../data/audio-profiles/wma.xml.in.h:2
 msgid "Audio Quality"
@@ -314,7 +317,6 @@ msgstr "无法为抓轨找到编码器"
 msgid "Could not create CD ripping driver."
 msgstr "无法创建光盘抓轨程序"
 
-
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs:71
 msgid "Could not create BPM detection driver."
 msgstr "无法创建 BPM 检测驱动"
@@ -333,9 +335,13 @@ msgid "_Enable ReplayGain correction"
 msgstr "启用回放增益修正(_E)"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:556
+#, fuzzy
+#| msgid ""
+#| "For tracks that have ReplayGain data, automatically scale (normalize) "
+#| "playback volume."
 msgid ""
 "For tracks that have ReplayGain data, automatically scale (normalize) "
-"playback volume."
+"playback volume"
 msgstr "对于有回放增益数据的音轨,自动调节(正常化)播放音量。"
 
 #: ../src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs:63
@@ -343,12 +349,12 @@ msgid "Could not create transcoder"
 msgstr "无法创建转码器"
 
 #: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:87
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:125
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:126
 msgid "_Close"
 msgstr "关闭(_C)"
 
 #: ../src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs:88
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:126
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:127
 msgid "Close"
 msgstr "关闭"
 
@@ -473,17 +479,20 @@ msgid "URI"
 msgstr "URI"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:182
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:149
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:153
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:85
 msgid "Artist Name"
 msgstr "艺人姓名"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:183
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:150
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:154
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:86
 msgid "Album Title"
 msgstr "专辑标题"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:184
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:148
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:84
 msgid "Track Title"
 msgstr "音轨标题"
 
@@ -504,18 +513,25 @@ msgid "Track Count"
 msgstr "音轨计数"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:188
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:174
 msgid "Disc Number"
 msgstr "盘片编号"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:189
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:152
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:120
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:156
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:138
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:182
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:132
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:77
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:88
 msgid "Year"
 msgstr "年代"
 
 #: ../src/Clients/Booter/Booter/Entry.cs:190
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:235
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:131
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:60
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:96
 msgid "Rating"
 msgstr "评级"
 
@@ -623,7 +639,7 @@ msgid "Add an album to the playlist"
 msgstr "添加一张专辑到播放列表"
 
 #: ../src/Clients/Muinshee/Muinshee/PlayerInterface.cs:72
-#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:76
+#: ../src/Clients/Nereid/Nereid/PlayerInterface.cs:90
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs:197
 #: ../src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs:71
 msgid "Banshee Media Player"
@@ -638,23 +654,31 @@ msgstr "剩余 {0}"
 msgid "Play Song"
 msgstr "播放曲目"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:89
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:92
 msgid "_Search:"
 msgstr "搜索(_S):"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:147
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:83
 msgid "Artist, Album, or Title"
 msgstr "艺人、专辑或标题"
 
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:151
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:105
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:155
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:123
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:67
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:190
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:87
 msgid "Genre"
 msgstr "流派"
 
+#. Translators: noun
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:157
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
+msgid "Comment"
+msgstr "评论"
+
 #. Translators: this is a verb (command), not a noun (things)
-#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:173
+#: ../src/Clients/Nereid/Nereid/ViewContainer.cs:178
 #, csharp-format
 msgid "Filter Results"
 msgstr "过滤结果"
@@ -674,47 +698,70 @@ msgstr "未知艺人"
 msgid "Unknown Album"
 msgstr "未知专辑"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:84
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:92
 msgid "Track Artist"
 msgstr "音轨艺人"
 
 #. Alias for %album_artist%
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:89
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:95
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:97
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:103
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:105
 msgid "Album Artist"
 msgstr "专辑艺人"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:100
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:108
 msgid "Album Artist Initial"
 msgstr "专辑初始艺人"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:110
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:113
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
+msgid "Conductor"
+msgstr "指挥"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:118
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
+msgid "Composer"
+msgstr "作曲"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:128
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:63
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:115
 msgid "Album"
 msgstr "专辑"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:115
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:133
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:127
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:76
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:97
 msgid "Title"
 msgstr "标题"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:125
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:144
 msgid "Count"
 msgstr "计数"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:130
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:150
 msgid "Number"
 msgstr "编号"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:135
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:156
 msgid "Count (unsorted)"
 msgstr "计数(未排序)"
 
-#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:140
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:162
 msgid "Number (unsorted)"
 msgstr "编号(未排序)"
 
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:168
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:131
+msgid "Disc Count"
+msgstr "光盘计数"
+
+#: ../src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs:180
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
+msgid "Grouping"
+msgstr "分组"
+
 #: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:48
 msgid "Unknown Title"
 msgstr "未知标题"
@@ -725,37 +772,37 @@ msgid "Various Artists"
 msgstr "众艺人"
 
 #. TODO turn this into a PrimarySource-owned delegate?
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:517
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:522
 msgid "_Restart Podcast"
 msgstr "重新开始播客(_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:518
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:523
 msgid "_Restart Video"
 msgstr "重新开始视频(_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:519
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:524
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:86
 msgid "_Restart Song"
 msgstr "重新开始曲目(_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:520
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:525
 msgid "_Restart Item"
 msgstr "重新开始项目(_R)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:534
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:539
 msgid "_Jump to Playing Podcast"
 msgstr "跳到当前播放播客(_J)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:535
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:540
 msgid "_Jump to Playing Video"
 msgstr "跳到当前播放视频(_J)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:536
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:541
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:82
 msgid "_Jump to Playing Song"
 msgstr "跳到当前播放曲目(_J)"
 
-#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:537
+#: ../src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:542
 msgid "_Jump to Playing Item"
 msgstr "跳到当前播放项目(_J)(_J)"
 
@@ -774,7 +821,7 @@ msgid "Scanning for media"
 msgstr "正在扫描介质"
 
 #: ../src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:187
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1192
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1250
 msgid "Scanning..."
 msgstr "正在扫描..."
 
@@ -813,12 +860,12 @@ msgid ""
 "Please wait while your old Banshee database is migrated to the new format."
 msgstr "请等待您的旧 Banshee 数据库转换为新的格式。"
 
-#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1189
+#: ../src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs:1247
 msgid "Refreshing Metadata"
 msgstr "正在刷新元数据"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs:48
-msgid "Home Directory"
+msgid "Home Folder"
 msgstr "主目录"
 
 #: ../src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs:58
@@ -851,80 +898,81 @@ msgstr "文件名(_N)"
 
 #. Misc section
 #: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:70
-#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:63
+#: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:64
 msgid "Miscellaneous"
 msgstr "杂项"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:87
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
 #: ../src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs:85
 msgid "Favorites"
 msgstr "我的最爱"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:88
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
 msgid "Songs rated four and five stars"
 msgstr "评级为4星和5星的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:92
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
 msgid "Recent Favorites"
 msgstr "最近的我的最爱"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:93
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
 msgid "Songs listened to often in the past week"
 msgstr "在过去一周中经常听的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:97
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:95
 msgid "Recently Added"
 msgstr "最近添加的"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:98
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
 msgid "Songs imported within the last week"
 msgstr "上周内导入的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:102
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:107
 msgid "Unheard"
 msgstr "未听过的"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:103
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:108
 msgid "Songs that have not been played or skipped"
 msgstr "未曾播放过或跳过的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:109
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
 msgid "Neglected Favorites"
 msgstr "忽略的我的最爱"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:110
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
 msgid "Favorites not played in over two months"
 msgstr "在过去两周内没有播放过的处于“我的最爱”分类的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:114
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
 msgid "Least Favorite"
 msgstr "最不喜欢"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:115
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
 msgid "Songs rated one or two stars or that you have frequently skipped"
 msgstr "评级为1星或2星,或者您经常跳过的曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:119
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:124
 msgid "700 MB of Favorites"
 msgstr "我的最爱中的 700 MB"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:120
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
 msgid "A data CD worth of favorite songs"
 msgstr "包含我的最爱曲目的数据光盘"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:125
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:130
 msgid "80 Minutes of Favorites"
 msgstr "我的最爱中的 80 分钟曲目"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:126
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
 msgid "An audio CD worth of favorite songs"
 msgstr "包含我的最爱曲目的音频光盘"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:136
 msgid "Unrated"
 msgstr "未评级的"
 
-#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:132
+#: ../src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs:137
 msgid "Songs that haven't been rated"
 msgstr "未曾评级的曲目"
 
@@ -997,36 +1045,51 @@ msgid "Write _metadata to files"
 msgstr "写元数据到文件内(_M)"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:49
-msgid ""
-"Enable this option to save tags and other metadata inside supported audio "
-"files."
+#, fuzzy
+#| msgid ""
+#| "Enable this option to save tags and other metadata inside supported audio "
+#| "files."
+msgid "Save tags and other metadata inside supported media files"
 msgstr "启用此选项可以在支持的音频文件内保存标签和其他元数据。"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:54
-msgid "_Update file and folder names"
-msgstr "更新文件及目录名字(_U)"
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:136
+msgid "Write _ratings and play counts to files"
+msgstr "将评级和播放计数写入到文件(_R)"
 
 #: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:55
+#, fuzzy
+#| msgid ""
+#| "Enable this option to save rating and play count metadata inside "
+#| "supported audio files whenever the rating is changed."
 msgid ""
-"Enabling this option ensures that files and folders are renamed according to "
-"the metadata."
-msgstr "启用该选项将确保文件及目录根据元数据来重命名。"
+"Enable this option to save rating and playcount metadata inside supported "
+"audio files."
+msgstr "启用此选项可以在支持的音频文件内保存评级和播放计数元数据。"
 
-#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:129
-msgid "Write _ratings and play counts to files"
-msgstr "将评级和播放计数写入到文件(_R)"
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:59
+msgid "_Update file and folder names"
+msgstr "更新文件及目录名字(_U)"
+
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:60
+#, fuzzy
+#| msgid ""
+#| "Enabling this option ensures that files and folders are renamed according "
+#| "to the metadata."
+msgid "Rename files and folders according to media metadata"
+msgstr "启用该选项将确保文件及目录根据元数据来重命名。"
 
-#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:130
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:137
 msgid ""
 "Enable this option to save rating and play count metadata inside supported "
 "audio files whenever the rating is changed."
 msgstr "启用此选项可以在支持的音频文件内保存评级和播放计数元数据。"
 
-#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:131
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:138
 msgid "Import _ratings"
 msgstr "导入评级(_R)"
 
-#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:132
+#: ../src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs:139
 msgid "Import play _counts"
 msgstr "导入播放计数(_C)"
 
@@ -1035,18 +1098,20 @@ msgid "There is no available network connection"
 msgstr "没有可用的网络连接"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:78
-msgid "Cannot connect to NetworkManager"
+#, fuzzy
+#| msgid "Cannot connect to NetworkManager"
+msgid "Cannot connect to NetworkManager or Wicd"
 msgstr "无法连接到 NetworkManager"
 
 #: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:79
 msgid "An available, working network connection will be assumed"
 msgstr "将假定有可用的网络连接"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:150
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:157
 msgid "_Disable features requiring Internet access"
 msgstr "禁用需要互联网连接的特性(_D)"
 
-#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:151
+#: ../src/Core/Banshee.Services/Banshee.Networking/Network.cs:158
 msgid ""
 "Some features require a broadband Internet connection such as Last.fm or "
 "cover art fetching"
@@ -1072,7 +1137,7 @@ msgstr "删除播放列表"
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:390
 #: ../src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:396
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:88
-#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:464
+#: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs:466
 #: ../src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs:211
 msgid "New Playlist"
 msgstr "新建播放列表"
@@ -1105,9 +1170,8 @@ msgid "General"
 msgstr "常规"
 
 #: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:50
-#, fuzzy
 msgid "Source Specific"
-msgstr "源属性"
+msgstr "特定来源"
 
 #: ../src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs:51
 msgid "Extensions"
@@ -1134,8 +1198,8 @@ msgstr "艺人"
 #. Translators: noun
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:66
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:174
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:659
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:78
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:662
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:89
 msgid "Name"
 msgstr "名称"
 
@@ -1164,6 +1228,7 @@ msgid "Least Often Played"
 msgstr "最不经常播放的"
 
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:78
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:58
 msgid "Most Recently Played"
 msgstr "最近播放最多的"
 
@@ -1203,7 +1268,7 @@ msgstr "MB"
 msgid "GB"
 msgstr "GB"
 
-#. Translators: These are unique search aliases for "artist".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:99
 msgid "artist"
 msgstr "艺人"
@@ -1216,7 +1281,7 @@ msgstr "由"
 msgid "artists"
 msgstr "艺人"
 
-#. Translators: These are unique search aliases for "album artist".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "album artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:107
 msgid "albumartist"
 msgstr "专辑艺人"
@@ -1225,7 +1290,7 @@ msgstr "专辑艺人"
 msgid "compilationartist"
 msgstr "演唱者名称"
 
-#. Translators: These are unique search aliases for "album".  Please, no spaces. Blank ok.
+#. Translators: These are unique search aliases for "album". You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:117
 msgid "album"
 msgstr "专辑"
@@ -1242,7 +1307,7 @@ msgstr "从"
 msgid "Disc"
 msgstr "光盘"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:125
 msgid "disc"
 msgstr "光盘"
@@ -1255,11 +1320,7 @@ msgstr "光盘"
 msgid "discnum"
 msgstr "光盘序号"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:131
-msgid "Disc Count"
-msgstr "光盘计数"
-
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:133
 msgid "discs"
 msgstr "光盘"
@@ -1268,7 +1329,7 @@ msgstr "光盘"
 msgid "cds"
 msgstr "光盘"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:142
 msgid "track"
 msgstr "音轨"
@@ -1281,7 +1342,7 @@ msgstr "音轨序号"
 msgid "tracknum"
 msgstr "音轨数"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:151
 msgid "tracks"
 msgstr "音轨"
@@ -1294,12 +1355,12 @@ msgstr "音轨计数"
 msgid "Beats per Minute"
 msgstr "每分钟节拍数"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:159
 msgid "bpm"
 msgstr "bpm"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:168
 msgid "bitrate"
 msgstr "比特率"
@@ -1312,7 +1373,7 @@ msgstr "kbs"
 msgid "kps"
 msgstr "kps"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:176
 msgid "title"
 msgstr "标题"
@@ -1329,7 +1390,7 @@ msgstr "名字"
 msgid "named"
 msgstr "名字"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:184
 msgid "year"
 msgstr "年代"
@@ -1342,54 +1403,40 @@ msgstr "发布"
 msgid "yr"
 msgstr "年代"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:192
 msgid "genre"
 msgstr "流派"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:197
-msgid "Composer"
-msgstr "作曲"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:199
 msgid "composer"
 msgstr "作曲"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:204
-msgid "Conductor"
-msgstr "指挥"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:206
 msgid "conductor"
 msgstr "指挥"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:211
-msgid "Grouping"
-msgstr "分组"
-
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:213
 msgid "grouping"
 msgstr "分组"
 
-#. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:219
-msgid "Comment"
-msgstr "评论"
-
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:221
 msgid "comment"
 msgstr "评论"
 
 #. Translators: noun
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:227
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:135
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:71
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:72
 msgid "License"
 msgstr "许可"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:229
 msgid "license"
 msgstr "许可"
@@ -1403,7 +1450,7 @@ msgid "under"
 msgstr "之下授权:"
 
 #. , typeof(NullQueryValue)},
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:237
 msgid "rating"
 msgstr "评级"
@@ -1416,7 +1463,7 @@ msgstr "星"
 msgid "Play Count"
 msgstr "播放计数"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:245
 msgid "plays"
 msgstr "播放"
@@ -1433,7 +1480,7 @@ msgstr "听"
 msgid "Skip Count"
 msgstr "跳过次数"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:253
 msgid "skips"
 msgstr "跳过"
@@ -1446,7 +1493,7 @@ msgstr "跳过次数"
 msgid "File Size"
 msgstr "文件大小"
 
-#. Translators: These are unique search fields (and nouns).  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:261
 msgid "size"
 msgstr "大小"
@@ -1459,10 +1506,11 @@ msgstr "文件大小"
 msgid "File Location"
 msgstr "文件位置"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "uri"
 msgstr "URI"
+
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:269
 msgid "path"
 msgstr "路径 "
@@ -1479,7 +1527,7 @@ msgstr "位置"
 msgid "Time"
 msgstr "时间"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:277
 msgid "duration"
 msgstr "时长"
@@ -1496,7 +1544,7 @@ msgstr "时间"
 msgid "Mime Type"
 msgstr "MIME 类型"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:285
 msgid "type"
 msgstr "类型"
@@ -1517,7 +1565,7 @@ msgstr "ext"
 msgid "Last Played"
 msgstr "上次播放"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:293
 msgid "lastplayed"
 msgstr "最近播放"
@@ -1534,7 +1582,7 @@ msgstr "播放于"
 msgid "Last Skipped"
 msgstr "上次跳过的"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:301
 msgid "lastskipped"
 msgstr "上次跳过的"
@@ -1551,7 +1599,7 @@ msgstr "跳过于"
 msgid "Date Added"
 msgstr "添加的日期"
 
-#. Translators: These are unique search fields.  Please, no spaces. Blank ok.
+#. Translators: These are unique search fields. You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:309
 msgid "added"
 msgstr "添加的"
@@ -1577,32 +1625,102 @@ msgstr "导入于"
 msgid "Smart Playlist"
 msgstr "智能播放列表"
 
-#. Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+#. Translators: These are unique search fields (and nouns). You can use CSV for synonyms. Please, no spaces. Blank ok.
 #: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:329
 msgid "score"
 msgstr "得分"
 
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:335
+msgid "Playback Error"
+msgstr "回放错误"
+
+#. Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:337
+msgid "playbackerror"
+msgstr ""
+
 #. Translators: noun
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:346
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:354
 msgid "BPM"
 msgstr "BPM"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:347
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:355
 msgid "Skips"
 msgstr "跳过"
 
-#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:348
+#: ../src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs:356
 msgid "Plays"
 msgstr "播放"
 
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:44
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:96
+msgid "None"
+msgstr "无"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+msgid "none"
+msgstr "无"
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:46
+msgid "no"
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:49
+msgid "Resource Not Found"
+msgstr ""
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+msgid "ResourceNotFound"
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+msgid "missing"
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:51
+msgid "notfound"
+msgstr ""
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:54
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:56
+msgid "CodecNotFound"
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:56
+#, fuzzy
+#| msgid "Encode to"
+msgid "nocodec"
+msgstr "编码为"
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:59
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:61
+msgid "Drm"
+msgstr ""
+
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:61
+msgid "drm"
+msgstr ""
+
+#. Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:64
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:66
 #: ../src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs:309
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:154
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:156
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:158
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:376
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:203
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:205
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:207
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:375
 msgid "Unknown"
 msgstr "未知"
 
+#: ../src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs:66
+msgid "unknown"
+msgstr "未知"
+
 #: ../src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs:79
 msgid "Unable to Migrate Smart Playlists"
 msgstr "无法导入智能播放列表"
@@ -1663,11 +1781,13 @@ msgid "Close Error Report"
 msgstr "关闭错误报告"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:82
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:217
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
 msgid "Error"
 msgstr "错误"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs:83
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:247
 msgid "Details"
 msgstr "详细:"
 
@@ -1677,32 +1797,32 @@ msgstr "错误"
 
 #: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:217
 msgid "Sort Playlists by"
-msgstr "排序播放列表"
+msgstr "排序播放列表通过"
 
 #. Translators: this is a noun, referring to the harddisk
 #: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:226
 msgid "Drive"
 msgstr "驱动器"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:687
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:678
 #, csharp-format
 msgid "Adding {0} of {1} to {2}"
 msgstr "正在添加 {1} 的 {0} 到 {2}"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:706
+#: ../src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs:697
 #, csharp-format
 msgid "Deleting {0} of {1} From {2}"
 msgstr "正在从 {2} 删除 {1} 的第 {0} "
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:664
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:667
 msgid "Size Ascending"
 msgstr "按大小升序排列"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:669
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:672
 msgid "Size Descending"
 msgstr "按大小降序排列"
 
-#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:758
+#: ../src/Core/Banshee.Services/Banshee.Sources/Source.cs:761
 #, csharp-format
 msgid "{0} item"
 msgid_plural "{0} items"
@@ -1741,7 +1861,7 @@ msgid "Version:"
 msgstr "版本:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs:72
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:97
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:100
 msgid "Authors:"
 msgstr "作者:"
 
@@ -1753,11 +1873,11 @@ msgstr "版权/许可:"
 msgid "Extension Dependencies:"
 msgstr "扩展程序依赖关系"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:182
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:208
 msgid "Disable"
 msgstr "禁止"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:183
+#: ../src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs:209
 msgid "Enable"
 msgstr "启用"
 
@@ -1771,6 +1891,18 @@ msgstr "启用"
 msgid "{0} of {1}"
 msgstr "{0}/{1}"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:215
+msgid "Playing"
+msgstr "正在播放"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:216
+msgid "Paused"
+msgstr "暂停"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs:218
+msgid "Protected"
+msgstr "受保护的"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:124
 msgid "Track #"
 msgstr "音轨 #"
@@ -1798,7 +1930,7 @@ msgstr ""
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:123
 msgid "Hide context pane"
-msgstr ""
+msgstr "隐藏背景窗格"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs:144
 msgid "Waiting for playback to begin..."
@@ -1882,8 +2014,7 @@ msgstr "是否将 Banshee 作为默认媒体播放器?"
 msgid ""
 "Currently another program is configured as the default media player.  Would "
 "you prefer Banshee to be the default?"
-msgstr ""
-"当前有另外的程序配置为默认的媒体播放器。您打算设置 Banshee 为默认吗?"
+msgstr "当前有另外的程序配置为默认的媒体播放器。您打算设置 Banshee 为默认吗?"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs:72
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:427
@@ -1895,6 +2026,11 @@ msgstr "不再询问"
 msgid "Make Banshee the Default"
 msgstr "使 Banshee 成为默认"
 
+#. Translators: verb
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs:52
+msgid "I_mport"
+msgstr "导入(_M)"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs:39
 msgid "Select album cover image"
 msgstr "选择专辑封面图像"
@@ -1916,7 +2052,7 @@ msgid "Browse..."
 msgstr "浏览..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs:98
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
 msgid "Open Location"
 msgstr "打开位置"
 
@@ -1989,6 +2125,7 @@ msgid "_Tools"
 msgstr "工具(_T)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:92
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:133
 msgid "_Help"
 msgstr "帮助(_H)"
 
@@ -2036,19 +2173,16 @@ msgstr "版本信息(_V)"
 msgid "View detailed version and configuration information"
 msgstr "查看详细版本和配置信息"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:163
+#. Prompt user for location of the playlist.
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:160
 msgid "Import Playlist"
 msgstr "导入播放列表"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:170
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:161
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:556
 msgid "Playlists"
 msgstr "播放列表"
 
-#. Translators: verb
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:178
-msgid "I_mport"
-msgstr "导入(_M)"
-
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:67
 msgid "Play or pause the current item"
 msgstr "播放或暂停当前项目"
@@ -2070,8 +2204,8 @@ msgid "Play the previous item"
 msgstr "播放上一首"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:78
-msgid "Seek _to..."
-msgstr "搜索到(_t)..."
+msgid "Seek _To..."
+msgstr "搜索到(_T)..."
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs:79
 msgid "Seek to a specific location in current item"
@@ -2233,7 +2367,7 @@ msgstr "源属性"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:105
 msgid "Sort Children by"
-msgstr "排序子项目"
+msgstr "排序子项目通过"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:108
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:50
@@ -2250,7 +2384,7 @@ msgstr "新建智能播放列表(_S)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs:122
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:74
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:333
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
 msgid "Refresh"
 msgstr "刷新"
 
@@ -2296,7 +2430,7 @@ msgid "Edit information on selected tracks"
 msgstr "编辑选定音轨的信息"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:79
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:188
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:247
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:108
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:150
 msgid "Properties"
@@ -2342,7 +2476,11 @@ msgstr "从硬盘中删除(_D)"
 msgid "Permanently delete selected item(s) from medium"
 msgstr "从媒介中永久删除已选定项目"
 
+#. Translators: this is a verb (command), not a noun (things)
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs:108
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:169
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs:108
+#, csharp-format
 msgid "_Search"
 msgstr "搜索(_S)"
 
@@ -2431,59 +2569,59 @@ msgstr "音轨艺人(_A):"
 msgid "Set all compilation album artists to these values"
 msgstr "将所有作曲专辑艺人设定为该值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:100
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:106
 msgid "Set all album titles to this value"
 msgstr "将所有专辑标题设定为该值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:101
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:107
 msgid "Albu_m Title:"
 msgstr "专辑标题(_M):"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:107
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:113
 msgid "Set all genres to this value"
 msgstr "将所有流派设定为该值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:108
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:114
 msgid "_Genre:"
 msgstr "流派(_G):"
 
 #. Right
 #. Translators: "of" is the word beteen a track/disc number and the total count.
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:116
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:148
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:122
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:154
 msgid "of"
 msgstr "之"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:132
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:138
 msgid "Automatically set track number and count"
 msgstr "自动设置音轨序号并计数"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:134
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:140
 msgid "Track _Number:"
 msgstr "音轨编号(_N):"
 
 #. Catalog.GetString ("Automatically set disc number and count"),
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:150
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:156
 msgid "Set all disc numbers and counts to these values"
 msgstr "将所有光盘编号和计数设置为这些值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:151
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:157
 msgid "_Disc Number:"
 msgstr "盘片编号(_D):"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:172
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:178
 msgid "Set all years to this value"
 msgstr "将所有年份设定为该值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:173
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:179
 msgid "_Year:"
 msgstr "年代(_Y):"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:180
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:186
 msgid "Set all ratings to this value"
 msgstr "将所有评级设定为该值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:181
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs:187
 msgid "_Rating:"
 msgstr "评级:"
 
@@ -2568,9 +2706,8 @@ msgid "Set all sort track titles to this value"
 msgstr "将所有音轨标题设定为该值所示类型"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:49
-#, fuzzy
 msgid "Sort Track Title:"
-msgstr "音轨标题:"
+msgstr "分类音轨标题:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:56
 #, fuzzy
@@ -2578,9 +2715,8 @@ msgid "Set all sort track artists to this value"
 msgstr "将所有音轨表演者设定为该值"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:57
-#, fuzzy
 msgid "Sort Track Artist:"
-msgstr "音轨艺人:"
+msgstr "分类音轨艺人:"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:63
 #, fuzzy
@@ -2588,9 +2724,8 @@ msgid "Set all sort album artists to this value"
 msgstr "将所有专辑标题设定为该值"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:64
-#, fuzzy
 msgid "Sort Album Artist:"
-msgstr "专辑艺人"
+msgstr "分类专辑艺人"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:70
 #, fuzzy
@@ -2598,89 +2733,88 @@ msgid "Set all sort album titles to this value"
 msgstr "将所有专辑标题设定为该值"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs:71
-#, fuzzy
 msgid "Sort Album Title:"
-msgstr "专辑标题:"
+msgstr "分类专辑标题:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:79
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:90
 msgid "Value"
 msgstr "值"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:110
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
 msgid "File Name:"
 msgstr "文件名:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:111
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
 msgid "Directory:"
 msgstr "目录:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:112
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
 msgid "Full Path:"
 msgstr "完整路径:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:118
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
 msgid "URI:"
 msgstr "URI:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:127
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:176
 msgid "Duration:"
 msgstr "时长:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:130
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:179
 msgid "Audio Bitrate:"
 msgstr "音频比特率:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:132
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:181
 msgid "Audio Sample Rate:"
 msgstr "音频样本采样率:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:134
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:183
 msgid "Audio Channels:"
 msgstr "音频声道数:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:137
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:186
 msgid "Video Dimensions:"
 msgstr "视频尺寸规格"
 
 #. Translators: {0} is the description of the codec
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:144
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:193
 #, csharp-format
 msgid "{0} Codec:"
 msgstr "{0} 编码:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:149
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:198
 msgid "Container Formats:"
-msgstr ""
+msgstr "容器格式:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:153
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:202
 msgid "Imported On:"
 msgstr "导入于:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:155
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:204
 msgid "Last Played:"
 msgstr "上次播放:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:157
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:206
 msgid "Last Skipped:"
 msgstr "上次跳过的:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:159
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:208
 msgid "Play Count:"
 msgstr "播放次数:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:160
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:209
 msgid "Skip Count:"
 msgstr "跳过次数:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:161
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:210
 msgid "Score:"
 msgstr "得分:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:167
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:216
 msgid "File Size:"
 msgstr "文件大小:"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:168
+#: ../src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs:217
 #: ../src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs:61
 msgid "bytes"
 msgstr "字节"
@@ -2757,7 +2891,7 @@ msgstr "查看图形均衡器"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:72
 msgid "_Context Pane"
-msgstr ""
+msgstr "背景窗格(_C)"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs:73
 #, fuzzy
@@ -2813,6 +2947,7 @@ msgstr "{0} - {1} {2} {0} - {1} {3}"
 #. Translators: {0} and {1} are for markup so ignore them, {2} is for Album Title;
 #. e.g. 'from Killing with a Smile'
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:503
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:511
 #, csharp-format
 msgid "{0}from{1} {2}"
 msgstr "{0} - {1} {2}"
@@ -2820,6 +2955,7 @@ msgstr "{0} - {1} {2}"
 #. Translators: {0} and {1} are for markup so ignore them, {2} is for Artist Name;
 #. e.g. 'by Parkway Drive'
 #: ../src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:507
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:515
 #, csharp-format
 msgid "{0}by{1} {2}"
 msgstr "{0} - {1} {2}"
@@ -2856,48 +2992,64 @@ msgstr "继续 {0}"
 msgid "Stopping..."
 msgstr "正在停止..."
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:46
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:45
 msgid "Import Files to Library"
 msgstr "导入文件到库中"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:52
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:48
 msgid "Media Files"
 msgstr "媒体文件"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:66
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:59
 msgid "Local Files"
 msgstr "本地文件"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:92
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:63
+msgid "C_hoose Files"
+msgstr "选择文件(_H)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:81
 msgid "_Files to import:"
 msgstr "导入文件(_F):"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:93
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:82
 msgid "Select Files"
 msgstr "选择文件"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:94
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs:83
 msgid "(none selected)"
 msgstr "未选择"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:44
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:43
 msgid "Import Folders to Library"
 msgstr "导入目录到音乐库"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:62
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:53
 msgid "Local Folders"
 msgstr "本地目录"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:80
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:57
+msgid "C_hoose Folders"
+msgstr "选择目录(_H)"
+
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:75
 msgid "_Folders to import:"
 msgstr "导入目录(_F):"
 
-#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:81
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs:76
 msgid "Select Folders"
 msgstr "选择目录"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs:90
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:82
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
+msgid "_Import"
+msgstr "导入(_I)"
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs:67
-msgid "Videos from Photos Folder"
+#, fuzzy
+#| msgid "Videos from Photos Folder"
+msgid "Videos From Photos Folder"
 msgstr "来自于照片目录的视频"
 
 #: ../src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs:86
@@ -2933,6 +3085,11 @@ msgstr "选择库位置"
 msgid "Reset"
 msgstr "重置"
 
+#: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs:121
+#, csharp-format
+msgid "Reset location to default ({0})"
+msgstr ""
+
 #: ../src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs:55
 msgid "Could not show preferences"
 msgstr "无法显示首选项"
@@ -2978,46 +3135,38 @@ msgid "<big><b>Import Media to Library</b></big>"
 msgstr "<big><b>导入媒介到库</b></big>"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:3
-msgid "Choose an import _source:"
-msgstr "选择一个导入源(_S):"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Create and save"
 msgstr "创建并保存"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:4
 msgid "Do not show this dialog again"
 msgstr "不再显示本对话框"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:6
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:5
 msgid "Enter the address of the file you would like to open:"
 msgstr "输入您想打开的文件地址:"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:8
-msgid "I_mport Media Source"
-msgstr "导入媒体源(_M)"
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:7
+msgid "Import _from:"
+msgstr "导入自(_F):"
 
 #: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:9
-msgid "Import Media to Library"
-msgstr "导入媒体到库中"
-
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Open in editor"
 msgstr "在编辑器中打开"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:10
 msgid "Playlist _Name: "
 msgstr "播放列表名称(_N):"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:11
 msgid "Predefined Smart Playlists"
 msgstr "预设的智能播放列表"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:14
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:12
 msgid "Seek to Position"
 msgstr "定位到位置"
 
-#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:15
+#: ../src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade.h:13
 msgid ""
 "Your media library is empty. You may import new music and videos into your "
 "library now, or choose to do so later."
@@ -3032,6 +3181,10 @@ msgstr ""
 "插入\n"
 "光盘"
 
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs:58
+msgid "Seek"
+msgstr "搜索"
+
 #: ../src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs:148
 msgid "Idle"
 msgstr "空闲"
@@ -3044,11 +3197,17 @@ msgstr "联系中..."
 msgid "Buffering"
 msgstr "缓冲中"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:549
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:96
+#, fuzzy
+#| msgid "Value"
+msgid "Volume"
+msgstr "值"
+
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:548
 msgid "Muted"
 msgstr "已静音"
 
-#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:551
+#: ../src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs:550
 msgid "Full Volume"
 msgstr "最大音量"
 
@@ -3084,33 +3243,33 @@ msgstr "产品"
 msgid "Vendor"
 msgstr "出版商"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:277
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:276
 #, csharp-format
 msgid "Loading {0}"
 msgstr "正在载入 {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:356
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:37
 msgid "Yes"
 msgstr "是"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:357
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:356
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellYesNo.cs:38
 msgid "No"
 msgstr "否"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:378
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:377
 #, csharp-format
 msgid ""
 "The {0} format is not supported by the device, and no converter was found to "
 "convert it"
 msgstr "设备不支持 {0} 格式,也没有发现可以使用的转换器"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:384
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:383
 msgid "File format conversion support is not available"
 msgstr "文件格式转换支持不可用"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:410
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs:409
 msgid "Error converting file"
 msgstr "转换文件出错"
 
@@ -3150,6 +3309,7 @@ msgid "Synchronize {0}"
 msgstr "同步 {0}"
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:67
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:97
 msgid "Audio"
 msgstr "音频"
 
@@ -3165,10 +3325,6 @@ msgstr "其他"
 msgid "Free Space"
 msgstr "空余空间"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs:96
-msgid "None"
-msgstr "无"
-
 #. Translators: {0} is the name assigned to a Digital Audio Player by its owner
 #: ../src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs:55
 #, csharp-format
@@ -3197,7 +3353,8 @@ msgid "Import Purchased Music"
 msgstr ""
 
 #: ../src/Dap/Banshee.Dap/Banshee.Dap/PodcastGroupSource.cs:38
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:94
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:107
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:98
 msgid "Podcasts"
 msgstr "播客"
 
@@ -3206,12 +3363,12 @@ msgstr "播客"
 msgid "Eject {0}"
 msgstr "弹出 {0}"
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:104
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:108
 #, csharp-format
 msgid "Ejecting {0}..."
 msgstr "正在弹出 {0}..."
 
-#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:111
+#: ../src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs:115
 #, csharp-format
 msgid "Could not eject {0}: {1}"
 msgstr "无法弹出 {0}: {1}"
@@ -3258,7 +3415,7 @@ msgid "Capacity"
 msgstr "容量"
 
 #: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:102
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:144
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:148
 msgid "Serial number"
 msgstr "序列号"
 
@@ -3282,27 +3439,27 @@ msgstr "支持封面图片"
 msgid "Supports photos"
 msgstr "支持照片"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Out of space on device"
 msgstr "设备无多余空间"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:632
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:621
 msgid "Please manually remove some songs"
 msgstr "请手动删除一些曲目"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:661
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:637
 msgid "Syncing iPod"
 msgstr "正在同步 iPod"
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:662
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:638
 msgid "Preparing to synchronize..."
 msgstr "正在准备同步..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:683
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:659
 msgid "Updating..."
 msgstr "正在更新..."
 
-#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:687
+#: ../src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:663
 msgid "Flushing to disk..."
 msgstr "正在冲刷到硬盘..."
 
@@ -3361,7 +3518,8 @@ msgid ""
 "\n"
 "Are you sure you want to rebuild your iPod database?"
 msgstr ""
-"重建您的 iPod 数据库可能需要些时间。同时请注意所有在您 iPod 上的播放列表都将丢失。\n"
+"重建您的 iPod 数据库可能需要些时间。同时请注意所有在您 iPod 上的播放列表都将"
+"丢失。\n"
 "\n"
 "您确认您想重建您的 iPod 数据库吗?"
 
@@ -3406,12 +3564,12 @@ msgid "Ringtones"
 msgstr "铃声"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:78
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:117
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:121
 msgid "MTP Support Ignoring Device"
 msgstr "MTP 支持忽略设备"
 
 #: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:79
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:118
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:122
 msgid ""
 "Banshee's MTP audio player support can only handle one device at a time."
 msgstr "Banshee 的 MTP 音乐播放器仅支持同时处理一个设备"
@@ -3437,19 +3595,19 @@ msgid ""
 "An MTP device was detected, but Banshee was unable to load support for it."
 msgstr "探测到一个 MTP 设备,但 Banshee 无法载入对它的支持。"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:145
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:149
 #: ../src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs:66
 msgid "Version"
 msgstr "版本"
 
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:147
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:151
 msgid "Battery level"
 msgstr "电池水平"
 
 #. user_event.Progress = (double)current / total;
 #. Translators: {0} is the name of the MTP audio device (eg Gabe's Zen Player), {1} is the
 #. track currently being loaded, and {2} is the total # of tracks that will be loaded.
-#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:163
+#: ../src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:167
 #, csharp-format
 msgid "Loading {0} - {1} of {2}"
 msgstr "正在载入 {1} 的 {0} 到 {2}"
@@ -3522,7 +3680,8 @@ msgid ""
 "Error correction tries to work around problem areas on a disc, such as "
 "surface scratches, but will slow down importing substantially."
 msgstr ""
-"纠错功能尝试临时跳过光盘商的问题区域,例如表面划伤,但是会使导入变得非常的慢。"
+"纠错功能尝试临时跳过光盘商的问题区域,例如表面划伤,但是会使导入变得非常的"
+"慢。"
 
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs:320
 #: ../src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:440
@@ -3689,7 +3848,8 @@ msgid ""
 "an intentional limitation by Apple in iTunes® 7 and we apologize for the "
 "unfortunate inconvenience."
 msgstr ""
-"iTunes® 7 引入了新的兼容性问题,目前无法与 iTunes® 7 外的其他客户端一起工作。\n"
+"iTunes® 7 引入了新的兼容性问题,目前无法与 iTunes® 7 外的其他客户端一起工"
+"作。\n"
 "\n"
 "没有任何第三方的客户端可以再连接到 iTunes® 音乐共享。这是苹果公司在 iTunes® "
 "7 中的有意限制,我们为这种不幸的不便表示歉意。"
@@ -3731,12 +3891,11 @@ msgid "Authentication Required"
 msgstr "需要授权"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:104
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:57
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:54
 msgid "Username:"
 msgstr "用户名:"
 
 #: ../src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs:112
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:64
 msgid "Password:"
 msgstr "密码:"
 
@@ -3779,7 +3938,7 @@ msgid "File System Queue"
 msgstr "文件系统队列"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:72
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:56
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:70
 msgid "Clear"
 msgstr "清空"
 
@@ -3788,7 +3947,7 @@ msgid "Remove all tracks from the file system queue"
 msgstr "从文件系统队列中删除所有音轨"
 
 #: ../src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs:79
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:77
 msgid "Clear on Quit"
 msgstr "退出时清空"
 
@@ -3796,6 +3955,579 @@ msgstr "退出时清空"
 msgid "Clear the file system queue when quitting"
 msgstr "退出时清空文件系统队列"
 
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:48
+msgid "View Item Details"
+msgstr "查看条目详情"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:57
+msgid "Open Webpage"
+msgstr "打开网页"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs:76
+msgid "Visit Archive.org"
+msgstr "访问 Archive.org"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:76
+msgid "Close Item"
+msgstr "关闭条目"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:84
+msgid "Getting item details from the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:135
+msgid "Timed out getting item details from the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:136
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:189
+msgid "Try Again"
+msgstr "重试"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs:138
+msgid "Error getting item details from the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:201
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:130
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:66
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
+msgid "Description"
+msgstr "描述"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:217
+msgid "Creator:"
+msgstr "创建者:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:218
+msgid "Venue:"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:219
+msgid "Location:"
+msgstr "位置:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:221
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:81
+msgid "Date:"
+msgstr "日期:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:223
+msgid "Year:"
+msgstr "年代:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:225
+msgid "Publisher:"
+msgstr "发布者:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:226
+msgid "Keywords:"
+msgstr "关键词:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:227
+msgid "License URL:"
+msgstr "许可证网址:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:228
+msgid "Language:"
+msgstr "语言:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:232
+#, fuzzy
+#| msgid "_Download Cover Art"
+msgid "Downloads, overall:"
+msgstr "下载封面图片(_D)"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:233
+msgid "Downloads, past month:"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:234
+#, fuzzy
+#| msgid "Download all episodes"
+msgid "Downloads, past week:"
+msgstr "下载所有节目"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:238
+msgid "Added:"
+msgstr "添加的:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:239
+msgid "Added by:"
+msgstr "添加由:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:240
+#, fuzzy
+#| msgid "Condition:"
+msgid "Collections:"
+msgstr "条件:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:241
+msgid "Source:"
+msgstr "来源:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:242
+msgid "Contributor:"
+msgstr "贡献者:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:243
+#, fuzzy
+#| msgid "Recommended"
+msgid "Recorded by:"
+msgstr "推荐"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:244
+msgid "Lineage:"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:245
+msgid "Transferred by:"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:262
+#, fuzzy
+#| msgid "Device"
+msgid "Reviews"
+msgstr "设备"
+
+#. Translators: {0} is the number of reviewers, {1} is the average rating (not really relevant if there's only 1)
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:266
+#, fuzzy, csharp-format
+#| msgid "{0} Properties"
+msgid "{0} reviewer"
+msgid_plural "{0} reviewers, avg {1}"
+msgstr[0] "{0} 属性"
+
+#. Translators: {0} is the unicode-stars-rating, {1} is the name of a person who reviewed this item, and {1} is a date/time string
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:285
+#, fuzzy, csharp-format
+#| msgid "{0}by{1} {2}"
+msgid "{0} by {1} on {2}"
+msgstr "{0} - {1} {2}"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs:315
+msgid "Write your own review"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:84
+msgid "All"
+msgstr "所有"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:109
+msgid "Collection:"
+msgstr "收集:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:118
+#, csharp-format
+msgid "Optional Query"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs:163
+msgid "Sort by:"
+msgstr "排序通过:"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:58
+msgid "Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:119
+msgid "Preferred Media Types"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:122
+msgid "_Audio"
+msgstr "音频(_A)"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:125
+msgid "_Video"
+msgstr "视频(_V)"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs:128
+msgid "_Text"
+msgstr "文本(_T)"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:100
+#, csharp-format
+msgid "Search..."
+msgstr "搜索..."
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:108
+msgid "_Go"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:116
+msgid "Staff Picks"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:117
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:580
+msgid "Creative Commons"
+msgstr "创作共享"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:118
+msgid "History"
+msgstr "历史"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:119
+msgid "Classic Cartoons"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:120
+#, fuzzy
+#| msgid "Select Files"
+msgid "Speeches"
+msgstr "选择文件"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:121
+#, fuzzy
+#| msgid "Sort Children by"
+msgid "For Children"
+msgstr "排序子项目"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:122
+msgid "Poetry"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:123
+msgid "Creator is United States"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:124
+msgid "Old Movies"
+msgstr "旧电影"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:125
+#, fuzzy
+#| msgid "Remove From Library"
+msgid "New From LibriVox"
+msgstr "从音乐库中删除"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:126
+msgid "Old Texts"
+msgstr "旧文本"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:127
+msgid "Charlie Chaplin"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:128
+msgid "NASA"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:129
+msgid "Library of Congress"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:145
+msgid ""
+"The Internet Archive, a 501(c)(3) non-profit, is building a digital library "
+"of Internet sites and other cultural artifacts in digital form. Like a paper "
+"library, we provide free access to researchers, historians, scholars, and "
+"the general public."
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:148
+msgid "Visit the Internet Archive online at archive.org"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:304
+msgid "Audiobooks"
+msgstr "有声读物"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:305
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:78
+msgid "Movies"
+msgstr "电影"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:306
+msgid "Lectures"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:307
+#, fuzzy
+#| msgid "Connect"
+msgid "Concerts"
+msgstr "连接"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs:308
+msgid "Books"
+msgstr "书"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:57
+msgid "Search Results"
+msgstr "搜索结果"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:138
+msgid "Searching the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:174
+msgid "No matches."
+msgstr "没有符合的。"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:179
+#, csharp-format
+msgid "Showing 1 match"
+msgid_plural "Showing 1 to {0:N0} of {1:N0} total matches"
+msgstr[0] ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:188
+msgid "Timed out searching the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs:193
+msgid "Error searching the Internet Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:88
+msgid "Fetch more results from the Internet Archive?"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:94
+msgid "Fetch More"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:128
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:61
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:98
+#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
+msgid "Creator"
+msgstr "创建者"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:129
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:75
+#, fuzzy
+#| msgid "Published"
+msgid "Publisher"
+msgstr "已发布的"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:133
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:67
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:91
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:46
+msgid "Downloads"
+msgstr "下载"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:134
+msgid "Formats"
+msgstr "格式"
+
+#: ../src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs:136
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:65
+msgid "Added"
+msgstr "添加的"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:62
+#, fuzzy
+#| msgid "location"
+msgid "Collection"
+msgstr "位置"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:63
+#, fuzzy
+#| msgid "Contributors"
+msgid "Contributor"
+msgstr "贡献者"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:64
+msgid "Created"
+msgstr "创建的"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:68
+msgid "Format"
+msgstr "格式"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:69
+msgid "ID"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:70
+msgid "Language"
+msgstr "语言"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:73
+#, fuzzy
+#| msgid "Mime Type"
+msgid "Media Type"
+msgstr "MIME 类型"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs:74
+#, fuzzy
+#| msgid "Disc Count"
+msgid "Review Count"
+msgstr "光盘计数"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:71
+msgid "Moving Images"
+msgstr "移动图像"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:72
+msgid "Animation & Cartoons"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:73
+msgid "Arts & Music"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:74
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:99
+msgid "Computers & Technology"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:75
+msgid "Cultural & Academic Films"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:76
+msgid "Ephemeral Films"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:77
+msgid "Home Movies"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:79
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:104
+msgid "News & Public Affairs"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:80
+#, fuzzy
+#| msgid "Source Properties"
+msgid "Open Source Movies"
+msgstr "源属性"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:81
+msgid "Prelinger Archives"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:82
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:109
+msgid "Spirituality & Religion"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:83
+#, fuzzy
+#| msgid "Supports photos"
+msgid "Sports Videos"
+msgstr "支持照片"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:84
+#, fuzzy
+#| msgid "Video Dimensions:"
+msgid "Videogame Videos"
+msgstr "视频尺寸规格"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:85
+#, fuzzy
+#| msgid "Close"
+msgid "Vlogs"
+msgstr "关闭"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:86
+#, fuzzy
+#| msgid "Importing Media"
+msgid "Youth Media"
+msgstr "正在导入媒体"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:88
+msgid "Texts"
+msgstr "文本"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:89
+msgid "American Libraries"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:90
+msgid "Canadian Libraries"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:91
+#, fuzzy
+#| msgid "Video Library"
+msgid "Universal Library"
+msgstr "视频库"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:92
+msgid "Project Gutenberg"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:93
+#, fuzzy
+#| msgid "Video Library"
+msgid "Children's Library"
+msgstr "视频库"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:94
+msgid "Biodiversity Heritage Library"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:95
+msgid "Additional Collections"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:98
+msgid "Audio Books & Poetry"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:100
+msgid "Grateful Dead"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:101
+msgid "Live Music Archive"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:102
+#, fuzzy
+#| msgid "Music Share"
+msgid "Music & Arts"
+msgstr "音乐共享"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:103
+#, fuzzy
+#| msgid "Details"
+msgid "Netlabels"
+msgstr "详细:"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:105
+msgid "Non-English Audio"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:106
+msgid "Open Source Audio"
+msgstr "开源音频"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:108
+msgid "Radio Programs"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:111
+msgid "Education"
+msgstr "教育"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:112
+msgid "Software"
+msgstr "软件"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs:113
+msgid "CLASP"
+msgstr ""
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:92
+msgid "Downloads This Week"
+msgstr "本周下载"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:93
+msgid "Newest"
+msgstr "最新"
+
+#: ../src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs:94
+msgid "Oldest"
+msgstr "最旧"
+
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs:62
 msgid "Not Set"
 msgstr "没有设置"
@@ -3821,16 +4553,6 @@ msgstr "编辑电台"
 msgid "Station"
 msgstr "电台"
 
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:136
-msgid "Creator"
-msgstr "创建者"
-
-#: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:137
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:89
-msgid "Description"
-msgstr "描述"
-
 #: ../src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs:237
 msgid "Please provide a valid station URI"
 msgstr "请提供一个有效的电台 URI 地址"
@@ -3884,35 +4606,27 @@ msgstr "描述:"
 msgid "Rating:"
 msgstr "评级:"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:126
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:124
 msgid "_Last.fm"
 msgstr "_Last.fm"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:127
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:125
 msgid "Configure the Audioscrobbler plugin"
 msgstr "配置“audioconvert”插件"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:130
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:128
 msgid "Visit _User Profile Page"
 msgstr "访问用户个人资料页面(_U)"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:131
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:129
 msgid "Visit Your Last.fm Profile Page"
 msgstr "访问您的 Last.fm 人物简介页面"
 
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:134
-msgid "_Configure..."
-msgstr "配置(_C)..."
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:135
-msgid "Configure the Last.fm Extension"
-msgstr "配置 Last.fm 扩展"
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:140
 msgid "_Enable Song Reporting"
 msgstr "启用曲目报告(_E)"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:141
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs:135
 msgid "Enable song reporting"
 msgstr "启用曲目报告"
 
@@ -4018,44 +4732,44 @@ msgstr "查看该音轨的 Last.fm 页面"
 msgid "Recommend this track to someone"
 msgstr "推荐本音轨给某人"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:241
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:239
 #, csharp-format
 msgid "http://last.fm/music/{0}"
 msgstr "http://last.fm/music/{0}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:249
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:247
 #, csharp-format
 msgid "http://last.fm/music/{0}/{1}"
 msgstr "http://last.fm/music/{0}/{1}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:257
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:255
 #, csharp-format
 msgid "http://last.fm/music/{0}/_/{1}"
 msgstr "http://last.fm/music/{0}/_/{1}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:265
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:263
 #, csharp-format
 msgid "http://www.last.fm/music/{0}/+videos"
 msgstr "http://www.last.fm/music/{0}/+videos"
 
 #. Translators: this is used for looking up artist pages on Wikipedia; change to your wikipedia language if you want
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:273
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:271
 #: ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia/WikipediaView.cs:48
 #, csharp-format
 msgid "http://en.wikipedia.org/wiki/{0}"
 msgstr "http://en.wikipedia.org/wiki/{0}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:307
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:305
 #, csharp-format
 msgid "Fans of {0}"
 msgstr "的歌迷 {0} "
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:328
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:326
 #, csharp-format
 msgid "Similar to {0}"
 msgstr "类似于 {0}"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:401
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs:399
 msgid "_Add Station"
 msgstr "添加电台(_A)"
 
@@ -4076,26 +4790,59 @@ msgstr "我最喜欢众艺人"
 msgid "{0} plays"
 msgstr "{0} 播放"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:102
-msgid "Edit Last.fm Settings"
-msgstr "编辑 Last.fm 设定"
-
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:103
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:105
 msgid "Sort Stations by"
 msgstr "排序电台根据"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:156
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:160
 msgid "Total Play Count"
 msgstr "全部播放次数"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:256
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:262
 msgid "Account Settings"
 msgstr "账户设定"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:258
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:266
 msgid "Join Last.fm"
 msgstr "加入 Last.fm"
 
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:286
+msgid "Account"
+msgstr "帐户"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:289
+msgid "_Username"
+msgstr "用户名(_U)"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:318
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:344
+#, fuzzy
+#| msgid "Author"
+msgid "Authorized!"
+msgstr "作者:"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:318
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:345
+#, fuzzy
+#| msgid "Author"
+msgid "Authorize..."
+msgstr "作者:"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:321
+msgid ""
+"Open Last.fm in a browser, giving you the option to authorize Banshee to "
+"work with your account"
+msgstr ""
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:327
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:86
+msgid "Sign up for Last.fm"
+msgstr "注册 Last.fm"
+
+#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs:333
+msgid "Check if Banshee has been authorized"
+msgstr ""
+
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs:72
 msgid "New Station"
 msgstr "新电台"
@@ -4168,10 +4915,6 @@ msgstr "Banshee 群"
 msgid "Neighbors"
 msgstr "邻居"
 
-#: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs:580
-msgid "Creative Commons"
-msgstr "创作共享"
-
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:85
 #: ../src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationType.cs:94
 msgid "For User:"
@@ -4285,37 +5028,60 @@ msgstr "当前源:"
 msgid "Full Mode"
 msgstr "完整模式"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:132
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs:62
+msgid "Music Library"
+msgstr "音乐库"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs:52
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:79
+msgid "Play Queue"
+msgstr "播放队列"
+
+#: ../src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs:46
+msgid "Media"
+msgstr "媒体"
+
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:133
 msgid "_Show Notifications"
 msgstr "显示通知(_S)"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:133
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:134
 msgid "Show notifications when item changes"
 msgstr "当项目变化时显示通知"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:334
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:335
 msgid "Still Running"
 msgstr "仍然运行中"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:335
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:336
 msgid ""
 "Banshee was closed to the notification area. Use the <i>Quit</i> option to "
 "end your session."
 msgstr "Banshee 最小化到通知区域。请使用 <i>退出</i> 选项以结束本进程。"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:457
-#: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:48
-msgid "Now Playing"
-msgstr "现在播放"
-
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:462
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:469
 msgid "Skip this item"
 msgstr "跳过此项"
 
-#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:468
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:473
 msgid "Cannot show notification"
 msgstr "无法显示通知"
 
+#. Translators: {0} and {1} are for markup so ignore them, {2} and {3}
+#. are Artist Name and Album Title, respectively;
+#. e.g. 'by Parkway Drive from Killing with a Smile'
+#: ../src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs:507
+#, fuzzy, csharp-format
+#| msgid "{0}by{1} {2} {0}from{1} {3}"
+msgid ""
+"{0}by{1} {2}\n"
+"{0}from{1} {3}"
+msgstr "{0} - {1} {2} {0} - {1} {3}"
+
+#: ../src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs:48
+msgid "Now Playing"
+msgstr "现在播放"
+
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:143
 #, csharp-format
 msgid "Unable to import track: {0}"
@@ -4329,41 +5095,44 @@ msgstr "从 Amarok 导入失败"
 msgid "Amarok"
 msgstr "Amarok"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
-msgid "Unable to import song."
-msgstr "无法导入曲目。"
-
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
-msgid "Rhythmbox Music Player"
-msgstr "Rhythmbox 音乐播放器"
-
+#. TODO add Help button and dialog/tooltip
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:68
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:384
 msgid "iTunes Importer"
 msgstr "iTunes 已导工具"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:385
-msgid "_Import"
-msgstr "导入(_I)"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:90
+#, fuzzy
+#| msgid "Import _ratings"
+msgid "Import song ratings"
+msgstr "导入评级(_R)"
 
-#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
-msgid "Import _playlists"
-msgstr "导入播放列表(_P)"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:93
+msgid "Import play statistics (playcount, etc.)"
+msgstr ""
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:96
+msgid "Import playlists"
+msgstr "导入播放列表"
+
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:120
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:387
 #, csharp-format
 msgid "Locate your \"{0}\" file..."
 msgstr "查找您的“{0}”文件..."
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:138
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:388
 #, csharp-format
 msgid "Locate \"{0}\""
 msgstr "查找“{0}”"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:167
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:389
 msgid "Locate iTunes Music Directory"
 msgstr "查找 iTunes 音乐目录"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs:196
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:391
 #, csharp-format
 msgid ""
@@ -4371,10 +5140,12 @@ msgid ""
 "not able to infer the location of this directory. Please locate it."
 msgstr ""
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:72
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:393
 msgid "iTunes Media Player"
 msgstr "iTunes 媒体播放器"
 
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:132
 #: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:395
 msgid ""
 "Banshee is not familiar with this version of the iTunes library format. "
@@ -4382,77 +5153,96 @@ msgid ""
 "attempt to import anyway?"
 msgstr ""
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:49
-msgid "Add to Play Queue"
-msgstr "添加到播放队列"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:50
-msgid "Append selected songs to the play queue"
-msgstr "添加选定的曲目到播放队列"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
-msgid "Remove all tracks from the play queue"
-msgstr "从播放队列中删除所有音轨"
-
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
-msgid "Clear the play queue when quitting"
-msgstr "退出时清空播放队列"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs:437
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:236
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:397
+msgid "Unable to import song."
+msgstr "无法导入曲目。"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:63
-msgid "Play Queue"
-msgstr "播放队列"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:370
+msgid "Rhythmbox Music Player"
+msgstr "Rhythmbox 音乐播放器"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:72
-msgid "Remove From Play Queue"
-msgstr "从播放队列中删除"
+#: ../src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs:386
+msgid "Import _playlists"
+msgstr "导入播放列表(_P)"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:325
-msgid "manual"
-msgstr "手册"
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:48
+msgid "manually"
+msgstr "手动"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:326
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:49
 msgid "by song"
 msgstr "按曲目"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:327
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:50
 msgid "by album"
 msgstr "按专辑"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:328
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:51
 msgid "by artist"
 msgstr "按艺人"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:329
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:52
 msgid "by rating"
 msgstr "按评级"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:330
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:53
 msgid "by score"
 msgstr "按得分"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:331
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:60
 msgid "_Fill"
 msgstr ""
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:332
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs:74
 msgid "f_rom"
 msgstr "从(_R)"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:334
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:49
+msgid "Add to Play Queue"
+msgstr "添加到播放队列"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:50
+msgid "Append selected songs to the play queue"
+msgstr "添加选定的曲目到播放队列"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:57
 #, fuzzy
 msgid "Refresh random tracks in the play queue"
 msgstr "从播放队列中删除所有音轨"
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:335
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:63
+msgid "Add More"
+msgstr "添加更多"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:64
+#, fuzzy
+msgid "Add more random tracks to the play queue"
+msgstr "从播放队列中删除所有音轨"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:71
+msgid "Remove all tracks from the play queue"
+msgstr "从播放队列中删除所有音轨"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs:78
+msgid "Clear the play queue when quitting"
+msgstr "退出时清空播放队列"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:88
+msgid "Remove From Play Queue"
+msgstr "从播放队列中删除"
+
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:782
 msgid "Number of _played songs to show"
 msgstr ""
 
-#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:336
+#: ../src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs:788
 msgid "Number of _upcoming songs to show"
 msgstr ""
 
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:47
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:86
 msgid "Podcast"
 msgstr "播客"
@@ -4462,16 +5252,17 @@ msgstr "播客"
 msgid "All Podcasts ({0})"
 msgstr "所有播客 ({0})"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs:88
 msgid "Published"
 msgstr "已发布的"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:157
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:162
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs:66
 msgid "New"
 msgstr "新的"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:158
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:163
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:57
 msgid "Downloaded"
 msgstr "已下载的"
@@ -4499,6 +5290,10 @@ msgstr "更新于 {0}"
 msgid "Updated {0}"
 msgstr "已更新 {0}"
 
+#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs:62
+msgid "Downloading"
+msgstr "正在下载"
+
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:57
 msgid "New Items"
 msgstr "新项目"
@@ -4507,10 +5302,6 @@ msgstr "新项目"
 msgid "Old Items"
 msgstr "旧项目"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:46
-msgid "Downloads"
-msgstr "下载"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs:50
 msgid "Downloading Podcast(s)"
 msgstr "正在下载播客"
@@ -4639,10 +5430,6 @@ msgstr "无可用描述"
 msgid "Podcast:"
 msgstr "播客:"
 
-#: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs:81
-msgid "Date:"
-msgstr "日期:"
-
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:61
 #: ../src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs:170
 msgid "Subscribe"
@@ -4697,7 +5484,19 @@ msgstr "停止 SQL 监视"
 msgid "Wikipedia"
 msgstr "维基百科"
 
-#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:551
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:36
+msgid "open context menu"
+msgstr ""
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:37
+msgid "click"
+msgstr "点击"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs:37
+msgid "menu"
+msgstr "菜单"
+
+#: ../src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:606
 #, csharp-format
 msgid "Hide <i>{0}</i>"
 msgstr "隐藏 <i>{0}</i>"
@@ -4790,11 +5589,13 @@ msgstr "之前"
 msgid "after"
 msgstr "之后"
 
+#: ../src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs:43
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:41
 #: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:45
 msgid "is"
 msgstr "是"
 
+#: ../src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs:44
 #: ../src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs:42
 #: ../src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs:46
 msgid "is not"
@@ -4858,77 +5659,107 @@ msgstr "Last.fm 账户登录"
 msgid "Please enter your Last.fm account credentials."
 msgstr "请输入您的 Last.fm 账户信息。"
 
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs:105
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs:106
 msgid "Save and Log In"
 msgstr "保存并登录"
 
-#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:113
-msgid "Sign up for Last.fm"
-msgstr "注册 Last.fm"
+#: ../src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs:98
+msgid "Authorize for Last.fm"
+msgstr "为 Last.fm 认证"
 
-#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:446
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:458
-msgid "Last.fm username or password is invalid."
-msgstr "Last.fm 用户名或密码无效"
+#: ../src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs:448
+msgid ""
+"Last.fm username is invalid or Banshee is not authorized to access you "
+"account."
+msgstr ""
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:301
-msgid "Failed to Login to Last.fm"
-msgstr "无法登录到 Last.fm"
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:271
+msgid "This service does not exist."
+msgstr "这个服务不存在。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:302
-msgid "Either your username or password is invalid."
-msgstr "您的用户名或密码无效"
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:275
+msgid "This station is only available to subscribers."
+msgstr "该电台只对订阅用户开放。"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:277
+msgid "This station is not available."
+msgstr "电台不可用。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:440
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:279
+msgid "The request is missing a required parameter."
+msgstr ""
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:281
+msgid "The specified resource is invalid."
+msgstr ""
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:283
+msgid "Server error, please try again later."
+msgstr "服务器出错,请稍后重试。"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:285
+msgid "Invalid authentication information, please re-authenticate."
+msgstr ""
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:287
+msgid "The API key used by this application is invalid."
+msgstr ""
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:289
+msgid ""
+"The streaming system is offline for maintenance, please try again later."
+msgstr "流系统下线维护,请稍候再试。"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:291
+msgid "The method signature is invalid."
+msgstr ""
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:294
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:321
+msgid "You need to allow Banshee to access your Last.fm account."
+msgstr "您需要允许 Banshee 能够访问您的 Last.fm 帐户。"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:296
 msgid "There is not enough content to play this station."
 msgstr "没有足够内容来播放该电台"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:441
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:298
 msgid "This group does not have enough members for radio."
 msgstr "该组别没有广播需要的足够成员"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:442
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:300
 msgid "This artist does not have enough fans for radio."
 msgstr "该艺人没有广播需要的足够歌迷"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:443
-msgid "This station is not available."
-msgstr "电台不可用。"
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:444
-msgid "This station is only available to subscribers."
-msgstr "该电台只对订阅用户开放。"
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:445
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:302
 msgid "There are not enough neighbours for this station."
 msgstr "该电台没有足够的邻居。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:446
-msgid ""
-"The streaming system is offline for maintenance, please try again later."
-msgstr "流系统下线维护,请稍候再试。"
-
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:447
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:304
 msgid "There was an unknown error."
 msgstr "发生未知错误。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:455
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:313
 msgid "Not connected to Last.fm."
 msgstr "没有连接到 Last.fm。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:456
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:315
 msgid "Account details are needed before you can connect to Last.fm"
 msgstr "连接到 Last.fm 前需要账户细节。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:457
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:317
 msgid "No network connection detected."
 msgstr "没有探测到网络连接。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:459
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:319
+msgid "Last.fm username is invalid."
+msgstr "Last.fm 用户名无效。"
+
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:323
 msgid "Connecting to Last.fm."
 msgstr "正在连接到 Last.fm。"
 
-#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:460
+#: ../src/Libraries/Lastfm/Lastfm/RadioConnection.cs:325
 msgid "Connected to Last.fm."
 msgstr "已连接到 Last.fm。"
 
@@ -4936,6 +5767,33 @@ msgstr "已连接到 Last.fm。"
 msgid "Unknown Podcast"
 msgstr "未知播客"
 
+#~ msgid "Home Directory"
+#~ msgstr "主目录"
+
+#~ msgid "Choose an import _source:"
+#~ msgstr "选择一个导入源(_S):"
+
+#~ msgid "I_mport Media Source"
+#~ msgstr "导入媒体源(_M)"
+
+#~ msgid "Import Media to Library"
+#~ msgstr "导入媒体到库中"
+
+#~ msgid "_Configure..."
+#~ msgstr "配置(_C)..."
+
+#~ msgid "Configure the Last.fm Extension"
+#~ msgstr "配置 Last.fm 扩展"
+
+#~ msgid "Edit Last.fm Settings"
+#~ msgstr "编辑 Last.fm 设定"
+
+#~ msgid "Failed to Login to Last.fm"
+#~ msgstr "无法登录到 Last.fm"
+
+#~ msgid "Either your username or password is invalid."
+#~ msgstr "您的用户名或密码无效"
+
 #~ msgid "Play and organize your media collection"
 #~ msgstr "播放及管理您的媒体收藏"
 
@@ -4957,12 +5815,6 @@ msgstr "未知播客"
 #~ msgid "Renaming {0}"
 #~ msgstr "正在重命名 {0}"
 
-#~ msgid "Music Library"
-#~ msgstr "音乐库"
-
-#~ msgid "Video Library"
-#~ msgstr "视频库"
-
 #~ msgid "Name Ascending"
 #~ msgstr "按名字升序排列"
 
diff --git a/src/AssemblyInfo.cs b/src/AssemblyInfo.cs
index 984a984..171140d 100644
--- a/src/AssemblyInfo.cs
+++ b/src/AssemblyInfo.cs
@@ -2,8 +2,8 @@ using System;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 
-[assembly: ApplicationVersion ("1.5.1", "1.6 Beta 2")]
-[assembly: ApplicationBuildInformation ("git-checkout", "linux-gnu", "x86_64", "2009-10-12 14:02:32 EDT")]
+[assembly: ApplicationVersion ("1.5.2", "1.6 Beta 3")]
+[assembly: ApplicationBuildInformation ("git-checkout", "linux-gnu", "i686", "2009-11-20 19:17:59 EST")]
 
 [assembly: AssemblyVersion ("1.5.0.0")]
 [assembly: AssemblyTitle ("Banshee")]
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs
index fe466fd..a9fd24a 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs
@@ -48,106 +48,106 @@ namespace Banshee.GStreamer
         private string output_extension;
         private string output_path;
         private TrackInfo current_track;
-        
+
         private RipperProgressHandler progress_handler;
         private RipperMimeTypeHandler mimetype_handler;
         private RipperFinishedHandler finished_handler;
         private RipperErrorHandler error_handler;
-    
+
         public event AudioCdRipperProgressHandler Progress;
         public event AudioCdRipperTrackFinishedHandler TrackFinished;
         public event AudioCdRipperErrorHandler Error;
-        
+
         public void Begin (string device, bool enableErrorCorrection)
         {
             try {
                 Profile profile = null;
                 ProfileConfiguration config = ServiceManager.MediaProfileManager.GetActiveProfileConfiguration ("cd-importing");
-                
+
                 if (config != null) {
                     profile = config.Profile;
                 } else {
-                    profile = ServiceManager.MediaProfileManager.GetProfileForMimeType ("audio/vorbis") 
+                    profile = ServiceManager.MediaProfileManager.GetProfileForMimeType ("audio/vorbis")
                         ?? ServiceManager.MediaProfileManager.GetProfileForMimeType ("audio/flac");
                     if (profile != null) {
                         Log.InformationFormat ("Using default/fallback encoding profile: {0}", profile.Name);
                         ProfileConfiguration.SaveActiveProfile (profile, "cd-importing");
                     }
                 }
-                
+
                 if (profile != null) {
                     encoder_pipeline = profile.Pipeline.GetProcessById ("gstreamer");
                     output_extension = profile.OutputFileExtension;
                 }
-                
+
                 if (String.IsNullOrEmpty (encoder_pipeline)) {
                     throw new ApplicationException ();
                 }
-                
+
                 Hyena.Log.InformationFormat ("Ripping using encoder profile `{0}' with pipeline: {1}", profile.Name, encoder_pipeline);
             } catch (Exception e) {
                 throw new ApplicationException (Catalog.GetString ("Could not find an encoder for ripping."), e);
             }
-            
-            try {   
+
+            try {
                 int paranoia_mode = enableErrorCorrection ? 255 : 0;
                 handle = new HandleRef (this, br_new (device, paranoia_mode, encoder_pipeline));
-                
+
                 progress_handler = new RipperProgressHandler (OnNativeProgress);
                 br_set_progress_callback (handle, progress_handler);
-                
+
                 mimetype_handler = new RipperMimeTypeHandler (OnNativeMimeType);
                 br_set_mimetype_callback (handle, mimetype_handler);
-                
+
                 finished_handler = new RipperFinishedHandler (OnNativeFinished);
                 br_set_finished_callback (handle, finished_handler);
-                
+
                 error_handler = new RipperErrorHandler (OnNativeError);
                 br_set_error_callback (handle, error_handler);
             } catch (Exception e) {
                 throw new ApplicationException (Catalog.GetString ("Could not create CD ripping driver."), e);
             }
         }
-        
+
         public void Finish ()
         {
             if (output_path != null) {
                 System.IO.File.Delete (output_path);
             }
-        
+
             TrackReset ();
-            
+
             encoder_pipeline = null;
             output_extension = null;
-            
+
             br_destroy (handle);
             handle = new HandleRef (this, IntPtr.Zero);
         }
-        
+
         public void Cancel ()
         {
             Finish ();
         }
-        
+
         private void TrackReset ()
         {
             current_track = null;
             output_path = null;
         }
-        
+
         public void RipTrack (int trackIndex, TrackInfo track, SafeUri outputUri, out bool taggingSupported)
         {
             TrackReset ();
             current_track = track;
-            
+
             using (TagList tags = new TagList (track)) {
                 output_path = String.Format ("{0}.{1}", outputUri.LocalPath, output_extension);
                 Log.DebugFormat ("GStreamer ripping track {0} to {1}", trackIndex, output_path);
-                
+
                 br_rip_track (handle, trackIndex + 1, output_path, tags.Handle, out taggingSupported);
             }
         }
-        
+
         protected virtual void OnProgress (TrackInfo track, TimeSpan ellapsedTime)
         {
             AudioCdRipperProgressHandler handler = Progress;
@@ -155,7 +155,7 @@ namespace Banshee.GStreamer
                 handler (this, new AudioCdRipperProgressArgs (track, ellapsedTime, track.Duration));
             }
         }
-        
+
         protected virtual void OnTrackFinished (TrackInfo track, SafeUri outputUri)
         {
             AudioCdRipperTrackFinishedHandler handler = TrackFinished;
@@ -163,7 +163,7 @@ namespace Banshee.GStreamer
                 handler (this, new AudioCdRipperTrackFinishedArgs (track, outputUri));
             }
         }
-        
+
         protected virtual void OnError (TrackInfo track, string message)
         {
             AudioCdRipperErrorHandler handler = Error;
@@ -171,12 +171,12 @@ namespace Banshee.GStreamer
                 handler (this, new AudioCdRipperErrorArgs (track, message));
             }
         }
-        
+
         private void OnNativeProgress (IntPtr ripper, int mseconds)
         {
             OnProgress (current_track, TimeSpan.FromMilliseconds (mseconds));
         }
-        
+
         private void OnNativeMimeType (IntPtr ripper, IntPtr mimetype)
         {
             if (mimetype != IntPtr.Zero && current_track != null) {
@@ -191,55 +191,55 @@ namespace Banshee.GStreamer
                 }
             }
         }
-        
+
         private void OnNativeFinished (IntPtr ripper)
         {
             SafeUri uri = new SafeUri (output_path);
             TrackInfo track = current_track;
-            
+
             TrackReset ();
-            
+
             OnTrackFinished (track, uri);
         }
-        
+
         private void OnNativeError (IntPtr ripper, IntPtr error, IntPtr debug)
         {
             string error_message = GLib.Marshaller.Utf8PtrToString (error);
-            
+
             if (debug != IntPtr.Zero) {
                 string debug_string = GLib.Marshaller.Utf8PtrToString (debug);
                 if (!String.IsNullOrEmpty (debug_string)) {
                     error_message = String.Format ("{0}: {1}", error_message, debug_string);
                 }
             }
-            
+
             OnError (current_track, error_message);
         }
-        
+
         private delegate void RipperProgressHandler (IntPtr ripper, int mseconds);
         private delegate void RipperMimeTypeHandler (IntPtr ripper, IntPtr mimetype);
         private delegate void RipperFinishedHandler (IntPtr ripper);
         private delegate void RipperErrorHandler (IntPtr ripper, IntPtr error, IntPtr debug);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr br_new (string device, int paranoia_mode, string encoder_pipeline);
 
         [DllImport ("libbanshee.dll")]
         private static extern void br_destroy (HandleRef handle);
-        
+
         [DllImport ("libbanshee.dll")]
-        private static extern void br_rip_track (HandleRef handle, int track_number, string output_path, 
+        private static extern void br_rip_track (HandleRef handle, int track_number, string output_path,
             HandleRef tag_list, out bool tagging_supported);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void br_set_progress_callback (HandleRef handle, RipperProgressHandler callback);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void br_set_mimetype_callback (HandleRef handle, RipperMimeTypeHandler callback);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void br_set_finished_callback (HandleRef handle, RipperFinishedHandler callback);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void br_set_error_callback (HandleRef handle, RipperErrorHandler callback);
     }
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs
index 48b2e73..652ce84 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/BpmDetector.cs
@@ -1,4 +1,4 @@
-// 
+//
 // BpmDetector.cs
 //
 // Author:
@@ -54,14 +54,14 @@ namespace Banshee.GStreamer
         private BpmDetectorProgressHandler progress_cb;
         private BpmDetectorFinishedHandler finished_cb;
         //private BpmDetectorErrorHandler error_cb;
-        
+
         public event BpmEventHandler FileFinished;
-        
+
         public BpmDetector ()
         {
-            try {   
+            try {
                 handle = new HandleRef (this, bbd_new ());
-                
+
                 progress_cb = new BpmDetectorProgressHandler (OnNativeProgress);
                 bbd_set_progress_callback (handle, progress_cb);
 
@@ -71,15 +71,15 @@ namespace Banshee.GStreamer
                 throw new ApplicationException (Catalog.GetString ("Could not create BPM detection driver."), e);
             }
         }
-        
+
         public void Dispose ()
         {
             Reset ();
-            
+
             bbd_destroy (handle);
             handle = new HandleRef (this, IntPtr.Zero);
         }
-        
+
         public void Cancel ()
         {
             Dispose ();
@@ -88,18 +88,18 @@ namespace Banshee.GStreamer
         public bool IsDetecting {
             get { return bbd_get_is_detecting (handle); }
         }
-        
+
         private void Reset ()
         {
             current_uri = null;
             bpm_histogram.Clear ();
         }
-        
+
         public void ProcessFile (SafeUri uri)
         {
             Reset ();
             current_uri = uri;
-            
+
             string path = uri.LocalPath;
             IntPtr path_ptr = GLib.Marshaller.StringToPtrGStrdup (path);
             try {
@@ -111,7 +111,7 @@ namespace Banshee.GStreamer
                 GLib.Marshaller.Free (path_ptr);
             }
         }
-        
+
         private void OnFileFinished (SafeUri uri, int bpm)
         {
             BpmEventHandler handler = FileFinished;
@@ -119,7 +119,7 @@ namespace Banshee.GStreamer
                 handler (this, new BpmEventArgs (uri, bpm));
             }
         }
-        
+
         private void OnNativeProgress (double bpm)
         {
             int rounded = (int) Math.Round (bpm);
@@ -129,7 +129,7 @@ namespace Banshee.GStreamer
                 bpm_histogram[rounded]++;
             }
         }
-        
+
         private void OnNativeFinished ()
         {
             SafeUri uri = current_uri;
@@ -146,28 +146,28 @@ namespace Banshee.GStreamer
             Reset ();
             OnFileFinished (uri, best_bpm);
         }
-        
+
         /*private void OnNativeError (IntPtr error, IntPtr debug)
         {
             string error_message = GLib.Marshaller.Utf8PtrToString (error);
-            
+
             if (debug != IntPtr.Zero) {
                 string debug_string = GLib.Marshaller.Utf8PtrToString (debug);
                 if (!String.IsNullOrEmpty (debug_string)) {
                     error_message = String.Format ("{0}: {1}", error_message, debug_string);
                 }
             }
-            
+
             Log.Debug (error_message);
             SafeUri uri = current_uri;
             Reset ();
             OnFileFinished (uri, 0);
         }*/
-        
+
         private delegate void BpmDetectorProgressHandler (double bpm);
         private delegate void BpmDetectorFinishedHandler ();
         //private delegate void BpmDetectorErrorHandler (IntPtr error, IntPtr debug);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr bbd_new ();
 
@@ -176,16 +176,16 @@ namespace Banshee.GStreamer
 
         [DllImport ("libbanshee.dll")]
         private static extern bool bbd_get_is_detecting (HandleRef handle);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bbd_process_file (HandleRef handle, IntPtr path);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bbd_set_progress_callback (HandleRef handle, BpmDetectorProgressHandler callback);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bbd_set_finished_callback (HandleRef handle, BpmDetectorFinishedHandler callback);
-        
+
         //[DllImport ("libbanshee.dll")]
         //private static extern void bbd_set_error_callback (HandleRef handle, BpmDetectorErrorHandler callback);
     }
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/GstErrors.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/GstErrors.cs
index cd02884..d2cd1f0 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/GstErrors.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/GstErrors.cs
@@ -1,4 +1,4 @@
-// 
+//
 // GstErrors.cs
 //
 // Author:
@@ -30,7 +30,7 @@ using System;
 
 namespace Banshee.GStreamer
 {
-    internal enum GstCoreError 
+    internal enum GstCoreError
     {
         Failed = 1,
         TooLazy,
@@ -47,8 +47,8 @@ namespace Banshee.GStreamer
         Clock,
         NumErrors
     }
-    
-    internal enum GstLibraryError 
+
+    internal enum GstLibraryError
     {
         Failed = 1,
         Init,
@@ -57,8 +57,8 @@ namespace Banshee.GStreamer
         Encode,
         NumErrors
     }
-    
-    internal enum GstResourceError 
+
+    internal enum GstResourceError
     {
         Failed = 1,
         TooLazy,
@@ -76,8 +76,8 @@ namespace Banshee.GStreamer
         NoSpaceLeft,
         NumErrors
     }
-    
-    internal enum GstStreamError 
+
+    internal enum GstStreamError
     {
         Failed = 1,
         TooLazy,
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
index 098e842..4ddcdb1 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlayerEngine.cs
 //
 // Author:
@@ -60,17 +60,20 @@ namespace Banshee.GStreamer
     internal delegate IntPtr VideoPipelineSetupHandler (IntPtr player, IntPtr bus);
 
     internal delegate void GstTaggerTagFoundCallback (IntPtr player, string tagName, ref GLib.Value value);
-    
-    public class PlayerEngine : Banshee.MediaEngine.PlayerEngine, 
+
+    public class PlayerEngine : Banshee.MediaEngine.PlayerEngine,
         IEqualizer, IVisualizationDataSource, ISupportClutter
     {
+        internal static string reserved1 = Catalog.GetString ("Enable _gapless playback");
+        internal static string reserved2 = Catalog.GetString ("Eliminate the small playback gap on track change.  Useful for concept albums and classical music");
+
         private uint GST_CORE_ERROR = 0;
         private uint GST_LIBRARY_ERROR = 0;
         private uint GST_RESOURCE_ERROR = 0;
-        private uint GST_STREAM_ERROR = 0; 
-    
+        private uint GST_STREAM_ERROR = 0;
+
         private HandleRef handle;
-        
+
         private BansheePlayerEosCallback eos_callback;
         private BansheePlayerErrorCallback error_callback;
         private BansheePlayerStateChangedCallback state_changed_callback;
@@ -79,11 +82,11 @@ namespace Banshee.GStreamer
         private BansheePlayerVisDataCallback vis_data_callback;
         private VideoPipelineSetupHandler video_pipeline_setup_callback;
         private GstTaggerTagFoundCallback tag_found_callback;
-        
+
         private bool buffering_finished;
         private int pending_volume = -1;
         private bool xid_is_set = false;
-        
+
         private event VisualizationDataHandler data_available = null;
         public event VisualizationDataHandler DataAvailable {
             add {
@@ -95,7 +98,7 @@ namespace Banshee.GStreamer
 
                 data_available += value;
             }
-            
+
             remove {
                 if (value == null) {
                     return;
@@ -117,16 +120,16 @@ namespace Banshee.GStreamer
         public PlayerEngine ()
         {
             IntPtr ptr = bp_new ();
-            
+
             if (ptr == IntPtr.Zero) {
                 throw new ApplicationException (Catalog.GetString ("Could not initialize GStreamer library"));
             }
-            
+
             handle = new HandleRef (this, ptr);
-            
-            bp_get_error_quarks (out GST_CORE_ERROR, out GST_LIBRARY_ERROR, 
+
+            bp_get_error_quarks (out GST_CORE_ERROR, out GST_LIBRARY_ERROR,
                 out GST_RESOURCE_ERROR, out GST_STREAM_ERROR);
-            
+
             eos_callback = new BansheePlayerEosCallback (OnEos);
             error_callback = new BansheePlayerErrorCallback (OnError);
             state_changed_callback = new BansheePlayerStateChangedCallback (OnStateChange);
@@ -135,7 +138,7 @@ namespace Banshee.GStreamer
             vis_data_callback = new BansheePlayerVisDataCallback (OnVisualizationData);
             video_pipeline_setup_callback = new VideoPipelineSetupHandler (OnVideoPipelineSetup);
             tag_found_callback = new GstTaggerTagFoundCallback (OnTagFound);
-            
+
             bp_set_eos_callback (handle, eos_callback);
             bp_set_iterate_callback (handle, iterate_callback);
             bp_set_error_callback (handle, error_callback);
@@ -144,7 +147,7 @@ namespace Banshee.GStreamer
             bp_set_tag_found_callback (handle, tag_found_callback);
             bp_set_video_pipeline_setup_callback (handle, video_pipeline_setup_callback);
         }
-        
+
         protected override void Initialize ()
         {
             if (!bp_initialize_pipeline (handle)) {
@@ -154,15 +157,15 @@ namespace Banshee.GStreamer
             }
 
             OnStateChanged (PlayerState.Ready);
-            
+
             if (pending_volume >= 0) {
                 Volume = (ushort)pending_volume;
             }
-            
+
             InstallPreferences ();
             ReplayGainEnabled = ReplayGainEnabledSchema.Get ();
         }
-        
+
         public override void Dispose ()
         {
             UninstallPreferences ();
@@ -170,13 +173,13 @@ namespace Banshee.GStreamer
             bp_destroy (handle);
             handle = new HandleRef (this, IntPtr.Zero);
         }
-        
+
         public override void Close (bool fullShutdown)
         {
             bp_stop (handle, fullShutdown);
             base.Close (fullShutdown);
         }
-        
+
         protected override void OpenUri (SafeUri uri)
         {
             // The GStreamer engine can use the XID of the main window if it ever
@@ -189,7 +192,7 @@ namespace Banshee.GStreamer
                 }
                 xid_is_set = true;
             }
-                
+
             IntPtr uri_ptr = GLib.Marshaller.StringToPtrGStrdup (uri.AbsoluteUri);
             try {
                 if (!bp_open (handle, uri_ptr)) {
@@ -199,17 +202,17 @@ namespace Banshee.GStreamer
                 GLib.Marshaller.Free (uri_ptr);
             }
         }
-        
+
         public override void Play ()
         {
             bp_play (handle);
         }
-        
+
         public override void Pause ()
         {
             bp_pause (handle);
         }
-        
+
         public override void VideoExpose (IntPtr window, bool direct)
         {
             bp_video_window_expose (handle, window, direct);
@@ -218,11 +221,11 @@ namespace Banshee.GStreamer
         public override IntPtr [] GetBaseElements ()
         {
             IntPtr [] elements = new IntPtr[3];
-            
+
             if (bp_get_pipeline_elements (handle, out elements[0], out elements[1], out elements[2])) {
                 return elements;
             }
-            
+
             return null;
         }
 
@@ -231,12 +234,12 @@ namespace Banshee.GStreamer
             Close (false);
             OnEventChanged (PlayerEvent.EndOfStream);
         }
-        
+
         private void OnIterate (IntPtr player)
         {
             OnEventChanged (PlayerEvent.Iterate);
         }
-        
+
         private void OnStateChange (IntPtr player, GstState old_state, GstState new_state, GstState pending_state)
         {
             if (old_state == GstState.Ready && new_state == GstState.Paused && pending_state == GstState.Playing) {
@@ -253,11 +256,11 @@ namespace Banshee.GStreamer
                 return;
             }
         }
-        
+
         private void OnError (IntPtr player, uint domain, int code, IntPtr error, IntPtr debug)
         {
             Close (true);
-            
+
             string error_message = error == IntPtr.Zero
                 ? Catalog.GetString ("Unknown Error")
                 : GLib.Marshaller.Utf8PtrToString (error);
@@ -271,9 +274,9 @@ namespace Banshee.GStreamer
                             break;
                         default:
                             break;
-                    }        
+                    }
                 }
-                
+
                 Log.Error (String.Format ("GStreamer resource error: {0}", domain_code), false);
             } else if (domain == GST_STREAM_ERROR) {
                 GstStreamError domain_code = (GstStreamError) code;
@@ -286,7 +289,7 @@ namespace Banshee.GStreamer
                             break;
                     }
                 }
-                
+
                 Log.Error (String.Format("GStreamer stream error: {0}", domain_code), false);
             } else if (domain == GST_CORE_ERROR) {
                 GstCoreError domain_code = (GstCoreError) code;
@@ -299,191 +302,191 @@ namespace Banshee.GStreamer
                             break;
                     }
                 }
-                
+
                 if (domain_code != GstCoreError.MissingPlugin) {
                     Log.Error (String.Format("GStreamer core error: {0}", (GstCoreError) code), false);
                 }
             } else if (domain == GST_LIBRARY_ERROR) {
                 Log.Error (String.Format("GStreamer library error: {0}", (GstLibraryError) code), false);
             }
-            
+
             OnEventChanged (new PlayerEventErrorArgs (error_message));
         }
-        
+
         private void OnBuffering (IntPtr player, int progress)
         {
             if (buffering_finished && progress >= 100) {
                 return;
             }
-            
+
             buffering_finished = progress >= 100;
             OnEventChanged (new PlayerEventBufferingArgs ((double) progress / 100.0));
         }
-        
+
         private void OnTagFound (IntPtr player, string tagName, ref GLib.Value value)
         {
             OnTagFound (ProcessNativeTagResult (tagName, ref value));
         }
-        
+
         private void OnVisualizationData (IntPtr player, int channels, int samples, IntPtr data, int bands, IntPtr spectrum)
         {
             VisualizationDataHandler handler = data_available;
-            
+
             if (handler == null) {
                 return;
             }
-            
+
             float [] flat = new float[channels * samples];
             Marshal.Copy (data, flat, 0, flat.Length);
-            
+
             float [][] cbd = new float[channels][];
             for (int i = 0; i < channels; i++) {
                 float [] channel = new float[samples];
                 Array.Copy (flat, i * samples, channel, 0, samples);
                 cbd[i] = channel;
             }
-            
+
             float [] spec = new float[bands];
             Marshal.Copy (spectrum, spec, 0, bands);
-            
+
             try {
                 handler (cbd, new float[][] { spec });
             } catch (Exception e) {
                 Log.Exception ("Uncaught exception during visualization data post.", e);
             }
         }
-        
+
         private static StreamTag ProcessNativeTagResult (string tagName, ref GLib.Value valueRaw)
         {
             if (tagName == String.Empty || tagName == null) {
                 return StreamTag.Zero;
             }
-        
+
             object value = null;
-            
+
             try {
                 value = valueRaw.Val;
             } catch {
                 return StreamTag.Zero;
             }
-            
+
             if (value == null) {
                 return StreamTag.Zero;
             }
-            
+
             StreamTag item;
             item.Name = tagName;
             item.Value = value;
-            
+
             return item;
         }
-        
+
         public override ushort Volume {
             get { return (ushort)Math.Round (bp_get_volume (handle) * 100.0); }
-            set { 
+            set {
                 if ((IntPtr)handle == IntPtr.Zero) {
                     pending_volume = value;
                     return;
                 }
-                
+
                 bp_set_volume (handle, value / 100.0);
                 OnEventChanged (PlayerEvent.Volume);
             }
         }
-        
+
         public override uint Position {
             get { return (uint)bp_get_position(handle); }
-            set { 
+            set {
                 bp_set_position (handle, (ulong)value);
                 OnEventChanged (PlayerEvent.Seek);
             }
         }
-        
+
         public override bool CanSeek {
             get { return bp_can_seek (handle); }
         }
-        
+
         public override uint Length {
             get { return (uint)bp_get_duration (handle); }
         }
-        
+
         public override string Id {
             get { return "gstreamer"; }
         }
-        
+
         public override string Name {
             get { return "GStreamer 0.10"; }
         }
-        
+
         private bool? supports_equalizer = null;
         public override bool SupportsEqualizer {
-            get { 
+            get {
                 if (supports_equalizer == null) {
-                    supports_equalizer = bp_equalizer_is_supported (handle); 
+                    supports_equalizer = bp_equalizer_is_supported (handle);
                 }
-                
+
                 return supports_equalizer.Value;
             }
         }
-        
+
         public override VideoDisplayContextType VideoDisplayContextType {
             get { return bp_video_get_display_context_type (handle); }
         }
-        
+
         public override IntPtr VideoDisplayContext {
             set { bp_video_set_display_context (handle, value); }
             get { return bp_video_get_display_context (handle); }
         }
-        
+
         public double AmplifierLevel {
             set {
                 double scale = Math.Pow (10.0, value / 20.0);
                 bp_equalizer_set_preamp_level (handle, scale);
             }
         }
-        
+
         public int [] BandRange {
             get {
                 int min = -1;
                 int max = -1;
-                
+
                 bp_equalizer_get_bandrange (handle, out min, out max);
-                
+
                 return new int [] { min, max };
             }
         }
-        
+
         public uint [] EqualizerFrequencies {
             get {
                 uint count = bp_equalizer_get_nbands (handle);
                 double [] freq = new double[count];
 
                 bp_equalizer_get_frequencies (handle, out freq);
-                
+
                 uint [] ret = new uint[count];
                 for (int i = 0; i < count; i++) {
                     ret[i] = (uint)freq[i];
                 }
-                
+
                 return ret;
             }
         }
-        
+
         public void SetEqualizerGain (uint band, double gain)
         {
             bp_equalizer_set_gain (handle, band, gain);
         }
-        
+
         private static string [] source_capabilities = { "file", "http", "cdda" };
         public override IEnumerable SourceCapabilities {
             get { return source_capabilities; }
         }
-                
+
         private static string [] decoder_capabilities = { "ogg", "wma", "asf", "flac" };
         public override IEnumerable ExplicitDecoderCapabilities {
             get { return decoder_capabilities; }
         }
-        
+
         private bool ReplayGainEnabled {
             get { return bp_replaygain_get_enabled (handle); }
             set { bp_replaygain_set_enabled (handle, value); }
@@ -508,7 +511,7 @@ namespace Banshee.GStreamer
         }
 
         public bool IsClutterVideoSinkInitialized {
-            get { return 
+            get { return
                 clutter_video_sink_enabled &&
                 clutter_video_texture != IntPtr.Zero &&
                 clutter_video_sink != IntPtr.Zero;
@@ -522,7 +525,7 @@ namespace Banshee.GStreamer
                     if (clutter_video_sink != IntPtr.Zero) {
                         // FIXME: does this get unreffed by the pipeline?
                     }
-                    
+
                     clutter_video_sink = clutter_gst_video_sink_new (clutter_video_texture);
                 } else if (!clutter_video_sink_enabled && clutter_video_sink != IntPtr.Zero) {
                     clutter_video_sink = IntPtr.Zero;
@@ -539,7 +542,7 @@ namespace Banshee.GStreamer
         }
 
 #endregion
-        
+
 #region Preferences
 
         private PreferenceBase replaygain_preference;
@@ -550,60 +553,60 @@ namespace Banshee.GStreamer
             if (service == null) {
                 return;
             }
-            
-            replaygain_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (ReplayGainEnabledSchema, 
+
+            replaygain_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (ReplayGainEnabledSchema,
                 Catalog.GetString ("_Enable ReplayGain correction"),
-                Catalog.GetString ("For tracks that have ReplayGain data, automatically scale (normalize) playback volume."),
+                Catalog.GetString ("For tracks that have ReplayGain data, automatically scale (normalize) playback volume"),
                 delegate { ReplayGainEnabled = ReplayGainEnabledSchema.Get (); }
             ));
         }
-        
+
         private void UninstallPreferences ()
         {
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null) {
                 return;
             }
-            
+
             service["general"]["misc"].Remove (replaygain_preference);
             replaygain_preference = null;
         }
-        
+
         public static readonly SchemaEntry<bool> ReplayGainEnabledSchema = new SchemaEntry<bool> (
-            "player_engine", "replay_gain_enabled", 
+            "player_engine", "replay_gain_enabled",
             false,
             "Enable ReplayGain",
             "If ReplayGain data is present on tracks when playing, allow volume scaling"
         );
 
 #endregion
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr bp_new ();
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_initialize_pipeline (HandleRef player);
 
         [DllImport ("libbanshee.dll")]
         private static extern void bp_destroy (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_eos_callback (HandleRef player, BansheePlayerEosCallback cb);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_error_callback (HandleRef player, BansheePlayerErrorCallback cb);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_vis_data_callback (HandleRef player, BansheePlayerVisDataCallback cb);
-        
+
         [DllImport ("libbanshee.dll")]
-        private static extern void bp_set_state_changed_callback (HandleRef player, 
+        private static extern void bp_set_state_changed_callback (HandleRef player,
             BansheePlayerStateChangedCallback cb);
-            
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_iterate_callback (HandleRef player,
             BansheePlayerIterateCallback cb);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_buffering_callback (HandleRef player,
             BansheePlayerBufferingCallback cb);
@@ -611,86 +614,86 @@ namespace Banshee.GStreamer
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_video_pipeline_setup_callback (HandleRef player,
             VideoPipelineSetupHandler cb);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_tag_found_callback (HandleRef player,
             GstTaggerTagFoundCallback cb);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_open (HandleRef player, IntPtr uri);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_stop (HandleRef player, bool nullstate);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_pause (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_play (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_volume (HandleRef player, double volume);
-        
+
         [DllImport("libbanshee.dll")]
         private static extern double bp_get_volume (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_can_seek (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_set_position (HandleRef player, ulong time_ms);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern ulong bp_get_position (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern ulong bp_get_duration (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_get_pipeline_elements (HandleRef player, out IntPtr playbin,
             out IntPtr audiobin, out IntPtr audiotee);
-            
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_set_application_gdk_window (HandleRef player, IntPtr window);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern VideoDisplayContextType bp_video_get_display_context_type (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_video_set_display_context (HandleRef player, IntPtr displayContext);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr bp_video_get_display_context (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_video_window_expose (HandleRef player, IntPtr displayContext, bool direct);
-                                                                   
+
         [DllImport ("libbanshee.dll")]
-        private static extern void bp_get_error_quarks (out uint core, out uint library, 
+        private static extern void bp_get_error_quarks (out uint core, out uint library,
             out uint resource, out uint stream);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_equalizer_is_supported (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_equalizer_set_preamp_level (HandleRef player, double level);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_equalizer_set_gain (HandleRef player, uint bandnum, double gain);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_equalizer_get_bandrange (HandleRef player, out int min, out int max);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern uint bp_equalizer_get_nbands (HandleRef player);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_equalizer_get_frequencies (HandleRef player,
             [MarshalAs (UnmanagedType.LPArray)] out double [] freq);
-            
+
         [DllImport ("libbanshee.dll")]
         private static extern void bp_replaygain_set_enabled (HandleRef player, bool enabled);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool bp_replaygain_get_enabled (HandleRef player);
 
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Service.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Service.cs
index 1ba8b43..cd8d11e 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Service.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Service.cs
@@ -1,4 +1,4 @@
-// 
+//
 // Service.cs
 //
 // Author:
@@ -41,29 +41,29 @@ namespace Banshee.GStreamer
     public class Service : IExtensionService
     {
         private delegate void BansheeLogHandler (LogEntryType type, IntPtr component, IntPtr message);
-        
+
         private BansheeLogHandler native_log_handler = null;
-        
+
         public Service ()
         {
         }
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void gstreamer_initialize (bool debugging, BansheeLogHandler log_handler);
-        
+
         void IExtensionService.Initialize ()
         {
             bool debugging = Banshee.Base.ApplicationContext.Debugging;
             if (debugging) {
                 native_log_handler = new BansheeLogHandler (NativeLogHandler);
             }
-            
+
             // Setup the gst plugins/registry paths if running Windows
             if (!Hyena.PlatformUtil.IsRunningUnix) {
                 string [] gst_paths = new String [] {
                     "gst-plugins"
                 };
-            
+
                 System.Environment.SetEnvironmentVariable ("GST_PLUGIN_PATH", String.Join (";", gst_paths));
                 System.Environment.SetEnvironmentVariable ("GST_PLUGIN_SYSTEM_PATH", "");
                 System.Environment.SetEnvironmentVariable ("GST_DEBUG", "1");
@@ -92,35 +92,35 @@ namespace Banshee.GStreamer
                 Pipeline.AddSExprFunction ("gst-construct-pipeline", SExprConstructPipeline);
                 Pipeline.AddSExprFunction ("gst-construct-caps", SExprConstructCaps);
                 Pipeline.AddSExprFunction ("gst-construct-element", SExprConstructElement);
-                
+
                 profile_manager.TestProfile += OnTestMediaProfile;
                 profile_manager.TestAll ();
             }
         }
-        
+
         void IDisposable.Dispose ()
         {
         }
-        
+
         private void NativeLogHandler (LogEntryType type, IntPtr componentPtr, IntPtr messagePtr)
         {
             string component = componentPtr == IntPtr.Zero ? null : GLib.Marshaller.Utf8PtrToString (componentPtr);
             string message = componentPtr == IntPtr.Zero ? null : GLib.Marshaller.Utf8PtrToString (messagePtr);
-            
+
             if (message == null) {
                 return;
             } else if (component != null) {
                 message = String.Format ("(libbanshee:{0}) {1}", component, message);
             }
-            
+
             Log.Commit (type, message, null, false);
         }
-        
+
         private static void OnTestMediaProfile (object o, TestProfileArgs args)
         {
             bool no_test = Banshee.Base.ApplicationContext.EnvironmentIsSet ("BANSHEE_PROFILES_NO_TEST");
             bool available = false;
-            
+
             foreach (Pipeline.Process process in args.Profile.Pipeline.GetPendingProcessesById ("gstreamer")) {
                 string pipeline = args.Profile.Pipeline.CompileProcess (process);
                 if (no_test || TestPipeline (pipeline)) {
@@ -131,110 +131,110 @@ namespace Banshee.GStreamer
                     Hyena.Log.DebugFormat ("GStreamer pipeline does not run: {0}", pipeline);
                 }
             }
-            
+
             args.ProfileAvailable = available;
         }
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern bool gstreamer_test_pipeline (IntPtr pipeline);
-        
+
         internal static bool TestPipeline (string pipeline)
         {
             if (String.IsNullOrEmpty (pipeline)) {
                 return false;
             }
-        
+
             IntPtr pipeline_ptr = GLib.Marshaller.StringToPtrGStrdup (pipeline);
-            
+
             if (pipeline_ptr == IntPtr.Zero) {
                 return false;
             }
-            
+
             try {
                 return gstreamer_test_pipeline (pipeline_ptr);
             } finally {
                 GLib.Marshaller.Free (pipeline_ptr);
             }
         }
-        
+
         private TreeNode SExprTestElement (EvaluatorBase evaluator, TreeNode [] args)
         {
             if (args.Length != 1) {
                 throw new ArgumentException ("gst-test-element accepts one argument");
             }
-            
+
             TreeNode arg = evaluator.Evaluate (args[0]);
             if (!(arg is StringLiteral)) {
                 throw new ArgumentException ("gst-test-element requires a string argument");
             }
-            
+
             StringLiteral element_node = (StringLiteral)arg;
             return new BooleanLiteral (TestPipeline (element_node.Value));
         }
-        
+
         private TreeNode SExprConstructPipeline (EvaluatorBase evaluator, TreeNode [] args)
         {
             StringBuilder builder = new StringBuilder ();
             List<string> elements = new List<string> ();
-            
+
             for (int i = 0; i < args.Length; i++) {
                 TreeNode node = evaluator.Evaluate (args[i]);
                 if (!(node is LiteralNodeBase)) {
                     throw new ArgumentException ("node must evaluate to a literal");
                 }
-                
+
                 string value = node.ToString ().Trim ();
-                
+
                 if (value.Length == 0) {
                     continue;
                 }
-                
+
                 elements.Add (value);
             }
-            
+
             for (int i = 0; i < elements.Count; i++) {
                 builder.Append (elements[i]);
                 if (i < elements.Count - 1) {
                     builder.Append (" ! ");
                 }
             }
-            
+
             return new StringLiteral (builder.ToString ());
         }
-        
+
         private TreeNode SExprConstructElement (EvaluatorBase evaluator, TreeNode [] args)
         {
             return SExprConstructPipelinePart (evaluator, args, true);
         }
-        
+
         private TreeNode SExprConstructCaps (EvaluatorBase evaluator, TreeNode [] args)
         {
             return SExprConstructPipelinePart (evaluator, args, false);
         }
-        
+
         private TreeNode SExprConstructPipelinePart (EvaluatorBase evaluator, TreeNode [] args, bool element)
         {
             StringBuilder builder = new StringBuilder ();
-            
+
             TreeNode list = new TreeNode ();
             foreach (TreeNode arg in args) {
                 list.AddChild (evaluator.Evaluate (arg));
             }
-            
+
             list = list.Flatten ();
-            
+
             for (int i = 0; i < list.ChildCount; i++) {
                 TreeNode node = list.Children[i];
-                
+
                 string value = node.ToString ().Trim ();
-                
+
                 builder.Append (value);
-                
+
                 if (i == 0) {
                     if (list.ChildCount > 1) {
                         builder.Append (element ? ' ' : ',');
                     }
-                    
+
                     continue;
                 } else if (i % 2 == 1) {
                     builder.Append ('=');
@@ -242,10 +242,10 @@ namespace Banshee.GStreamer
                     builder.Append (element ? ' ' : ',');
                 }
             }
-            
+
             return new StringLiteral (builder.ToString ());
         }
-        
+
         string IService.ServiceName {
             get { return "GStreamerCoreService"; }
         }
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/TagList.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/TagList.cs
index 866a139..6757234 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/TagList.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/TagList.cs
@@ -1,4 +1,4 @@
-// 
+//
 // TagList.cs
 //
 // Author:
@@ -37,97 +37,97 @@ namespace Banshee.GStreamer
     public class TagList : IDisposable
     {
         private HandleRef handle;
-        
+
         public TagList ()
         {
             handle = new HandleRef (this, bt_tag_list_new ());
         }
-        
+
         public TagList (TrackInfo track) : this ()
         {
             Merge (track);
         }
-        
+
         public void Merge (TrackInfo track)
         {
             AddTag (CommonTags.Artist, track.ArtistName);
             AddTag (CommonTags.Album, track.AlbumTitle);
             AddTag (CommonTags.Title, track.TrackTitle);
             AddTag (CommonTags.Genre, track.Genre);
-            
+
             AddTag (CommonTags.TrackNumber, (uint)track.TrackNumber);
             AddTag (CommonTags.TrackCount, (uint)track.TrackCount);
             AddTag (CommonTags.AlbumDiscNumber, (uint)track.DiscNumber);
             AddTag (CommonTags.AlbumDiscCount, (uint)track.DiscCount);
-            
+
             AddYear (track.Year);
             AddDate (track.ReleaseDate);
-            
+
             AddTag (CommonTags.Composer, track.Composer);
             AddTag (CommonTags.Copyright, track.Copyright);
             AddTag (CommonTags.Comment, track.Comment);
-            
+
             AddTag (CommonTags.MusicBrainzTrackId, track.MusicBrainzId);
             AddTag (CommonTags.MusicBrainzArtistId, track.ArtistMusicBrainzId);
             AddTag (CommonTags.MusicBrainzAlbumId, track.AlbumMusicBrainzId);
-            
+
         }
-        
+
         public void AddTag (string tagName, string value)
         {
             if (!String.IsNullOrEmpty (value)) {
                 AddTag (tagName, (object)value);
             }
         }
-        
+
         public void AddTag (string tagName, uint value)
         {
             if (value > 0) {
                 AddTag (tagName, (object)value);
             }
         }
-        
+
         public void AddDate (DateTime date)
         {
             bt_tag_list_add_date (Handle, date.Year, date.Month, date.Day);
         }
-        
+
         public void AddYear (int year)
         {
             if (year > 1) {
                 bt_tag_list_add_date (Handle, year, 1, 1);
             }
         }
-        
+
         public void AddTag (string tagName, object value)
         {
             GLib.Value g_value = new GLib.Value (value);
             bt_tag_list_add_value (Handle, tagName, ref g_value);
         }
-        
+
         public void Dispose ()
         {
             if (handle.Handle != IntPtr.Zero) {
                 bt_tag_list_free (handle);
                 handle = new HandleRef (this, IntPtr.Zero);
-                
+
                 GC.SuppressFinalize (this);
             }
         }
-        
+
         public HandleRef Handle {
             get { return handle; }
         }
-                
+
         [DllImport ("libbanshee.dll")]
         private static extern IntPtr bt_tag_list_new ();
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bt_tag_list_free (HandleRef tag_list);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bt_tag_list_add_value (HandleRef tag_list, string tag_name, ref GLib.Value value);
-        
+
         [DllImport ("libbanshee.dll")]
         private static extern void bt_tag_list_add_date (HandleRef tag_list, int year, int month, int day);
     }
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs
index 164af28..ffc079b 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/Transcoder.cs
@@ -54,21 +54,21 @@ namespace Banshee.GStreamer
         private TrackInfo current_track;
         private string error_message;
         private SafeUri managed_output_uri;
-        
+
         public Transcoder ()
         {
             IntPtr ptr = gst_transcoder_new();
-            
+
             if(ptr == IntPtr.Zero) {
                 throw new NullReferenceException(Catalog.GetString("Could not create transcoder"));
             }
-            
+
             handle = new HandleRef(this, ptr);
-            
+
             ProgressCallback = new GstTranscoderProgressCallback(OnNativeProgress);
             FinishedCallback = new GstTranscoderFinishedCallback(OnNativeFinished);
             ErrorCallback = new GstTranscoderErrorCallback(OnNativeError);
-            
+
             gst_transcoder_set_progress_callback(handle, ProgressCallback);
             gst_transcoder_set_finished_callback(handle, FinishedCallback);
             gst_transcoder_set_error_callback(handle, ErrorCallback);
@@ -79,39 +79,39 @@ namespace Banshee.GStreamer
             gst_transcoder_free(handle);
             handle = new HandleRef (this, IntPtr.Zero);
         }
-        
+
         public void Cancel ()
         {
             gst_transcoder_cancel(handle);
             handle = new HandleRef (this, IntPtr.Zero);
         }
-        
+
         public void TranscodeTrack (TrackInfo track, SafeUri outputUri, ProfileConfiguration config)
         {
             if(IsTranscoding) {
                 throw new ApplicationException("Transcoder is busy");
             }
-        
+
             Log.DebugFormat ("Transcoding {0} to {1}", track.Uri, outputUri);
             SafeUri inputUri = track.Uri;
             managed_output_uri = outputUri;
             IntPtr input_uri = GLib.Marshaller.StringToPtrGStrdup(inputUri.LocalPath);
             IntPtr output_uri = GLib.Marshaller.StringToPtrGStrdup(outputUri.LocalPath);
-            
+
             error_message = null;
-            
+
             current_track = track;
             gst_transcoder_transcode(handle, input_uri, output_uri, config.Profile.Pipeline.GetProcessById("gstreamer"));
-            
+
             GLib.Marshaller.Free(input_uri);
             GLib.Marshaller.Free(output_uri);
         }
-        
+
         private void OnNativeProgress(IntPtr transcoder, double fraction)
         {
             OnProgress (current_track, fraction);
         }
-        
+
         private void OnNativeFinished(IntPtr transcoder)
         {
             OnTrackFinished (current_track, managed_output_uri);
@@ -120,18 +120,18 @@ namespace Banshee.GStreamer
         private void OnNativeError(IntPtr transcoder, IntPtr error, IntPtr debug)
         {
             error_message = GLib.Marshaller.Utf8PtrToString(error);
-            
+
             if(debug != IntPtr.Zero) {
                 string debug_string = GLib.Marshaller.Utf8PtrToString(debug);
                 if(!String.IsNullOrEmpty (debug_string)) {
                     error_message = String.Format ("{0}: {1}", error_message, debug_string);
                 }
             }
-            
+
             try {
                 Banshee.IO.File.Delete (managed_output_uri);
             } catch {}
-            
+
             OnError (current_track, error_message);
         }
 
@@ -142,7 +142,7 @@ namespace Banshee.GStreamer
                 handler (this, new TranscoderProgressArgs (track, fraction, track.Duration));
             }
         }
-        
+
         protected virtual void OnTrackFinished (TrackInfo track, SafeUri outputUri)
         {
             TranscoderTrackFinishedHandler handler = TrackFinished;
@@ -150,7 +150,7 @@ namespace Banshee.GStreamer
                 handler (this, new TranscoderTrackFinishedArgs (track, outputUri));
             }
         }
-        
+
         protected virtual void OnError (TrackInfo track, string message)
         {
             TranscoderErrorHandler handler = Error;
@@ -158,11 +158,11 @@ namespace Banshee.GStreamer
                 handler (this, new TranscoderErrorArgs (track, message));
             }
         }
-        
+
         public bool IsTranscoding {
             get { return gst_transcoder_get_is_transcoding(handle); }
         }
-        
+
         public string ErrorMessage {
             get { return error_message; }
         }
@@ -178,7 +178,7 @@ namespace Banshee.GStreamer
         private static extern void gst_transcoder_free(HandleRef handle);
 
         [DllImport("libbanshee.dll")]
-        private static extern void gst_transcoder_transcode(HandleRef handle, IntPtr input_uri, 
+        private static extern void gst_transcoder_transcode(HandleRef handle, IntPtr input_uri,
             IntPtr output_uri, string encoder_pipeline);
 
         [DllImport("libbanshee.dll")]
@@ -189,13 +189,13 @@ namespace Banshee.GStreamer
             GstTranscoderProgressCallback cb);
 
         [DllImport("libbanshee.dll")]
-        private static extern void gst_transcoder_set_finished_callback(HandleRef handle, 
+        private static extern void gst_transcoder_set_finished_callback(HandleRef handle,
             GstTranscoderFinishedCallback cb);
 
         [DllImport("libbanshee.dll")]
-        private static extern void gst_transcoder_set_error_callback(HandleRef handle, 
+        private static extern void gst_transcoder_set_error_callback(HandleRef handle,
             GstTranscoderErrorCallback cb);
-            
+
         [DllImport("libbanshee.dll")]
         private static extern bool gst_transcoder_get_is_transcoding(HandleRef handle);
     }
diff --git a/src/Backends/Banshee.GStreamer/Makefile.in b/src/Backends/Banshee.GStreamer/Makefile.in
index 069ce9d..ec8c93b 100644
--- a/src/Backends/Banshee.GStreamer/Makefile.in
+++ b/src/Backends/Banshee.GStreamer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -376,6 +385,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -479,11 +489,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -501,6 +512,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -530,6 +542,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -550,14 +563,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.GStreamer/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.GStreamer/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.GStreamer/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.GStreamer/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -575,25 +588,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -623,13 +652,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -661,6 +694,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -681,6 +715,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -689,18 +725,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -761,7 +807,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -778,6 +824,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.Gio/Banshee.Gio.addin.xml b/src/Backends/Banshee.Gio/Banshee.Gio.addin.xml
new file mode 100644
index 0000000..56fd7a8
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.Gio.addin.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Addin 
+    id="Banshee.Gio"
+    version="1.0"
+    compatVersion="1.0"
+    copyright="© 2009 Novell Inc. Licensed under the MIT X11 license."
+    category="required:Backends"
+    description="GIO IO backend"
+    defaultEnabled="false">
+
+  <Dependencies>
+    <Addin id="Banshee.Core" version="1.0"/>
+  </Dependencies>
+  
+  <Extension path="/Banshee/Platform/IOProvider">
+    <IOProvider class="Banshee.IO.Gio.Provider" id="Banshee.IO.Gio.Provider" />
+  </Extension>
+</Addin>
diff --git a/src/Backends/Banshee.Gio/Banshee.IO.Gio/DemuxVfs.cs b/src/Backends/Banshee.Gio/Banshee.IO.Gio/DemuxVfs.cs
new file mode 100644
index 0000000..e5aaa51
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.IO.Gio/DemuxVfs.cs
@@ -0,0 +1,81 @@
+//
+// DemuxVfs.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using GLib;
+
+using Banshee.Base;
+
+namespace Banshee.IO.Gio
+{
+    public class DemuxVfs : IDemuxVfs
+    {
+        private GLib.File file;
+        private GLib.FileInfo file_info;
+
+        public DemuxVfs (string path)
+        {
+            file = path.StartsWith ("/") ? FileFactory.NewForPath (path) : FileFactory.NewForUri (path);
+
+            if (file.Exists) {
+                file_info = file.QueryInfo ("etag::value,access::can-read,access::can-write", FileQueryInfoFlags.None, null);
+            }
+        }
+
+        public void CloseStream (System.IO.Stream stream)
+        {
+            stream.Close ();
+        }
+
+        public string Name {
+            get { return file.ParsedName; }
+        }
+
+        public System.IO.Stream ReadStream {
+            get { return new GioStream (file.Read (null)); }
+        }
+
+        public System.IO.Stream WriteStream {
+            // FIXME we really need GFileIOStream here, but that depends on glib 2.22 (and a binding for it in gio#)
+            // as-is, this stream is write-only (not readable) which breaks taglib-sharp
+            get { return new GioStream (file.Exists
+                    ? file.Replace (file_info.Etag, false, FileCreateFlags.None, null)
+                    : file.Create (FileCreateFlags.None, null)
+                );
+            }
+        }
+
+        public bool IsReadable {
+            get { return file_info == null ? true : file_info.GetAttributeBoolean ("access::can-read"); }
+        }
+
+        public bool IsWritable {
+            get { return file_info == null ? true : file_info.GetAttributeBoolean ("access::can-write"); }
+        }
+    }
+}
diff --git a/src/Backends/Banshee.Gio/Banshee.IO.Gio/Directory.cs b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Directory.cs
new file mode 100644
index 0000000..43ccbcd
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Directory.cs
@@ -0,0 +1,152 @@
+//
+// Directory.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using GLib;
+
+using Hyena;
+using Banshee.Base;
+
+namespace Banshee.IO.Gio
+{
+    public class Directory : IDirectory
+    {
+        public void Create (string directory)
+        {
+            var file = FileFactory.NewForPath (directory);
+            file.MakeDirectoryWithParents (null);
+        }
+
+        public void Delete (string directory)
+        {
+            Delete (directory, false);
+        }
+
+        public void Delete (string directory, bool recursive)
+        {
+            Delete (directory, recursive, false);
+        }
+
+        internal static bool DisableNativeOptimizations = false;
+
+        private void Delete (string directory, bool recursive, bool directoryIsUri)
+        {
+            var dir = GetDir (directory, directoryIsUri);
+
+            if (!dir.Exists) {
+                Console.WriteLine ("{0} doesn't exist", directory);
+                return;
+            }
+
+            if ((dir.QueryFileType (FileQueryInfoFlags.None, null) & FileType.Directory) == 0) {
+                Console.WriteLine ("{0} isn't directory", directory);
+                return;
+            }
+
+            // If native, use the System.IO recursive delete
+            if (dir.IsNative && !DisableNativeOptimizations) {
+                System.IO.Directory.Delete (directory, recursive);
+                return;
+            }
+
+            if (recursive) {
+                foreach (string child in GetFiles (dir, false)) {
+                    FileFactory.NewForUri (child).Delete ();
+                }
+
+                foreach (string child in GetDirectories (dir, false)) {
+                    Delete (child, true, true);
+                }
+            }
+
+            dir.Delete ();
+        }
+
+        private GLib.File GetDir (string directory, bool directoryIsUri)
+        {
+            return directoryIsUri ? FileFactory.NewForUri (directory) : FileFactory.NewForPath (directory);
+        }
+
+        public bool Exists (string directory)
+        {
+            var file = FileFactory.NewForPath (directory);
+            if (!file.QueryExists (null))
+                return false;
+
+            var type = file.QueryFileType (FileQueryInfoFlags.None, null);
+            return (type & FileType.Directory) != 0;
+        }
+
+        public IEnumerable<string> GetFiles (string directory)
+        {
+            return GetFiles (directory, true, false);
+        }
+
+        private IEnumerable<string> GetFiles (string directory, bool followSymlinks, bool directoryIsUri)
+        {
+            return GetFiles (GetDir (directory, directoryIsUri), followSymlinks);
+        }
+
+        private IEnumerable<string> GetFiles (GLib.File dir, bool followSymlinks)
+        {
+            foreach (FileInfo file in dir.EnumerateChildren ("standard::type,standard::name", followSymlinks ? FileQueryInfoFlags.None : FileQueryInfoFlags.NofollowSymlinks, null)) {
+                if ((file.FileType & FileType.Regular) != 0) {
+                    yield return System.IO.Path.Combine (dir.Uri.AbsoluteUri, file.Name);
+                }
+            }
+        }
+
+        public IEnumerable<string> GetDirectories (string directory)
+        {
+            return GetDirectories (directory, true, false);
+        }
+
+        private IEnumerable<string> GetDirectories (string directory, bool followSymlinks, bool directoryIsUri)
+        {
+            return GetDirectories (GetDir (directory, directoryIsUri), followSymlinks);
+        }
+
+        private IEnumerable<string> GetDirectories (GLib.File dir, bool followSymlinks)
+        {
+            foreach (FileInfo file in dir.EnumerateChildren ("standard::type,standard::name", followSymlinks ? FileQueryInfoFlags.None : FileQueryInfoFlags.NofollowSymlinks, null)) {
+                if ((file.FileType & FileType.Directory) != 0) {
+                    yield return System.IO.Path.Combine (dir.Uri.AbsoluteUri, file.Name);
+                }
+            }
+        }
+
+        public void Move (SafeUri from, SafeUri to)
+        {
+            var dir = FileFactory.NewForUri (from.AbsoluteUri);
+            dir.Move (FileFactory.NewForUri (to.AbsoluteUri), FileCopyFlags.None, null, null);
+        }
+    }
+}
diff --git a/src/Backends/Banshee.Gio/Banshee.IO.Gio/File.cs b/src/Backends/Banshee.Gio/Banshee.IO.Gio/File.cs
new file mode 100644
index 0000000..74eb3de
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.IO.Gio/File.cs
@@ -0,0 +1,97 @@
+//
+// File.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using GLib;
+
+using Banshee.Base;
+
+namespace Banshee.IO.Gio
+{
+    public class File : IFile
+    {
+        public void Delete (SafeUri uri)
+        {
+            FileFactory.NewForUri (uri.AbsoluteUri).Delete ();
+        }
+
+        public bool Exists (SafeUri uri)
+        {
+            var file = FileFactory.NewForUri (uri.AbsoluteUri);
+
+            if (!file.Exists) {
+                return false;
+            }
+
+            var type = file.QueryFileType (FileQueryInfoFlags.None, null);
+            return (type & FileType.Regular) != 0 && (type & FileType.Directory) == 0;
+        }
+
+        public void Move (SafeUri from, SafeUri to)
+        {
+            FileFactory.NewForUri (from.AbsoluteUri).Move (FileFactory.NewForUri (to.AbsoluteUri), FileCopyFlags.None, null, null);
+        }
+
+        public void Copy (SafeUri from, SafeUri to, bool overwrite)
+        {
+            FileFactory.NewForUri (from.AbsoluteUri).Move (FileFactory.NewForUri (to.AbsoluteUri), overwrite ? FileCopyFlags.Overwrite : FileCopyFlags.None, null, null);
+        }
+
+        public System.IO.Stream OpenRead (SafeUri uri)
+        {
+            var file = FileFactory.NewForUri (uri.AbsoluteUri);
+            return new GioStream (file.Read (null));
+        }
+
+        public System.IO.Stream OpenWrite (SafeUri uri, bool overwrite)
+        {
+            var file = FileFactory.NewForUri (uri.AbsoluteUri);
+            return new GioStream (overwrite
+                ? file.Replace (null, false, FileCreateFlags.None, null)
+                : file.Create (FileCreateFlags.None, null));
+        }
+
+        public long GetSize (SafeUri uri)
+        {
+            try {
+                var file = FileFactory.NewForUri (uri.AbsoluteUri);
+                var file_info = file.QueryInfo ("standard::size", FileQueryInfoFlags.None, null);
+                return file_info.Size;
+            } catch {
+                return -1;
+            }
+        }
+
+        public long GetModifiedTime (SafeUri uri)
+        {
+            var file = FileFactory.NewForUri (uri.AbsoluteUri);
+            var file_info = file.QueryInfo ("time::modified", FileQueryInfoFlags.None, null);
+            return (long) file_info.GetAttributeULong ("time::modified");
+        }
+    }
+}
diff --git a/src/Backends/Banshee.Gio/Banshee.IO.Gio/Provider.cs b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Provider.cs
new file mode 100644
index 0000000..c6420d2
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Provider.cs
@@ -0,0 +1,49 @@
+//
+// Provider.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Banshee.IO.Gio
+{
+    public class Provider : Banshee.IO.IProvider
+    {
+        public Type FileProvider {
+            get { return typeof (File); }
+        }
+
+        public Type DirectoryProvider {
+            get { return typeof (Directory); }
+        }
+
+        public Type DemuxVfsProvider {
+            get { return typeof (DemuxVfs); }
+        }
+
+        public bool LocalOnly { get { return false; } }
+    }
+}
diff --git a/src/Backends/Banshee.Gio/Banshee.IO.Gio/Tests.cs b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Tests.cs
new file mode 100644
index 0000000..8becf44
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Banshee.IO.Gio/Tests.cs
@@ -0,0 +1,248 @@
+//
+// Tests.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if ENABLE_TESTS
+
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+using GLib;
+
+using Banshee.Base;
+
+namespace Banshee.IO.Gio
+{
+    [TestFixture]
+    public class GioTests
+    {
+        private File file = new File ();
+        private Directory dir = new Directory ();
+        private string tmp_dir = System.IO.Path.Combine (System.Environment.CurrentDirectory, "tmp-gio");
+        private SafeUri foo, baz;
+        private string woo;
+
+        static GioTests ()
+        {
+            GLib.GType.Init ();
+        }
+
+        [SetUp]
+        public void Setup ()
+        {
+            foo = Uri  ("foo");
+            baz = Uri  ("baz");
+            woo = Path ("woo");
+
+            System.IO.Directory.CreateDirectory (tmp_dir);
+            System.IO.File.WriteAllText (Path ("foo"), "bar");
+            System.IO.File.WriteAllText (Path ("baz"), "oof");
+            System.IO.Directory.CreateDirectory (Path ("woo"));
+        }
+
+        [TearDown]
+        public void Teardown ()
+        {
+            try { System.IO.File.Delete (Path ("foo")); } catch {}
+            try { System.IO.File.Delete (Path ("baz")); } catch {}
+            try { System.IO.Directory.Delete (woo); } catch {}
+            try { System.IO.Directory.Delete (tmp_dir, true); } catch {}
+        }
+
+        [Test]
+        public void Exists ()
+        {
+            Assert.IsTrue (file.Exists (foo));
+            Assert.IsTrue (file.Exists (baz));
+            Assert.IsTrue ( dir.Exists (woo));
+        }
+
+        [Test]
+        public void DoesntExist ()
+        {
+            Assert.IsFalse ( dir.Exists (Path ("foo")));
+            Assert.IsFalse (file.Exists (Uri ("woo")));
+            Assert.IsFalse (file.Exists (Uri ("asd")));
+        }
+
+        [Test]
+        public void Move ()
+        {
+            file.Move (foo, Uri ("fooz"));
+            Assert.IsTrue  (file.Exists (Uri ("fooz")));
+            Assert.IsFalse (file.Exists (foo));
+
+            dir.Move (new SafeUri (woo), Uri ("wooz"));
+            Assert.IsTrue  (dir.Exists (Path ("wooz")));
+            Assert.IsFalse (dir.Exists (woo));
+        }
+
+        [Test]
+        public void Create ()
+        {
+            var newf = Uri ("newfile");
+            Assert.IsFalse (file.Exists (newf));
+            file.OpenWrite (newf, false).Close ();
+            Assert.IsTrue (file.Exists (newf));
+
+            try {
+                file.OpenWrite (newf, false).Close ();
+                Assert.Fail ("Should have thrown an exception creating already-exists file w/o overwrite");
+            } catch {}
+
+            try {
+                file.OpenWrite (newf, true).Close ();
+            } catch {
+                Assert.Fail ("Should not have thrown an exception creating already-exists file w/ overwrite");
+            }
+
+            var newd = Path ("newdir");
+            Assert.IsFalse (dir.Exists (newd));
+            dir.Create (newd);
+            Assert.IsTrue (dir.Exists (newd));
+        }
+
+        [Test]
+        public void DemuxCreateFile ()
+        {
+            var newf = Uri ("newfile");
+            var newp = Path ("newfile");
+            Assert.IsFalse (file.Exists (newf));
+
+            var demux = new DemuxVfs (newp);
+            Assert.IsTrue (demux.IsWritable);
+            Assert.IsTrue (demux.IsReadable);
+
+            var stream = demux.WriteStream;
+            Assert.IsTrue (stream.CanWrite);
+            stream.WriteByte (0xAB);
+            demux.CloseStream (stream);
+
+            Assert.IsTrue (file.Exists (newf));
+        }
+
+        [Test]
+        public void DemuxOverwriteFile ()
+        {
+            Assert.IsTrue (file.Exists (foo));
+            Assert.AreEqual (3, file.GetSize (foo));
+
+            var demux = new DemuxVfs (foo.AbsoluteUri);
+            Assert.IsTrue (demux.IsWritable);
+            Assert.IsTrue (demux.IsReadable);
+            var stream = demux.WriteStream;
+            Assert.IsTrue (stream.CanWrite);
+
+            // Make sure can read from WriteStream - required by TagLib#
+            // FIXME - depends on glib 2.22 and new gio# - see gio DemuxVfs.cs
+            Assert.AreEqual ((byte)'b', stream.ReadByte (), "Known failure, bug in Gio backend, depends on glib 2.22 for fix");
+            stream.Position = 0;
+
+            stream.WriteByte (0xAB);
+
+            demux.CloseStream (stream);
+            Assert.IsTrue (file.Exists (foo));
+            Assert.AreEqual (1, file.GetSize (foo));
+        }
+
+        [Test]
+        public void DemuxReadFile ()
+        {
+            Assert.IsTrue (file.Exists (foo));
+
+            var demux = new DemuxVfs (foo.AbsoluteUri);
+            var stream = demux.ReadStream;
+
+            // foo contains 'bar'
+            Assert.AreEqual ((byte)'b', stream.ReadByte ());
+            Assert.AreEqual ((byte)'a', stream.ReadByte ());
+            Assert.AreEqual ((byte)'r', stream.ReadByte ());
+
+            demux.CloseStream (stream);
+        }
+
+        [Test]
+        public void GetFileProperties ()
+        {
+            Assert.AreEqual (3, file.GetSize (foo));
+            Assert.IsTrue (file.GetModifiedTime (foo) > 0);
+        }
+
+        [Test]
+        public void Delete ()
+        {
+            Assert.IsTrue (file.Exists (foo));
+            file.Delete (foo);
+            Assert.IsFalse (file.Exists (foo));
+
+            Assert.IsTrue (dir.Exists (woo));
+            dir.Delete (woo);
+            Assert.IsFalse (dir.Exists (woo));
+        }
+
+        [Test]
+        public void DeleteRecursive ()
+        {
+            dir.Delete (tmp_dir, true);
+        }
+
+        [Test]
+        public void DeleteRecursiveWithoutNativeOptimization ()
+        {
+            Directory.DisableNativeOptimizations = true;
+            dir.Delete (tmp_dir, true);
+            Directory.DisableNativeOptimizations = false;
+        }
+
+        [Test]
+        public void GetChildFiles ()
+        {
+            var files = dir.GetFiles (tmp_dir).ToArray ();
+            Assert.AreEqual (files, new string [] { foo.AbsoluteUri, baz.AbsoluteUri });
+        }
+
+        [Test]
+        public void GetChildDirs ()
+        {
+            var dirs = dir.GetDirectories (tmp_dir).ToArray ();
+            Assert.AreEqual (dirs, new string [] { new SafeUri (woo).AbsoluteUri });
+        }
+
+        private SafeUri Uri (string filename)
+        {
+            return new SafeUri (Path (filename));
+        }
+
+        private string Path (string filename)
+        {
+            return System.IO.Path.Combine (tmp_dir, filename);
+        }
+    }
+}
+
+#endif
diff --git a/src/Backends/Banshee.Gio/Makefile.am b/src/Backends/Banshee.Gio/Makefile.am
new file mode 100644
index 0000000..d24a437
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Makefile.am
@@ -0,0 +1,20 @@
+ASSEMBLY = Banshee.Gio
+TARGET = library
+LINK = $(REF_BACKEND_GIO)
+INSTALL_DIR = $(BACKENDS_INSTALL_DIR)
+
+SOURCES =  \
+	Banshee.IO.Gio/DemuxVfs.cs \
+	Banshee.IO.Gio/Directory.cs \
+	Banshee.IO.Gio/File.cs \
+	Banshee.IO.Gio/Provider.cs \
+	Banshee.IO.Gio/Tests.cs
+
+RESOURCES = Banshee.Gio.addin.xml
+
+if ENABLE_GIO
+include $(top_srcdir)/build/build.mk
+else
+EXTRA_DIST = $(SOURCES) $(RESOURCES)
+endif
+
diff --git a/src/Backends/Banshee.Gio/Makefile.in b/src/Backends/Banshee.Gio/Makefile.in
new file mode 100644
index 0000000..e5d7081
--- /dev/null
+++ b/src/Backends/Banshee.Gio/Makefile.in
@@ -0,0 +1,830 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/build/build.environment.mk \
+	$(top_srcdir)/build/build.mk \
+	$(top_srcdir)/build/build.rules.mk
+ at ENABLE_GIO_TRUE@@ENABLE_TESTS_TRUE at am__append_1 = " $(NUNIT_LIBS)"
+subdir = src/Backends/Banshee.Gio
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
+	$(top_srcdir)/build/m4/shamrock/expansions.m4 \
+	$(top_srcdir)/build/m4/shamrock/i18n.m4 \
+	$(top_srcdir)/build/m4/shamrock/mono.m4 \
+	$(top_srcdir)/build/m4/shamrock/monodoc.m4 \
+	$(top_srcdir)/build/m4/shamrock/nunit.m4 \
+	$(top_srcdir)/build/m4/shamrock/programs.m4 \
+	$(top_srcdir)/build/m4/shamrock/util.m4 \
+	$(top_srcdir)/build/m4/banshee/bnpx11.m4 \
+	$(top_srcdir)/build/m4/banshee/boo.m4 \
+	$(top_srcdir)/build/m4/banshee/daap.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-ipod.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
+	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
+	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
+	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/libbanshee.m4 \
+	$(top_srcdir)/build/m4/banshee/moblin.m4 \
+	$(top_srcdir)/build/m4/banshee/mono-addins.m4 \
+	$(top_srcdir)/build/m4/banshee/moonlight.m4 \
+	$(top_srcdir)/build/m4/banshee/notify-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/osx.m4 \
+	$(top_srcdir)/build/m4/banshee/remote-audio.m4 \
+	$(top_srcdir)/build/m4/banshee/taglib.m4 \
+	$(top_srcdir)/build/m4/banshee/torrent.m4 \
+	$(top_srcdir)/build/m4/banshee/webkit.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(moduledir)"
+SCRIPTS = $(module_SCRIPTS)
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AM_MAKEFLAGS = @AM_MAKEFLAGS@
+API_VERSION = @API_VERSION@
+AR = @AR@
+ASM_VERSION = @ASM_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BNPX_CFLAGS = @BNPX_CFLAGS@
+BNPX_GTK_CFLAGS = @BNPX_GTK_CFLAGS@
+BNPX_GTK_LIBS = @BNPX_GTK_LIBS@
+BNPX_LIBS = @BNPX_LIBS@
+BOO_CFLAGS = @BOO_CFLAGS@
+BOO_LIBS = @BOO_LIBS@
+BUILD_HOST_CPU = @BUILD_HOST_CPU@
+BUILD_HOST_OS = @BUILD_HOST_OS@
+BUILD_TIME = @BUILD_TIME@
+BUILD_VENDOR_ID = @BUILD_VENDOR_ID@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CLUTTER_CFLAGS = @CLUTTER_CFLAGS@
+CLUTTER_LIBS = @CLUTTER_LIBS@
+CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISPLAY_VERSION = @DISPLAY_VERSION@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DOCDIR = @DOCDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_RELEASE = @ENABLE_RELEASE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FGREP = @FGREP@
+GCONFSHARP_CFLAGS = @GCONFSHARP_CFLAGS@
+GCONFSHARP_LIBS = @GCONFSHARP_LIBS@
+GCONFTOOL = @GCONFTOOL@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GDK_QUARTZ_CFLAGS = @GDK_QUARTZ_CFLAGS@
+GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
+GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
+GDK_X11_LIBS = @GDK_X11_LIBS@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
+GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
+GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMCS_FLAGS = @GMCS_FLAGS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMESHARP_CFLAGS = @GNOMESHARP_CFLAGS@
+GNOMESHARP_LIBS = @GNOMESHARP_LIBS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GRAPHICS_SUBSYSTEM = @GRAPHICS_SUBSYSTEM@
+GREP = @GREP@
+GSTREAMER_REQUIRED_VERSION = @GSTREAMER_REQUIRED_VERSION@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LIBS = @GST_LIBS@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
+GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
+GTKSHARP_LIBS = @GTKSHARP_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+IGEMACINTEGRATIONSHARP_CFLAGS = @IGEMACINTEGRATIONSHARP_CFLAGS@
+IGEMACINTEGRATIONSHARP_LIBS = @IGEMACINTEGRATIONSHARP_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
+IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
+IPODSHARP_LIBS = @IPODSHARP_LIBS@
+KARMASHARP_ASSEMBLIES = @KARMASHARP_ASSEMBLIES@
+KARMASHARP_CFLAGS = @KARMASHARP_CFLAGS@
+KARMASHARP_LIBS = @KARMASHARP_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBBANSHEE_CFLAGS = @LIBBANSHEE_CFLAGS@
+LIBBANSHEE_LIBS = @LIBBANSHEE_LIBS@
+LIBMTP_CFLAGS = @LIBMTP_CFLAGS@
+LIBMTP_LIBS = @LIBMTP_LIBS@
+LIBMTP_SO_MAP = @LIBMTP_SO_MAP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEFLAGS = @MAKEFLAGS@
+MAKEINFO = @MAKEINFO@
+MCS = @MCS@
+MDASSEMBLER = @MDASSEMBLER@
+MKDIR_P = @MKDIR_P@
+MONO = @MONO@
+MONODOCER = @MONODOCER@
+MONOTORRENT_ASSEMBLIES = @MONOTORRENT_ASSEMBLIES@
+MONOTORRENT_DBUS_CFLAGS = @MONOTORRENT_DBUS_CFLAGS@
+MONOTORRENT_DBUS_LIBS = @MONOTORRENT_DBUS_LIBS@
+MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@
+MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@
+MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@
+MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@
+MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@
+MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@
+MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@
+MONO_MODULE_LIBS = @MONO_MODULE_LIBS@
+MONO_ZEROCONF_CFLAGS = @MONO_ZEROCONF_CFLAGS@
+MONO_ZEROCONF_LIBS = @MONO_ZEROCONF_LIBS@
+MOONLIGHT_CFLAGS = @MOONLIGHT_CFLAGS@
+MOONLIGHT_LIBS = @MOONLIGHT_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@
+NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@
+NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@
+NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@
+NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@
+NUNIT_CFLAGS = @NUNIT_CFLAGS@
+NUNIT_LIBS = @NUNIT_LIBS@
+OBJC = @OBJC@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+Q = @Q@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SQLITE_CFLAGS = @SQLITE_CFLAGS@
+SQLITE_LIBS = @SQLITE_LIBS@
+STRIP = @STRIP@
+TAGLIB_SHARP_CFLAGS = @TAGLIB_SHARP_CFLAGS@
+TAGLIB_SHARP_LIBS = @TAGLIB_SHARP_LIBS@
+USE_NLS = @USE_NLS@
+V = @V@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+XGETTEXT = @XGETTEXT@
+XMKMF = @XMKMF@
+XVIDMODE_CFLAGS = @XVIDMODE_CFLAGS@
+XVIDMODE_LIBS = @XVIDMODE_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+expanded_bindir = @expanded_bindir@
+expanded_datadir = @expanded_datadir@
+expanded_libdir = @expanded_libdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+shavedir = @shavedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Banshee.Gio
+TARGET = library
+LINK = $(REF_BACKEND_GIO) $(am__append_1)
+INSTALL_DIR = $(BACKENDS_INSTALL_DIR)
+SOURCES = \
+	Banshee.IO.Gio/DemuxVfs.cs \
+	Banshee.IO.Gio/Directory.cs \
+	Banshee.IO.Gio/File.cs \
+	Banshee.IO.Gio/Provider.cs \
+	Banshee.IO.Gio/Tests.cs
+
+RESOURCES = Banshee.Gio.addin.xml
+
+# Initializers
+ at ENABLE_GIO_TRUE@MONO_BASE_PATH = 
+ at ENABLE_GIO_TRUE@MONO_ADDINS_PATH = 
+
+# Install Paths
+ at ENABLE_GIO_TRUE@DEFAULT_INSTALL_DIR = $(pkglibdir)
+ at ENABLE_GIO_TRUE@BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends
+ at ENABLE_GIO_TRUE@EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions
+
+# External libraries to link against, generated from configure
+ at ENABLE_GIO_TRUE@LINK_SYSTEM = -r:System
+ at ENABLE_GIO_TRUE@LINK_SYSTEM_WEB = -r:System.Web
+ at ENABLE_GIO_TRUE@LINK_CAIRO = -r:Mono.Cairo
+ at ENABLE_GIO_TRUE@LINK_MONO_POSIX = -r:Mono.Posix
+ at ENABLE_GIO_TRUE@LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib
+ at ENABLE_GIO_TRUE@LINK_MONO_ZEROCONF = $(MONO_ZEROCONF_LIBS)
+ at ENABLE_GIO_TRUE@LINK_GLIB = $(GLIBSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_GTK = $(GTKSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_GCONF = $(GCONFSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
+ at ENABLE_GIO_TRUE@LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
+ at ENABLE_GIO_TRUE@LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_IPOD = $(IPODSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_BOO = $(BOO_LIBS)
+ at ENABLE_GIO_TRUE@LINK_WEBKIT = $(WEBKIT_LIBS)
+ at ENABLE_GIO_TRUE@LINK_MONOTORRENT_DBUS = $(MONOTORRENT_DBUS_LIBS)
+ at ENABLE_GIO_TRUE@LINK_IGEMACINTEGRATION = $(IGEMACINTEGRATIONSHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS)
+ at ENABLE_GIO_TRUE@LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS)
+ at ENABLE_GIO_TRUE@DIR_BIN = $(top_builddir)/bin
+
+# Mono.Data
+ at ENABLE_GIO_TRUE@REF_SQLITE = -r:System -r:System.Data -r:System.Transactions
+ at ENABLE_GIO_TRUE@LINK_SQLITE = -r:System.Data -r:$(DIR_BIN)/Mono.Data.Sqlite.dll
+
+# Hyena
+ at ENABLE_GIO_TRUE@REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE) $(LINK_MONO_POSIX)
+ at ENABLE_GIO_TRUE@LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll
+ at ENABLE_GIO_TRUE@LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA)
+
+# Hyena.Gui
+ at ENABLE_GIO_TRUE@REF_HYENA_GUI = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_CAIRO) $(LINK_GTK)
+ at ENABLE_GIO_TRUE@LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll
+ at ENABLE_GIO_TRUE@LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI)
+
+# Lastfm
+ at ENABLE_GIO_TRUE@REF_LASTFM = $(LINK_SYSTEM) $(LINK_SYSTEM_WEB) $(LINK_MONO_MEDIA) $(LINK_MONO_POSIX) $(LINK_HYENA) $(LINK_ICSHARP_ZIP_LIB) 
+ at ENABLE_GIO_TRUE@LINK_LASTFM = -r:$(DIR_BIN)/Lastfm.dll
+ at ENABLE_GIO_TRUE@LINK_LASTFM_DEPS = $(REF_LASTFM) $(LINK_LASTFM)
+
+# Lastfm.Gui
+ at ENABLE_GIO_TRUE@REF_LASTFM_GUI = $(LINK_GLIB) $(LINK_GTK) $(LINK_LASTFM_DEPS)
+ at ENABLE_GIO_TRUE@LINK_LASTFM_GUI = -r:$(DIR_BIN)/Lastfm.Gui.dll
+ at ENABLE_GIO_TRUE@LINK_LASTFM_GUI_DEPS = $(REF_LASTFM_GUI) $(LINK_LASTFM_GUI)
+ at ENABLE_GIO_TRUE@REF_MIGO = $(LINK_HYENA_DEPS) $(LINK_SYSTEM_WEB)
+ at ENABLE_GIO_TRUE@LINK_MIGO = -r:$(DIR_BIN)/Migo.dll
+ at ENABLE_GIO_TRUE@LINK_MIGO_DEPS = $(REF_MIGO) $(LINK_MIGO)
+
+# Mono.Media
+ at ENABLE_GIO_TRUE@REF_MONO_MEDIA = $(LINK_SYSTEM)
+ at ENABLE_GIO_TRUE@LINK_MONO_MEDIA = -r:$(DIR_BIN)/Mono.Media.dll
+ at ENABLE_GIO_TRUE@LINK_MONO_MEDIA_DEPS = $(REF_MONO_MEDIA) $(LINK_MONO_MEDIA)
+
+# Mtp
+ at ENABLE_GIO_TRUE@REF_MTP = $(LINK_SYSTEM) $(LINK_MONO_POSIX)
+ at ENABLE_GIO_TRUE@LINK_MTP = -r:$(DIR_BIN)/Mtp.dll
+ at ENABLE_GIO_TRUE@LINK_MTP_DEPS = $(REF_MTP) $(LINK_MTP)
+
+# Karma
+ at ENABLE_GIO_TRUE@REF_KARMA = $(LINK_SYSTEM) $(LINK_MONO_POSIX)
+ at ENABLE_GIO_TRUE@LINK_KARMA = $(KARMASHARP_LIBS)
+ at ENABLE_GIO_TRUE@LINK_KARMA_DEPS = $(REF_KARMA) $(LINK_KARMA)
+
+# MusicBrainz
+ at ENABLE_GIO_TRUE@REF_MUSICBRAINZ = $(LINK_SYSTEM)
+ at ENABLE_GIO_TRUE@LINK_MUSICBRAINZ = -r:$(DIR_BIN)/MusicBrainz.dll
+ at ENABLE_GIO_TRUE@LINK_MUSICBRAINZ_DEPS = $(REF_MUSICBRAINZ) $(LINK_MUSICBRAINZ)
+
+# Core
+ at ENABLE_GIO_TRUE@REF_BANSHEE_CORE = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_GLIB) \
+ at ENABLE_GIO_TRUE@	$(LINK_DBUS) $(LINK_TAGLIB) $(LINK_MONO_ADDINS_DEPS)
+
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_CORE = -r:$(DIR_BIN)/Banshee.Core.dll
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_CORE_DEPS = $(REF_BANSHEE_CORE) $(LINK_BANSHEE_CORE)
+ at ENABLE_GIO_TRUE@REF_BANSHEE_SERVICES = $(LINK_SQLITE) $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_MEDIA_DEPS) $(LINK_LASTFM_DEPS)
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_SERVICES = -r:$(DIR_BIN)/Banshee.Services.dll
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_SERVICES_DEPS = $(REF_BANSHEE_SERVICES) $(LINK_BANSHEE_SERVICES)
+ at ENABLE_GIO_TRUE@REF_BANSHEE_WIDGETS = $(LINK_MONO_POSIX) $(LINK_HYENA_GUI_DEPS)
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_WIDGETS = -r:$(DIR_BIN)/Banshee.Widgets.dll
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_WIDGETS_DEPS = $(REF_BANSHEE_WIDGETS) $(LINK_BANSHEE_WIDGETS)
+ at ENABLE_GIO_TRUE@REF_BANSHEE_THICKCLIENT = $(LINK_BANSHEE_WIDGETS_DEPS) \
+ at ENABLE_GIO_TRUE@	$(LINK_BANSHEE_SERVICES_DEPS) $(LINK_HYENA_GUI_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) $(LINK_MONO_ADDINS_GUI_DEPS)
+
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_THICKCLIENT = -r:$(DIR_BIN)/Banshee.ThickClient.dll
+ at ENABLE_GIO_TRUE@LINK_BANSHEE_THICKCLIENT_DEPS = $(REF_BANSHEE_THICKCLIENT) \
+ at ENABLE_GIO_TRUE@	$(LINK_BANSHEE_THICKCLIENT)
+
+ at ENABLE_GIO_TRUE@REF_NEREID = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_HALIE = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GIO_TRUE@REF_BEROE = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GIO_TRUE@REF_BOOTER = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GIO_TRUE@REF_BANSHEE_COLLECTIONINDEXER = $(LINK_SYSTEM) $(LINK_DBUS_NO_GLIB) $(LINK_MONO_POSIX)
+
+# Dap
+ at ENABLE_GIO_TRUE@REF_DAP = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@LINK_DAP = -r:$(DIR_BIN)/Banshee.Dap.dll
+ at ENABLE_GIO_TRUE@LINK_DAP_DEPS = $(REF_DAP) $(LINK_DAP)
+ at ENABLE_GIO_TRUE@REF_DAP_MASS_STORAGE = $(LINK_DAP_DEPS)
+ at ENABLE_GIO_TRUE@REF_DAP_MTP = $(LINK_DAP_DEPS) $(LINK_MTP_DEPS)
+ at ENABLE_GIO_TRUE@REF_DAP_IPOD = $(LINK_DAP_DEPS) $(LINK_IPOD)
+ at ENABLE_GIO_TRUE@REF_DAP_KARMA = $(LINK_DAP_DEPS) $(LINK_KARMA_DEPS)
+
+# Extensions
+ at ENABLE_GIO_TRUE@REF_EXTENSION_AUDIOCD = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MUSICBRAINZ_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_BOOKMARKS = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_BOOSCRIPT = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_BOO)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_BPM = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
+ at ENABLE_GIO_TRUE@LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
+ at ENABLE_GIO_TRUE@	$(LINK_EXTENSION_PLAYQUEUE)
+
+ at ENABLE_GIO_TRUE@REF_EXTENSION_LASTFM = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_MEDIA) $(LINK_LASTFM) $(LINK_LASTFM_GUI)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_NOWPLAYING = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@LINK_EXTENSION_NOWPLAYING = -r:$(DIR_BIN)/Banshee.NowPlaying.dll
+ at ENABLE_GIO_TRUE@LINK_EXTENSION_NOWPLAYING_DEPS = $(REF_EXTENSION_NOWPLAYING) \
+ at ENABLE_GIO_TRUE@	$(LINK_EXTENSION_NOWPLAYING)
+
+ at ENABLE_GIO_TRUE@REF_EXTENSION_NOWPLAYING_CLUTTER = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_PODCASTING = $(LINK_MIGO_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GIO_TRUE@REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
+
+# Backends
+ at ENABLE_GIO_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
+ at ENABLE_GIO_TRUE@REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
+ at ENABLE_GIO_TRUE@REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
+ at ENABLE_GIO_TRUE@REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
+ at ENABLE_GIO_TRUE@REF_BACKEND_HAL = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_DBUS)
+ at ENABLE_GIO_TRUE@REF_BACKEND_OSX = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_IGEMACINTEGRATION)
+ at ENABLE_GIO_TRUE@REF_BACKEND_BNPX11 = $(LINK_EXTENSION_NOWPLAYING_DEPS)
+
+# Cute hack to replace a space with something
+ at ENABLE_GIO_TRUE@colon := :
+ at ENABLE_GIO_TRUE@empty := 
+ at ENABLE_GIO_TRUE@space := $(empty) $(empty)
+
+# Build path to allow running uninstalled
+ at ENABLE_GIO_TRUE@RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH))
+ at ENABLE_GIO_TRUE@UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq
+ at ENABLE_GIO_TRUE@BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE)
+ at ENABLE_GIO_TRUE@SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \
+ at ENABLE_GIO_TRUE@	$(top_srcdir)/src/AssemblyInfo.cs
+ at ENABLE_GIO_TRUE@RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES))
+ at ENABLE_GIO_TRUE@RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \
+ at ENABLE_GIO_TRUE@	-resource:$(resource),$(notdir $(resource)))
+
+ at ENABLE_GIO_TRUE@INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)"
+ at ENABLE_GIO_TRUE@THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg)
+ at ENABLE_GIO_TRUE@THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE))
+ at ENABLE_GIO_TRUE@ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
+ at ENABLE_GIO_TRUE@ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
+ at ENABLE_GIO_TRUE@INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
+ at ENABLE_GIO_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_GIO_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
+ at ENABLE_GIO_TRUE@FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
+ at ENABLE_GIO_TRUE@DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
+ at ENABLE_GIO_TRUE@OUTPUT_FILES = \
+ at ENABLE_GIO_TRUE@	$(ASSEMBLY_FILE) \
+ at ENABLE_GIO_TRUE@	$(ASSEMBLY_FILE).mdb
+
+ at ENABLE_GIO_TRUE@moduledir = $(INSTALL_DIR_RESOLVED)
+ at ENABLE_GIO_TRUE@module_SCRIPTS = $(OUTPUT_FILES)
+ at ENABLE_GIO_FALSE@EXTRA_DIST = $(SOURCES) $(RESOURCES)
+ at ENABLE_GIO_TRUE@EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE)
+ at ENABLE_GIO_TRUE@CLEANFILES = $(OUTPUT_FILES)
+ at ENABLE_GIO_TRUE@DISTCLEANFILES = *.pidb
+ at ENABLE_GIO_TRUE@MAINTAINERCLEANFILES = Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.Gio/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.Gio/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-moduleSCRIPTS: $(module_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-moduleSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+	for dir in "$(DESTDIR)$(moduledir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+ at ENABLE_GIO_FALSE@uninstall-local:
+ at ENABLE_GIO_FALSE@install-data-local:
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-moduleSCRIPTS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-moduleSCRIPTS
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-moduleSCRIPTS install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-moduleSCRIPTS
+
+
+ at ENABLE_GIO_TRUE@all: $(ASSEMBLY_FILE) theme-icons
+
+ at ENABLE_GIO_TRUE@run: 
+ at ENABLE_GIO_TRUE@	@pushd $(top_builddir); \
+ at ENABLE_GIO_TRUE@	make run \
+ at ENABLE_GIO_TRUE@	popd;
+
+ at ENABLE_GIO_TRUE@build-debug:
+ at ENABLE_GIO_TRUE@	@echo $(DEP_LINK)
+
+ at ENABLE_GIO_TRUE@$(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE)
+
+ at ENABLE_GIO_TRUE@$(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
+ at ENABLE_GIO_TRUE@	@mkdir -p $(top_builddir)/bin
+ at ENABLE_GIO_TRUE@	@if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \
+ at ENABLE_GIO_TRUE@		$(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \
+ at ENABLE_GIO_TRUE@		$(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll $(SOURCES_BUILD); \
+ at ENABLE_GIO_TRUE@	fi;
+ at ENABLE_GIO_TRUE@	$(MCS) \
+ at ENABLE_GIO_TRUE@		$(GMCS_FLAGS) \
+ at ENABLE_GIO_TRUE@		$(ASSEMBLY_BUILD_FLAGS) \
+ at ENABLE_GIO_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
+ at ENABLE_GIO_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
+ at ENABLE_GIO_TRUE@		-debug -target:$(TARGET) -out:$@ \
+ at ENABLE_GIO_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
+ at ENABLE_GIO_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
+ at ENABLE_GIO_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
+ at ENABLE_GIO_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
+ at ENABLE_GIO_TRUE@	fi;
+ at ENABLE_GIO_TRUE@	@if [ ! -z "$(EXTRA_BUNDLE)" ]; then \
+ at ENABLE_GIO_TRUE@		cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \
+ at ENABLE_GIO_TRUE@	fi;
+
+ at ENABLE_GIO_TRUE@theme-icons: $(THEME_ICONS_SOURCE)
+ at ENABLE_GIO_TRUE@	@$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+ at ENABLE_GIO_TRUE@install-data-local: $(THEME_ICONS_SOURCE)
+ at ENABLE_GIO_TRUE@	@$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+ at ENABLE_GIO_TRUE@uninstall-local: $(THEME_ICONS_SOURCE)
+ at ENABLE_GIO_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs
index c688a1d..daf5469 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/Brasero.cs
@@ -47,7 +47,7 @@ namespace Banshee.GnomeBackend
     public class Brasero : IDisposable
     {
         private string brasero_exec;
-        
+
         public Brasero ()
         {
             brasero_exec = Paths.FindProgramInPath ("brasero");
@@ -55,7 +55,7 @@ namespace Banshee.GnomeBackend
                 throw new FileNotFoundException ("brasero");
             }
         }
-        
+
         public void Initialize ()
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
@@ -65,71 +65,71 @@ namespace Banshee.GnomeBackend
                     Catalog.GetString ("Write selected tracks to an audio CD"),
                     OnBurnDisc)
             });
-            
+
             Gtk.Action action = uia_service.TrackActions["BurnDiscAction"];
             action.IconName = "media-write-cd";
-            
+
             uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
-            
+
             UpdateActions ();
             uia_service.TrackActions.SelectionChanged += delegate { Banshee.Base.ThreadAssist.ProxyToMain (UpdateActions); };
             ServiceManager.SourceManager.ActiveSourceChanged += delegate { Banshee.Base.ThreadAssist.ProxyToMain (UpdateActions); };
         }
-        
+
         public void Dispose ()
         {
         }
-        
+
         private void OnBurnDisc (object o, EventArgs args)
         {
             DatabaseSource source = ServiceManager.SourceManager.ActiveSource as DatabaseSource;
             if (source == null) {
                 return;
             }
-            
+
             StringBuilder file_args = new StringBuilder ();
             file_args.Append ("-a");
-            
+
             foreach (TrackInfo track in source.TrackModel.SelectedItems) {
                 if (track.Uri.IsLocalPath) {
                     file_args.AppendFormat (" \"{0}\"", track.Uri.AbsolutePath.Replace ("\"", "\\\""));
                 }
             }
-            
+
             try {
                 Run (file_args.ToString ());
             } catch (Exception e) {
                 Log.Exception ("Problem starting Brasero", e);
-                Log.Error (Catalog.GetString ("Could not write CD"), 
+                Log.Error (Catalog.GetString ("Could not write CD"),
                     Catalog.GetString ("Brasero could not be started"), true);
             }
         }
-        
+
         internal void Run (string args)
         {
             ProcessStartInfo psi = new ProcessStartInfo (brasero_exec, args);
             psi.UseShellExecute = false;
             Process.Start (psi);
         }
-        
+
         private void UpdateActions ()
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             Gtk.Action action = uia_service.TrackActions["BurnDiscAction"];
-            
+
             bool visible = false;
             bool sensitive = false;
-            
+
             DatabaseSource source = ServiceManager.SourceManager.ActiveSource as DatabaseSource;
             // FIXME: Figure out how to handle non-music-library sources
             if (source != null) {
                 if (source is MusicLibrarySource || source.Parent is MusicLibrarySource) {
                     visible = true;
                 }
-                
+
                 sensitive = source.TrackModel.Selection.Count > 0;
             }
-            
+
             action.Sensitive = sensitive;
             action.Visible = visible;
         }
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/DiscDuplicator.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/DiscDuplicator.cs
index d28c0d9..7bd7b4a 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/DiscDuplicator.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/DiscDuplicator.cs
@@ -44,34 +44,34 @@ namespace Banshee.GnomeBackend
                     "Neither Brasero nor Nautilus CD Burner could be found to duplicate this disc."));
             }
         }
-        
+
         private bool RunBrasero (string device)
         {
             GnomeService gnome = ServiceManager.Get<GnomeService> ();
             if (gnome == null || gnome.Brasero == null) {
                 return false;
             }
-            
+
             try {
                 gnome.Brasero.Run (String.Format ("-c {0}", device));
             } catch (Exception e) {
                 Log.Exception (e);
                 return false;
             }
-            
+
             return true;
         }
-        
+
         private bool RunNcb (string device)
-        {    
+        {
             try {
-                System.Diagnostics.Process.Start ("nautilus-cd-burner", 
+                System.Diagnostics.Process.Start ("nautilus-cd-burner",
                     String.Format ("--source-device={0}", device));
             } catch (Exception e) {
                 Log.Exception (e);
                 return false;
             }
-            
+
             return false;
         }
     }
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs
index e3d1cdf..8943197 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GConfConfigurationClient.cs
@@ -41,17 +41,17 @@ namespace Banshee.GnomeBackend
     {
         private GConf.Client client;
         private Dictionary<string, string> key_table = new Dictionary<string, string> ();
-        
+
         private static bool disable_gconf_checked = false;
         private static bool disable_gconf = false;
-        
+
         private static bool DisableGConf {
-            get { 
+            get {
                 if (!disable_gconf_checked) {
                     disable_gconf = ApplicationContext.EnvironmentIsSet ("BANSHEE_DISABLE_GCONF");
                     disable_gconf_checked = true;
                 }
-                
+
                 return disable_gconf;
             }
         }
@@ -90,36 +90,36 @@ namespace Banshee.GnomeBackend
 
                     key_table[hash_key] = key_table[hash_key].Replace (' ', '_');
                 }
-                
+
                 return key_table[hash_key];
             }
         }
-        
+
         public T Get<T> (SchemaEntry<T> entry)
         {
             return Get<T> (entry.Namespace, entry.Key, entry.DefaultValue);
         }
-        
+
         public T Get<T> (SchemaEntry<T> entry, T fallback)
         {
             return Get<T> (entry.Namespace, entry.Key, fallback);
         }
-        
+
         public T Get<T> (string key, T fallback)
         {
             return Get<T> (null, key, fallback);
         }
-        
+
         public T Get<T> (string @namespace, string key, T fallback)
         {
             if (DisableGConf || key == null) {
                 return fallback;
             }
-            
+
             if (client == null) {
                 client = new GConf.Client ();
             }
-            
+
             try {
                 return (T)client.Get (CreateKey (@namespace, key));
             } catch (GConf.NoSuchKeyException) {
@@ -129,27 +129,27 @@ namespace Banshee.GnomeBackend
                 return fallback;
             }
         }
-        
+
         public void Set<T> (SchemaEntry<T> entry, T value)
         {
             Set<T> (entry.Namespace, entry.Key, value);
         }
-        
+
         public void Set<T> (string key, T value)
         {
             Set<T> (null, key, value);
         }
-        
+
         public void Set<T> (string @namespace, string key, T value)
         {
             if (DisableGConf || key == null) {
                 return;
             }
-            
+
             if (client == null) {
                 client = new GConf.Client ();
             }
-            
+
             client.Set (CreateKey (@namespace, key), value);
         }
     }
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs
index f2d1ce3..17ceefc 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeScreensaverManager.cs
@@ -32,7 +32,7 @@ using Mono.Unix;
 using Banshee.PlatformServices;
 
 namespace Banshee.GnomeBackend
-{    
+{
     [Interface("org.gnome.ScreenSaver")]
     internal interface IGnomeScreensaver
     {
@@ -44,7 +44,7 @@ namespace Banshee.GnomeBackend
     {
         const string DBUS_INTERFACE = "org.gnome.ScreenSaver";
         const string DBUS_PATH = "/org/gnome/ScreenSaver";
-        
+
         IGnomeScreensaver manager;
         uint? cookie;
 
@@ -61,9 +61,9 @@ namespace Banshee.GnomeBackend
                     if (!Bus.Session.NameHasOwner (DBUS_INTERFACE)) {
                         return null;
                     }
-                    
+
                     manager = Bus.Session.GetObject<IGnomeScreensaver> (DBUS_INTERFACE, new ObjectPath (DBUS_PATH));
-                    
+
                     if (manager == null) {
                         Hyena.Log.ErrorFormat ("The {0} object could not be located on the DBus interface {1}",
                             DBUS_PATH, DBUS_INTERFACE);
@@ -72,7 +72,7 @@ namespace Banshee.GnomeBackend
                 return manager;
             }
         }
-        
+
         public void Inhibit ()
         {
             if (!cookie.HasValue && Manager != null) {
diff --git a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
index 8c8cd43..afcff21 100644
--- a/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
+++ b/src/Backends/Banshee.Gnome/Banshee.GnomeBackend/GnomeService.cs
@@ -33,17 +33,17 @@ using Banshee.Web;
 
 namespace Banshee.GnomeBackend
 {
-    public class GnomeService : IExtensionService, IDisposable 
+    public class GnomeService : IExtensionService, IDisposable
     {
         private Brasero brasero;
         internal Brasero Brasero {
             get { return brasero; }
         }
-        
+
         public GnomeService ()
         {
         }
-        
+
         public void Initialize ()
         {
             try {
@@ -52,30 +52,30 @@ namespace Banshee.GnomeBackend
             } catch {
                 brasero = null;
             }
-        
+
             if (Browser.OpenHandler == null) {
                 Browser.OpenHandler = OpenUrl;
             }
         }
-        
+
         public void Dispose ()
         {
             if (brasero != null) {
                 brasero.Dispose ();
                 brasero = null;
             }
-        
+
             if (Browser.OpenHandler == (Banshee.Web.Browser.OpenUrlHandler) OpenUrl) {
                 Browser.OpenHandler = null;
             }
         }
-        
+
         private bool OpenUrl (string url)
         {
             Hyena.Log.Debug ("Opening URL via gnome-open", url);
             return Gnome.Url.Show (url);
         }
-        
+
         string IService.ServiceName {
             get { return "GnomeService"; }
         }
diff --git a/src/Backends/Banshee.Gnome/Makefile.in b/src/Backends/Banshee.Gnome/Makefile.in
index e00c020..cce9a63 100644
--- a/src/Backends/Banshee.Gnome/Makefile.in
+++ b/src/Backends/Banshee.Gnome/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,6 +386,7 @@ RESOURCES = \
 @ENABLE_GNOME_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_GNOME_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_GNOME_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_GNOME_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -480,11 +490,12 @@ RESOURCES = \
 @ENABLE_GNOME_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GNOME_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_GNOME_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GNOME_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_GNOME_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -502,6 +513,7 @@ RESOURCES = \
 @ENABLE_GNOME_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_GNOME_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_GNOME_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_GNOME_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_GNOME_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -531,6 +543,7 @@ RESOURCES = \
 @ENABLE_GNOME_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_GNOME_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_GNOME_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_GNOME_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_GNOME_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_GNOME_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_GNOME_TRUE at OUTPUT_FILES = \
@@ -551,14 +564,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.Gnome/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.Gnome/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.Gnome/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.Gnome/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -576,25 +589,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -624,13 +653,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -662,6 +695,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -684,6 +718,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -692,18 +728,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -764,7 +810,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_GNOME_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_GNOME_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_GNOME_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_GNOME_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_GNOME_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_GNOME_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_GNOME_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_GNOME_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -781,6 +827,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_GNOME_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_GNOME_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/BlockDevice.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/BlockDevice.cs
index f16edca..a953b97 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/BlockDevice.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/BlockDevice.cs
@@ -44,18 +44,18 @@ namespace Banshee.HalBackend
                 } else if (typeof (T) == typeof (IDiskDevice)) {
                     return DiskDevice.Resolve (manager, device);
                 }
-                
-                return (BlockDevice)CdromDevice.Resolve (manager, device) 
+
+                return (BlockDevice)CdromDevice.Resolve (manager, device)
                     ?? (BlockDevice)DiskDevice.Resolve (manager, device);
             }
-            
+
             return null;
         }
-        
+
         protected BlockDevice (Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
         }
-        
+
         public string DeviceNode {
             get { return HalDevice["block.device"]; }
         }
@@ -67,7 +67,7 @@ namespace Banshee.HalBackend
         public IEnumerable<IVolume> Volumes {
             get { return this; }
         }
-        
+
         public IEnumerator<IVolume> GetEnumerator ()
         {
             foreach (Hal.Device hal_device in HalDevice.GetChildrenAsDevice (HalManager)) {
@@ -77,12 +77,12 @@ namespace Banshee.HalBackend
                 }
             }
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         public override string ToString ()
         {
             return DeviceNode;
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/CdromDevice.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/CdromDevice.cs
index 75a942b..8191ebf 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/CdromDevice.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/CdromDevice.cs
@@ -41,28 +41,28 @@ namespace Banshee.HalBackend
             if (device["storage.drive_type"] == "cdrom") {
                 return new CdromDevice (manager, device);
             }
-            
+
             return null;
         }
-        
+
         private CdromDevice (Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
         }
-        
+
         [DllImport ("libc")]
-        private static extern int ioctl (int device, IoctlOperation request, bool lockdoor); 
+        private static extern int ioctl (int device, IoctlOperation request, bool lockdoor);
 
         private enum IoctlOperation {
             LockDoor = 0x5329
         }
-        
+
         private bool is_door_locked = false;
-        
+
         private bool LockDeviceNode (string device, bool lockdoor)
         {
             try {
                 using (UnixStream stream = (new UnixFileInfo (device)).Open (
-                    Mono.Unix.Native.OpenFlags.O_RDONLY | 
+                    Mono.Unix.Native.OpenFlags.O_RDONLY |
                     Mono.Unix.Native.OpenFlags.O_NONBLOCK)) {
                     bool success = ioctl (stream.Handle, IoctlOperation.LockDoor, lockdoor) == 0;
                     is_door_locked = success && lockdoor;
@@ -72,21 +72,21 @@ namespace Banshee.HalBackend
                 return false;
             }
         }
-        
+
         public bool LockDoor ()
         {
             lock (this) {
                 return LockDeviceNode (DeviceNode, true);
             }
         }
-        
+
         public bool UnlockDoor ()
         {
             lock (this) {
                 return LockDeviceNode (DeviceNode, false);
             }
         }
-        
+
         // FIXME: This is incredibly lame, there must be a way to query the
         // device itself rather than hackisly attempting to keep track of it
         public bool IsDoorLocked {
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/Device.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/Device.cs
index 9014f06..b5d9bc5 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/Device.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/Device.cs
@@ -39,7 +39,7 @@ namespace Banshee.HalBackend
         internal Hal.Device HalDevice {
             get { return device; }
         }
-        
+
         private Hal.Manager manager;
         protected Hal.Manager HalManager {
             get { return manager; }
@@ -50,7 +50,7 @@ namespace Banshee.HalBackend
             this.manager = manager;
             this.device = device;
         }
-        
+
         private string uuid;
         public string Uuid {
             get { return uuid ?? (uuid = device.Udi); /*String.IsNullOrEmpty (HalDevice["usb.serial"]) ? device.Udi : HalDevice["usb.serial"];*/ }
@@ -93,47 +93,47 @@ namespace Banshee.HalBackend
                 return media_capabilities;
             }
         }
-        
+
         public bool PropertyExists (string key)
         {
             return device.PropertyExists (key);
         }
-        
+
         public string GetPropertyString (string key)
         {
             return device.GetPropertyString (key);
         }
-        
+
         public double GetPropertyDouble (string key)
         {
             return device.GetPropertyDouble (key);
         }
-        
+
         public bool GetPropertyBoolean (string key)
         {
             return device.GetPropertyBoolean (key);
         }
-        
+
         public int GetPropertyInteger (string key)
         {
             return device.GetPropertyInteger (key);
         }
-        
+
         public ulong GetPropertyUInt64 (string key)
         {
             return device.GetPropertyUInt64 (key);
         }
-        
+
         public string [] GetPropertyStringList (string key)
         {
             return device.GetPropertyStringList (key);
         }
-        
+
         public IUsbDevice ResolveRootUsbDevice ()
         {
             return UsbDevice.Resolve (HalManager, CollectUsbDeviceStack (device).Peek ());
         }
-        
+
         private static Stack<Hal.Device> CollectUsbDeviceStack (Hal.Device device)
         {
             Stack<Hal.Device> device_stack = new Stack<Hal.Device> ();
@@ -156,12 +156,12 @@ namespace Banshee.HalBackend
                 int _usb_product_id = -1;
 
                 // Figure out the IDs if they exist
-                if (tmp_device.PropertyExists ("usb.vendor_id") && 
+                if (tmp_device.PropertyExists ("usb.vendor_id") &&
                     tmp_device.PropertyExists ("usb.product_id")) {
                     _usb_vendor_id = tmp_device.GetPropertyInteger ("usb.vendor_id");
                     _usb_product_id = tmp_device.GetPropertyInteger ("usb.product_id");
                     have_usb_ids = true;
-                } else if (tmp_device.PropertyExists("usb_device.vendor_id") && 
+                } else if (tmp_device.PropertyExists("usb_device.vendor_id") &&
                     tmp_device.PropertyExists("usb_device.product_id")) {
                     _usb_vendor_id = tmp_device.GetPropertyInteger("usb_device.vendor_id");
                     _usb_product_id = tmp_device.GetPropertyInteger("usb_device.product_id");
@@ -185,7 +185,7 @@ namespace Banshee.HalBackend
                 device_stack.Push (tmp_device);
                 tmp_device = tmp_device.Parent;
             }
-            
+
             return device_stack;
         }
     }
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
index 0941202..1798984 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiscVolume.cs
@@ -38,31 +38,31 @@ namespace Banshee.HalBackend
         {
             return device.QueryCapability ("volume.disc") ? new DiscVolume (parent, manager, device) : null;
         }
-        
+
         private DiscVolume (BlockDevice parent, Hal.Manager manager, Hal.Device device) : base (parent, manager, device)
         {
         }
-        
+
         public bool HasAudio {
             get { return HalDevice.GetPropertyBoolean ("volume.disc.has_audio"); }
         }
-        
+
         public bool HasData {
             get { return HalDevice.GetPropertyBoolean ("volume.disc.has_data"); }
         }
-        
+
         public bool IsBlank {
             get { return HalDevice.GetPropertyBoolean ("volume.disc.is_blank"); }
         }
-        
+
         public bool IsRewritable {
             get { return HalDevice.GetPropertyBoolean ("volume.disc.is_rewritable"); }
         }
-        
+
         public ulong MediaCapacity {
             get { return HalDevice.GetPropertyUInt64 ("volume.disc.capacity"); }
         }
-        
+
         public override string ToString ()
         {
             return String.Format ("Optical Disc, Audio = {0}, Data = {1}, Blank = {2}, Rewritable = {3}, Media Capacity = {4}",
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiskDevice.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiskDevice.cs
index e4da4dc..0b5f913 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/DiskDevice.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/DiskDevice.cs
@@ -41,10 +41,10 @@ namespace Banshee.HalBackend
             if (device["storage.drive_type"] == "disk") {
                 return new DiskDevice (manager, device);
             }
-            
+
             return null;
         }
-        
+
         private DiskDevice (Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
         }
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/HardwareManager.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/HardwareManager.cs
index f21a474..83c9f68 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/HardwareManager.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/HardwareManager.cs
@@ -40,7 +40,7 @@ namespace Banshee.HalBackend
 
         public event DeviceAddedHandler DeviceAdded;
         public event DeviceRemovedHandler DeviceRemoved;
-        
+
         public HardwareManager ()
         {
             manager = new Hal.Manager ();
@@ -49,7 +49,7 @@ namespace Banshee.HalBackend
 
             Volume.HardwareManager = this;
         }
-        
+
         public void Dispose ()
         {
         }
@@ -64,7 +64,7 @@ namespace Banshee.HalBackend
                 }
             }
         }
-        
+
         private IEnumerable<T> GetAllBlockDevices<T> () where T : IBlockDevice
         {
             foreach (Hal.Device hal_device in manager.FindDeviceByCapabilityAsDevice ("block")) {
@@ -74,17 +74,17 @@ namespace Banshee.HalBackend
                 }
             }
         }
-        
+
         public IEnumerable<IBlockDevice> GetAllBlockDevices ()
         {
             return GetAllBlockDevices<IBlockDevice> ();
         }
-        
+
         public IEnumerable<ICdromDevice> GetAllCdromDevices ()
         {
             return GetAllBlockDevices<ICdromDevice> ();
         }
-        
+
         public IEnumerable<IDiskDevice> GetAllDiskDevices ()
         {
             return GetAllBlockDevices<IDiskDevice> ();
@@ -104,7 +104,7 @@ namespace Banshee.HalBackend
             if (!hal_device.QueryCapability ("block") && !hal_device.QueryCapability ("portable_audio_player")) {
                 return null;
             }
-            
+
             IDevice device = BlockDevice.Resolve<IBlockDevice> (manager, hal_device);
             if (device == null) {
                 device = Volume.Resolve (null, manager, hal_device);
@@ -112,7 +112,7 @@ namespace Banshee.HalBackend
                     device = new Device (manager, hal_device);
                 }
             }
-            
+
             return device;
         }
 
@@ -127,7 +127,7 @@ namespace Banshee.HalBackend
         {
             OnDeviceRemoved (args.Udi);
         }
-        
+
         private void OnDeviceAdded (IDevice device)
         {
             DeviceAddedHandler handler = DeviceAdded;
@@ -135,7 +135,7 @@ namespace Banshee.HalBackend
                 handler (this, new DeviceAddedArgs (device));
             }
         }
-        
+
         internal void OnDeviceRemoved (string uuid)
         {
             DeviceRemovedHandler handler = DeviceRemoved;
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/UsbDevice.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/UsbDevice.cs
index 783c339..206c7d5 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/UsbDevice.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/UsbDevice.cs
@@ -36,39 +36,39 @@ namespace Banshee.HalBackend
     {
         public static UsbDevice Resolve (Hal.Manager manager, Hal.Device device)
         {
-            if (device["info.subsystem"] == "usb_device" && 
-                device.PropertyExists ("usb_device.product_id") && 
+            if (device["info.subsystem"] == "usb_device" &&
+                device.PropertyExists ("usb_device.product_id") &&
                 device.PropertyExists ("usb_device.vendor_id")) {
                 return new UsbDevice (manager, device);
             }
-            
+
             return null;
         }
-        
+
         private UsbDevice (Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
         }
-        
+
         public int VendorId {
             get { return HalDevice.GetPropertyInteger ("usb_device.vendor_id"); }
         }
-        
+
         public int ProductId {
             get { return HalDevice.GetPropertyInteger ("usb_device.product_id"); }
         }
-        
+
         public override string Serial {
-            get { return HalDevice.PropertyExists ("usb_device.serial") 
+            get { return HalDevice.PropertyExists ("usb_device.serial")
                 ? HalDevice["usb_device.serial"] : null; }
         }
-        
+
         public double Speed {
-            get { return HalDevice.PropertyExists ("usb_device.speed") 
+            get { return HalDevice.PropertyExists ("usb_device.speed")
                 ? HalDevice.GetPropertyDouble ("usb_device.speed") : 0.0; }
         }
-        
+
         public double Version {
-            get { return HalDevice.PropertyExists ("usb_device.version") 
+            get { return HalDevice.PropertyExists ("usb_device.version")
                 ? HalDevice.GetPropertyDouble ("usb_device.version") : 0.0; }
         }
     }
diff --git a/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs b/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs
index 165dbd5..51620ec 100644
--- a/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs
+++ b/src/Backends/Banshee.Hal/Banshee.HalBackend/Volume.cs
@@ -39,15 +39,15 @@ namespace Banshee.HalBackend
         private static Dictionary<Hal.Device, Volume> unmounted_volumes = new Dictionary<Hal.Device, Volume> ();
 
         internal static HardwareManager HardwareManager;
-        
+
         private const string method_names_property = "org.freedesktop.Hal.Device.Volume.method_names";
-        
+
         public static Volume Resolve (BlockDevice parent, Hal.Manager manager, Hal.Device device)
         {
             if (!device.IsVolume) {
                 return null;
             }
-            
+
             try {
                 Volume volume = (parent is ICdromDevice || (parent == null && device.QueryCapability ("volume.disc")))
                     ? DiscVolume.Resolve (parent, manager, device)
@@ -60,15 +60,15 @@ namespace Banshee.HalBackend
 
             return null;
         }
-        
+
         private BlockDevice parent;
         private string [] method_names;
-        
+
         protected Volume (BlockDevice parent, Hal.Manager manager, Hal.Device device) : base (manager, device)
         {
             this.parent = parent ?? BlockDevice.Resolve<IBlockDevice> (manager, device.Parent);
-            
-            method_names = HalDevice.PropertyExists (method_names_property) 
+
+            method_names = HalDevice.PropertyExists (method_names_property)
                 ? device.GetPropertyStringList (method_names_property)
                 : new string[0];
         }
@@ -87,13 +87,13 @@ namespace Banshee.HalBackend
 
         /*private string serial;
         public override string Serial {
-            get { 
+            get {
                 if (serial == null) {
-                    serial = String.IsNullOrEmpty (HalDevice["volume.uuid"]) 
-                        ? base.Serial 
+                    serial = String.IsNullOrEmpty (HalDevice["volume.uuid"])
+                        ? base.Serial
                         : HalDevice["volume.uuid"];
                 }
-                
+
                 return serial;
             }
         }*/
@@ -119,9 +119,9 @@ namespace Banshee.HalBackend
                 if (!IsMounted) {
                     return -1;
                 }
-                
+
                 // FIXME: maybe we should use UnixDriveInfo? Advantages?
-                
+
                 try {
                     Mono.Unix.Native.Statvfs statvfs_info;
                     if (Mono.Unix.Native.Syscall.statvfs (MountPoint, out statvfs_info) != -1) {
@@ -129,44 +129,44 @@ namespace Banshee.HalBackend
                     }
                 } catch {
                 }
-                
+
                 return -1;
             }
         }
-        
+
         public IBlockDevice Parent {
             get { return parent; }
         }
-        
+
         public bool CanEject {
             get { return Array.IndexOf<string> (method_names, "Eject") >= 0; }
         }
-        
+
         public void Eject ()
         {
             if (CanEject && HalDevice.IsVolume) {
                 HalDevice.Volume.Eject ();
             }
         }
-        
+
         public bool CanUnmount {
             get { return Array.IndexOf<string> (method_names, "Unmount") >= 0; }
         }
-        
+
         public void Unmount ()
         {
             if (CanUnmount && HalDevice.IsVolume) {
                 HalDevice.Volume.Unmount ();
             }
         }
-        
+
         public override string ToString ()
         {
             if (IsMounted) {
-                return String.Format ("`{0}': mounted {1} volume at {2} with {3} bytes free (of {4})", 
+                return String.Format ("`{0}': mounted {1} volume at {2} with {3} bytes free (of {4})",
                     Name, IsReadOnly ? "read only" : "read/write", MountPoint, Available, Capacity);
             }
-            
+
             return String.Format ("`{0}': not mounted (capacity: {1} bytes)", Name, Capacity);
         }
 
diff --git a/src/Backends/Banshee.Hal/Hal/Device.cs b/src/Backends/Banshee.Hal/Hal/Device.cs
index e1f07b2..e284481 100644
--- a/src/Backends/Banshee.Hal/Hal/Device.cs
+++ b/src/Backends/Banshee.Hal/Hal/Device.cs
@@ -41,52 +41,52 @@ namespace Hal
         public bool Removed;
     }
 
-    internal delegate void DBusPropertyModifiedHandler(int modificationsLength, 
+    internal delegate void DBusPropertyModifiedHandler(int modificationsLength,
         PropertyModification [] modifications);
-    
+
     [Interface("org.freedesktop.Hal.Device")]
     internal interface IDevice
     {
         // TODO:
         // Need to support the Condition event, but it has a
         // variable number of arguments, not currently supported
-        
+
         event DBusPropertyModifiedHandler PropertyModified;
-    
+
         void SetPropertyString(string key, string value);
         void SetPropertyInteger(string key, int value);
         void SetPropertyBoolean(string key, bool value);
         void SetPropertyDouble(string key, double value);
         void SetPropertyStringList(string key, string [] value);
-        
+
         void SetProperty(string key, ulong value);
         ulong GetProperty(string key); // nasty hack to get around the fact
                                        // that HAL doesn't actually send this
-                                       // in a variant, nor does it have a 
+                                       // in a variant, nor does it have a
                                        // GetPropertyUInt64
                                        // should be object GetProperty(string key)
 
         void StringListPrepend(string key, string value);
         void StringListAppend(string key, string value);
         void StringListRemove(string key, string value);
-        
+
         string GetPropertyString(string key);
         int GetPropertyInteger(string key);
         bool GetPropertyBoolean(string key);
         double GetPropertyDouble(string key);
         string [] GetPropertyStringList(string key);
-        
+
         IDictionary<string, object> GetAllProperties();
         void RemoveProperty(string key);
         PropertyType GetPropertyType(string key);
         bool PropertyExists(string key);
-        
+
         void AddCapability(string capability);
         bool QueryCapability(string capability);
         void Lock(string reason);
         void Unlock();
     }
-    
+
     internal enum DType : byte
     {
       Invalid = (byte)'\0',
@@ -112,7 +112,7 @@ namespace Hal
       DictEntryBegin = (byte)'{',
       DictEntryEnd = (byte)'}',
     }
-    
+
     public enum PropertyType
     {
         Invalid = DType.Invalid,
@@ -121,18 +121,18 @@ namespace Hal
         Double = DType.Double,
         Boolean = DType.Boolean,
         String = DType.String,
-        StrList = ((int)(DType.String << 8) + ('l')) 
+        StrList = ((int)(DType.String << 8) + ('l'))
     }
 
     public class PropertyModifiedArgs : EventArgs
     {
         private PropertyModification [] modifications;
-        
+
         public PropertyModifiedArgs(PropertyModification [] modifications)
         {
             this.modifications = modifications;
         }
-        
+
         public PropertyModification [] Modifications {
             get { return modifications; }
         }
@@ -145,58 +145,58 @@ namespace Hal
     {
         private string udi;
         private IDevice device;
-        
+
         public event PropertyModifiedHandler PropertyModified;
-        
+
         public Device(string udi)
         {
             this.udi = udi;
-            
+
             device = CastDevice<IDevice>();
             device.PropertyModified += OnPropertyModified;
         }
-        
+
         public static Device [] UdisToDevices(string [] udis)
         {
             if(udis == null || udis.Length == 0) {
                 return new Device[0];
             }
-            
+
             Device [] devices = new Device[udis.Length];
             for(int i = 0; i < udis.Length; i++) {
                 devices[i] = new Device(udis[i]);
             }
-            
+
             return devices;
         }
-        
+
         protected virtual void OnPropertyModified(int modificationsLength, PropertyModification [] modifications)
         {
             if(modifications.Length != modificationsLength) {
                 throw new ApplicationException("Number of modified properties does not match");
             }
-        
+
             PropertyModifiedHandler handler = PropertyModified;
             if(handler != null) {
-                handler(this, new PropertyModifiedArgs(modifications));   
+                handler(this, new PropertyModifiedArgs(modifications));
             }
         }
-        
+
         public string [] GetChildren(Manager manager)
         {
             return manager.FindDeviceByStringMatch("info.parent", Udi);
         }
-        
+
         public Device [] GetChildrenAsDevice(Manager manager)
         {
             return manager.FindDeviceByStringMatchAsDevice("info.parent", Udi);
         }
-        
+
         public void Lock(string reason)
         {
             device.Lock(reason);
         }
-        
+
         public void Unlock()
         {
             device.Unlock();
@@ -211,7 +211,7 @@ namespace Hal
         {
             return device.GetPropertyInteger(key);
         }
-        
+
         public ulong GetPropertyUInt64(string key)
         {
             return device.GetProperty(key);
@@ -236,27 +236,27 @@ namespace Hal
         {
             return PropertyExists(key) ? device.GetPropertyType(key) : PropertyType.Invalid;
         }
-        
+
         public void StringListPrepend(string key, string value)
         {
             device.SetPropertyString(key, value);
         }
-        
+
         public void StringListAppend(string key, string value)
         {
             device.StringListAppend(key, value);
         }
-        
+
         public void StringListRemove(string key, string value)
         {
             device.StringListRemove(key, value);
         }
-        
+
         public void SetPropertyString(string key, string value)
         {
             device.SetPropertyString(key, value);
         }
-        
+
         public void SetPropertyUInt64(string key, ulong value)
         {
             device.SetProperty(key, value);
@@ -276,38 +276,38 @@ namespace Hal
         {
             device.SetPropertyBoolean(key, value);
         }
-        
+
         public void SetPropertyStringList(string key, string [] value)
         {
             device.SetPropertyStringList(key, value);
         }
-        
+
         public void RemoveProperty(string key)
         {
             device.RemoveProperty(key);
         }
-        
+
         public bool PropertyExists(string key)
         {
             return device.PropertyExists(key);
         }
-        
+
         public void AddCapability(string capability)
         {
             device.AddCapability(capability);
         }
-        
+
         public bool QueryCapability(string capability)
         {
             return device.QueryCapability(capability);
         }
-        
+
         public T CastDevice<T>()
         {
             if(!Bus.System.NameHasOwner("org.freedesktop.Hal")) {
                 throw new ApplicationException("Could not find org.freedesktop.Hal");
             }
-            
+
             return Bus.System.GetObject<T>("org.freedesktop.Hal", new ObjectPath(Udi));
         }
 
@@ -315,82 +315,82 @@ namespace Hal
         {
             return device.GetAllProperties().GetEnumerator();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator()
         {
             return device.GetAllProperties().GetEnumerator();
         }
-        
+
         public bool Equals(Device other)
         {
             return Udi.Equals(other.Udi);
         }
-        
+
         public bool Equals(Device a, Device b)
         {
             return a.Udi.Equals(b.Udi);
         }
-        
+
         public int CompareTo(Device other)
         {
             return Udi.CompareTo(other.Udi);
         }
-        
+
         public int Compare(Device a, Device b)
         {
             return a.Udi.CompareTo(b.Udi);
         }
-        
+
         public int GetHashCode(Device a)
         {
             return a.Udi.GetHashCode();
         }
-        
+
         public override int GetHashCode()
         {
             return Udi.GetHashCode();
         }
-        
+
         public override string ToString()
         {
             return udi;
         }
-        
+
         public string this[string property] {
             get { return PropertyExists(property) ? GetPropertyString(property) : null; }
             set { SetPropertyString(property, value); }
         }
-        
+
         public string Udi {
             get { return udi; }
         }
-        
+
         public bool IsVolume {
             get {
                 if(!PropertyExists("info.interfaces")) {
                     return false;
                 }
-                
+
                 foreach(string @interface in GetPropertyStringList("info.interfaces")) {
                     if(@interface == "org.freedesktop.Hal.Device.Volume") {
                        return true;
                     }
                 }
-                
+
                 return false;
             }
         }
-        
+
         public Volume Volume {
             get { return new Volume(Udi); }
         }
-        
+
         public Device Parent {
             get {
                 if(PropertyExists("info.parent")) {
                     return new Device(this["info.parent"]);
                 }
-                
+
                 return null;
             }
         }
diff --git a/src/Backends/Banshee.Hal/Hal/Manager.cs b/src/Backends/Banshee.Hal/Hal/Manager.cs
index 21b9b8a..64621a1 100644
--- a/src/Backends/Banshee.Hal/Hal/Manager.cs
+++ b/src/Backends/Banshee.Hal/Hal/Manager.cs
@@ -37,95 +37,95 @@ namespace Hal
     internal delegate void DBusDeviceAddedHandler(string udi);
     internal delegate void DBusDeviceRemovedHandler(string udi);
     internal delegate void DBusNewCapabilityHandler(string udi, string capability);
-    
+
     [Interface("org.freedesktop.Hal.Manager")]
-    internal interface IManager 
+    internal interface IManager
     {
         event DBusDeviceAddedHandler DeviceAdded;
         event DBusDeviceRemovedHandler DeviceRemoved;
         event DBusNewCapabilityHandler NewCapability;
-    
+
         string [] GetAllDevices();
         bool DeviceExists(string udi);
         string [] FindDeviceStringMatch(string key, string value);
         string [] FindDeviceByCapability(string capability);
     }
-    
+
     public class DeviceArgs : EventArgs
     {
         private string udi;
-        
+
         public DeviceArgs(string udi)
         {
             this.udi = udi;
         }
-        
+
         public string Udi {
             get { return udi; }
         }
     }
-    
+
     public class DeviceAddedArgs : DeviceArgs
     {
         private Device device;
-        
+
         public DeviceAddedArgs(string udi) : base(udi)
         {
         }
-        
+
         public Device Device {
-            get { 
+            get {
                 if(device == null) {
                     device = new Device(Udi);
                 }
-                
+
                 return device;
             }
         }
     }
-    
+
     public class DeviceRemovedArgs : DeviceArgs
     {
         public DeviceRemovedArgs(string udi) : base(udi)
         {
         }
     }
-    
+
     public class NewCapabilityArgs : DeviceArgs
     {
         private string capability;
-        
+
         public NewCapabilityArgs(string udi, string capability) : base(udi)
         {
             this.capability = capability;
         }
-        
+
         public string Capability {
             get { return capability; }
         }
     }
-    
+
     public delegate void DeviceAddedHandler(object o, DeviceAddedArgs args);
     public delegate void DeviceRemovedHandler(object o, DeviceRemovedArgs args);
     public delegate void NewCapabilityHandler(object o, NewCapabilityArgs args);
-    
+
     public class Manager : IEnumerable<string>
     {
         private IManager manager;
-        
+
         public event DeviceAddedHandler DeviceAdded;
         public event DeviceRemovedHandler DeviceRemoved;
         public event NewCapabilityHandler NewCapability;
-        
+
         public Manager()
         {
             if(!Bus.System.NameHasOwner("org.freedesktop.Hal")) {
                 throw new ApplicationException("Could not find org.freedesktop.Hal");
             }
-            
+
             manager = Bus.System.GetObject<IManager>("org.freedesktop.Hal",
                 new ObjectPath("/org/freedesktop/Hal/Manager"));
-            
+
             if(manager == null) {
                 throw new ApplicationException("The /org/freedesktop/Hal/Manager object could not be located on the DBUs interface org.freedesktop.Hal");
             }
@@ -134,62 +134,62 @@ namespace Hal
             manager.DeviceRemoved += OnDeviceRemoved;
             manager.NewCapability += OnNewCapability;
         }
-        
+
         protected virtual void OnDeviceAdded(string udi)
         {
             if(DeviceAdded != null)
                 DeviceAdded(this, new DeviceAddedArgs(udi));
         }
-        
+
         protected virtual void OnDeviceRemoved(string udi)
         {
             if(DeviceRemoved != null)
                 DeviceRemoved(this, new DeviceRemovedArgs(udi));
         }
-        
+
         protected virtual void OnNewCapability(string udi, string capability)
         {
             if(NewCapability != null)
                 NewCapability(this, new NewCapabilityArgs(udi, capability));
         }
-        
+
         public bool DeviceExists(string udi)
         {
             return manager.DeviceExists(udi);
         }
-        
+
         public string [] FindDeviceByStringMatch(string key, string value)
         {
             return manager.FindDeviceStringMatch(key, value);
         }
-        
+
         public string [] FindDeviceByCapability(string capability)
         {
             return manager.FindDeviceByCapability(capability);
         }
-        
+
         public Device [] FindDeviceByCapabilityAsDevice(string capability)
         {
             return Device.UdisToDevices(FindDeviceByCapability(capability));
         }
-        
+
         public Device [] FindDeviceByStringMatchAsDevice(string key, string value)
         {
             return Device.UdisToDevices(FindDeviceByStringMatch(key, value));
         }
-        
+
         public string [] GetAllDevices()
         {
             return manager.GetAllDevices();
         }
-        
+
         public IEnumerator<string> GetEnumerator()
         {
             foreach(string device in GetAllDevices()) {
                 yield return device;
             }
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator()
         {
             return GetEnumerator();
diff --git a/src/Backends/Banshee.Hal/Hal/Volume.cs b/src/Backends/Banshee.Hal/Hal/Volume.cs
index 380c262..fb0e293 100644
--- a/src/Backends/Banshee.Hal/Hal/Volume.cs
+++ b/src/Backends/Banshee.Hal/Hal/Volume.cs
@@ -41,7 +41,7 @@ namespace Hal
         void Unmount(string [] args);
         void Eject(string [] args);
     }
-    
+
     public class Volume : Device
     {
         public Volume(string udi) : base(udi)
@@ -52,27 +52,27 @@ namespace Hal
         {
             Mount(new string [] { String.Empty });
         }
-        
+
         public void Mount(params string [] args)
         {
             CastDevice<IVolume>().Mount(args);
         }
-        
+
         public void Unmount()
         {
             Unmount(new string [] { String.Empty });
         }
-        
+
         public void Unmount(params string [] args)
         {
             CastDevice<IVolume>().Unmount(args);
         }
-        
+
         public void Eject()
         {
             Eject(new string [] { String.Empty });
         }
-        
+
         public void Eject(params string [] args)
         {
             CastDevice<IVolume>().Eject(args);
diff --git a/src/Backends/Banshee.Hal/Makefile.in b/src/Backends/Banshee.Hal/Makefile.in
index 21e6595..4a3b4b1 100644
--- a/src/Backends/Banshee.Hal/Makefile.in
+++ b/src/Backends/Banshee.Hal/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -381,6 +390,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -484,11 +494,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -506,6 +517,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -535,6 +547,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -554,14 +567,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.Hal/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.Hal/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.Hal/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.Hal/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -579,25 +592,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -627,13 +656,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -665,6 +698,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -685,6 +719,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -693,18 +729,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -765,7 +811,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -782,6 +828,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.NowPlaying.X11/Banshee.NowPlaying.X11/FullscreenAdapter.cs b/src/Backends/Banshee.NowPlaying.X11/Banshee.NowPlaying.X11/FullscreenAdapter.cs
index 686a289..a0d6267 100644
--- a/src/Backends/Banshee.NowPlaying.X11/Banshee.NowPlaying.X11/FullscreenAdapter.cs
+++ b/src/Backends/Banshee.NowPlaying.X11/Banshee.NowPlaying.X11/FullscreenAdapter.cs
@@ -41,44 +41,44 @@ namespace Banshee.NowPlaying.X11
         {
             [DllImport ("libbnpx11")]
             private static extern IntPtr bacon_resize_get_type ();
-    
+
             public static new GLib.GType GType {
                 get { return new GLib.GType (bacon_resize_get_type ()); }
             }
-        
+
             public BaconResize (Gtk.Window window) : base (IntPtr.Zero)
             {
                 this.window = window;
-                
+
                 GLib.Value window_val = new GLib.Value (window);
                 CreateNativeObject (
-                    new string [] { "video-widget" }, 
+                    new string [] { "video-widget" },
                     new GLib.Value [] { window_val }
                 );
                 window_val.Dispose ();
             }
-            
+
             private Window window;
             public Window Window {
                 get { return window; }
             }
-            
+
             [DllImport ("libbnpx11")]
             private static extern void bacon_resize_resize (IntPtr handle);
-            
+
             public void Resize ()
             {
                 bacon_resize_resize (Handle);
             }
-            
+
             [DllImport ("libbnpx11")]
             private static extern void bacon_resize_restore (IntPtr handle);
-            
+
             public void Restore ()
             {
                 bacon_resize_restore (Handle);
             }
-            
+
             [GLib.Property ("have-xvidmode")]
             public bool HaveXVidMode {
                 get {
@@ -89,9 +89,9 @@ namespace Banshee.NowPlaying.X11
                 }
             }
         }
-        
+
         private BaconResize resize;
-        
+
         public void Fullscreen (Window window, bool fullscreen)
         {
             // Create the Bacon X11 Resizer if we haven't before or the window changes
@@ -99,30 +99,30 @@ namespace Banshee.NowPlaying.X11
                 if (resize != null) {
                     resize.Dispose ();
                 }
-                
+
                 resize = new BaconResize (window);
                 Log.DebugFormat ("X11 Fullscreen Window Set (HaveXVidMode = {0})", resize.HaveXVidMode);
             }
-            
+
             // Do the default GTK fullscreen operation
             if (fullscreen) {
                 window.Fullscreen ();
             } else {
                 window.Unfullscreen ();
             }
-            
+
             // Skip if we don't support xvidmode, otherwise do the good resizing
             if (!resize.HaveXVidMode) {
                 return;
             }
-            
+
             if (fullscreen) {
                 resize.Resize ();
             } else {
                 resize.Restore ();
             }
         }
-        
+
         public void Dispose ()
         {
             if (resize != null) {
diff --git a/src/Backends/Banshee.NowPlaying.X11/Makefile.in b/src/Backends/Banshee.NowPlaying.X11/Makefile.in
index 5538e5e..705e0ce 100644
--- a/src/Backends/Banshee.NowPlaying.X11/Makefile.in
+++ b/src/Backends/Banshee.NowPlaying.X11/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -86,10 +110,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -151,6 +203,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -170,6 +224,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -183,29 +239,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -381,6 +418,7 @@ RESOURCES = Banshee.NowPlaying.X11.addin.xml
 @HAVE_XVIDMODE_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @HAVE_XVIDMODE_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @HAVE_XVIDMODE_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at HAVE_XVIDMODE_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @HAVE_XVIDMODE_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @HAVE_XVIDMODE_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @HAVE_XVIDMODE_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -484,11 +522,12 @@ RESOURCES = Banshee.NowPlaying.X11.addin.xml
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at HAVE_XVIDMODE_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at HAVE_XVIDMODE_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at HAVE_XVIDMODE_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_XVIDMODE_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @HAVE_XVIDMODE_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -506,6 +545,7 @@ RESOURCES = Banshee.NowPlaying.X11.addin.xml
 @HAVE_XVIDMODE_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at HAVE_XVIDMODE_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @HAVE_XVIDMODE_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @HAVE_XVIDMODE_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @HAVE_XVIDMODE_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -536,6 +576,7 @@ RESOURCES = Banshee.NowPlaying.X11.addin.xml
 @HAVE_XVIDMODE_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @HAVE_XVIDMODE_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@HAVE_XVIDMODE_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@HAVE_XVIDMODE_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @HAVE_XVIDMODE_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @HAVE_XVIDMODE_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @HAVE_XVIDMODE_TRUE at OUTPUT_FILES = \
@@ -556,14 +597,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.NowPlaying.X11/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.NowPlaying.X11/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.NowPlaying.X11/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.NowPlaying.X11/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -581,25 +622,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -631,7 +688,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -665,16 +722,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -682,14 +739,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -701,7 +758,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -710,29 +767,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -753,29 +815,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -809,6 +886,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -831,6 +909,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -839,18 +919,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -871,8 +961,8 @@ ps-am:
 
 uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -914,7 +1004,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_XVIDMODE_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @HAVE_XVIDMODE_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @HAVE_XVIDMODE_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at HAVE_XVIDMODE_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at HAVE_XVIDMODE_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @HAVE_XVIDMODE_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @HAVE_XVIDMODE_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @HAVE_XVIDMODE_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -931,6 +1021,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @HAVE_XVIDMODE_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @HAVE_XVIDMODE_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile.in b/src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile.in
index 7fea9bb..c123a75 100644
--- a/src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile.in
+++ b/src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -52,6 +54,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -71,14 +74,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(bnpx11dir)"
-bnpx11LTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(bnpx11_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 @HAVE_XVIDMODE_TRUE at libbnpx11_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@@ -94,6 +112,7 @@ libbnpx11_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
+am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -170,6 +189,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -189,6 +210,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -202,29 +225,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -391,14 +395,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.NowPlaying.X11/libbnpx11/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -416,23 +420,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-bnpx11LTLIBRARIES: $(bnpx11_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
 	test -z "$(bnpx11dir)" || $(MKDIR_P) "$(DESTDIR)$(bnpx11dir)"
-	@list='$(bnpx11_LTLIBRARIES)'; for p in $$list; do \
+	@list='$(bnpx11_LTLIBRARIES)'; test -n "$(bnpx11dir)" || list=; \
+	list2=; for p in $$list; do \
 	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(bnpx11LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(bnpx11dir)/$$f'"; \
-	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(bnpx11LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(bnpx11dir)/$$f"; \
+	    list2="$$list2 $$p"; \
 	  else :; fi; \
-	done
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bnpx11dir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bnpx11dir)"; \
+	}
 
 uninstall-bnpx11LTLIBRARIES:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bnpx11_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bnpx11dir)/$$p'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bnpx11dir)/$$p"; \
+	@list='$(bnpx11_LTLIBRARIES)'; test -n "$(bnpx11dir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bnpx11dir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bnpx11dir)/$$f"; \
 	done
 
 clean-bnpx11LTLIBRARIES:
@@ -456,31 +465,31 @@ distclean-compile:
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c $<
 
 .c.obj:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .c.lo:
 @am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
 libbnpx11_la-bacon-resize.lo: bacon-resize.c
- at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbnpx11_la_CFLAGS) $(CFLAGS) -MT libbnpx11_la-bacon-resize.lo -MD -MP -MF $(DEPDIR)/libbnpx11_la-bacon-resize.Tpo -c -o libbnpx11_la-bacon-resize.lo `test -f 'bacon-resize.c' || echo '$(srcdir)/'`bacon-resize.c
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/libbnpx11_la-bacon-resize.Tpo $(DEPDIR)/libbnpx11_la-bacon-resize.Plo
+ at am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbnpx11_la_CFLAGS) $(CFLAGS) -MT libbnpx11_la-bacon-resize.lo -MD -MP -MF $(DEPDIR)/libbnpx11_la-bacon-resize.Tpo -c -o libbnpx11_la-bacon-resize.lo `test -f 'bacon-resize.c' || echo '$(srcdir)/'`bacon-resize.c
+ at am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libbnpx11_la-bacon-resize.Tpo $(DEPDIR)/libbnpx11_la-bacon-resize.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bacon-resize.c' object='libbnpx11_la-bacon-resize.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbnpx11_la_CFLAGS) $(CFLAGS) -c -o libbnpx11_la-bacon-resize.lo `test -f 'bacon-resize.c' || echo '$(srcdir)/'`bacon-resize.c
+ at am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbnpx11_la_CFLAGS) $(CFLAGS) -c -o libbnpx11_la-bacon-resize.lo `test -f 'bacon-resize.c' || echo '$(srcdir)/'`bacon-resize.c
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -493,14 +502,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
@@ -508,29 +517,34 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -551,13 +565,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -589,6 +607,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -611,6 +630,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -619,18 +640,28 @@ install-data-am: install-bnpx11LTLIBRARIES
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -676,6 +707,7 @@ uninstall-am: uninstall-bnpx11LTLIBRARIES
 @HAVE_XVIDMODE_TRUE@$(top_builddir)/bin/libbnpx11.so: libbnpx11.la
 @HAVE_XVIDMODE_TRUE@	mkdir -p $(top_builddir)/bin
 @HAVE_XVIDMODE_TRUE@	cp -f .libs/libbnpx11.so $@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.Osx/Banshee.OsxBackend/HardwareManager.cs b/src/Backends/Banshee.Osx/Banshee.OsxBackend/HardwareManager.cs
index 384cb3d..054ba57 100644
--- a/src/Backends/Banshee.Osx/Banshee.OsxBackend/HardwareManager.cs
+++ b/src/Backends/Banshee.Osx/Banshee.OsxBackend/HardwareManager.cs
@@ -38,7 +38,7 @@ namespace Banshee.OsxBackend
     {
         public event DeviceAddedHandler DeviceAdded;
         public event DeviceRemovedHandler DeviceRemoved;
- 
+
         public void Dispose ()
         {
         }
@@ -47,22 +47,22 @@ namespace Banshee.OsxBackend
         {
             yield break;
         }
-        
+
         private IEnumerable<T> GetAllBlockDevices<T> () where T : IBlockDevice
         {
             yield break;
         }
-        
+
         public IEnumerable<IBlockDevice> GetAllBlockDevices ()
         {
             return GetAllBlockDevices<IBlockDevice> ();
         }
-        
+
         public IEnumerable<ICdromDevice> GetAllCdromDevices ()
         {
             return GetAllBlockDevices<ICdromDevice> ();
         }
-        
+
         public IEnumerable<IDiskDevice> GetAllDiskDevices ()
         {
             return GetAllBlockDevices<IDiskDevice> ();
diff --git a/src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs b/src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs
index 127bde7..84351ed 100644
--- a/src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs
+++ b/src/Backends/Banshee.Osx/Banshee.OsxBackend/OsxService.cs
@@ -44,37 +44,37 @@ namespace Banshee.OsxBackend
         private InterfaceActionService interface_action_service;
         private uint ui_manager_id;
         private bool disposed;
-        
+
         void IExtensionService.Initialize ()
         {
             elements_service = ServiceManager.Get<GtkElementsService> ();
             interface_action_service = ServiceManager.Get<InterfaceActionService> ();
-            
+
             if (!ServiceStartup ()) {
                 ServiceManager.ServiceStarted += OnServiceStarted;
             }
         }
 
-        private void OnServiceStarted (ServiceStartedArgs args) 
+        private void OnServiceStarted (ServiceStartedArgs args)
         {
             if (args.Service is Banshee.Gui.InterfaceActionService) {
                 interface_action_service = (InterfaceActionService)args.Service;
             } else if (args.Service is GtkElementsService) {
                 elements_service = (GtkElementsService)args.Service;
             }
-                    
+
             ServiceStartup ();
         }
-        
+
         private bool ServiceStartup ()
         {
             if (elements_service == null || interface_action_service == null) {
                 return false;
             }
-            
+
             Initialize ();
             ServiceManager.ServiceStarted -= OnServiceStarted;
-            
+
             return true;
         }
 
@@ -89,12 +89,12 @@ namespace Banshee.OsxBackend
             });
 
             // merge close menu item
-            ui_manager_id = interface_action_service.UIManager.AddUiFromResource ("osx-ui-actions-layout.xml");      
+            ui_manager_id = interface_action_service.UIManager.AddUiFromResource ("osx-ui-actions-layout.xml");
             RegisterCloseHandler ();
 
             elements_service.PrimaryWindow.WindowStateEvent += WindowStateHandler;
-            
-            // bind gtk menu to global osx menu 
+
+            // bind gtk menu to global osx menu
             BindMenuBar ();
 
             // make menu more osx-like
@@ -105,7 +105,7 @@ namespace Banshee.OsxBackend
             doc.Clicked += OnDockClicked;
             doc.QuitActivate += OnDockQuitActivated;
         }
-        
+
         public void Dispose ()
         {
             if (disposed) {
@@ -113,30 +113,30 @@ namespace Banshee.OsxBackend
             }
 
             elements_service.PrimaryWindowClose = null;
-            
+
             interface_action_service.GlobalActions.Remove ("CloseAction");
             interface_action_service.UIManager.RemoveUi (ui_manager_id);
-        
+
             disposed = true;
         }
-        
+
         string IService.ServiceName {
             get { return "OsxService"; }
         }
 
-        private void OnDockClicked (object o, System.EventArgs args) 
+        private void OnDockClicked (object o, System.EventArgs args)
         {
             SetWindowVisibility (true);
         }
 
-        private void OnDockQuitActivated (object o, System.EventArgs args) 
+        private void OnDockQuitActivated (object o, System.EventArgs args)
         {
-            // FIXME: disabled due to issue with intermitant throwing of exception 
+            // FIXME: disabled due to issue with intermitant throwing of exception
             // while quitting via the dock item.. need to figure out where exactly
             // the issue is..
             //Banshee.ServiceStack.Application.Shutdown ();
         }
-        
+
         private void BindMenuBar ()
         {
             UIManager ui = interface_action_service.UIManager;
@@ -144,8 +144,8 @@ namespace Banshee.OsxBackend
             // retreive and hide the gtk menu
             MenuShell menu = (MenuShell) ui.GetWidget ("/MainMenu");
             menu.Hide ();
-            
-            // bind menu 
+
+            // bind menu
             IgeMacMenu.MenuBar = menu;
         }
 
@@ -160,7 +160,7 @@ namespace Banshee.OsxBackend
             IgeMacMenuGroup prefs_group = IgeMacMenu.AddAppMenuGroup ();
 
             IgeMacMenu.QuitMenuItem = quit_item;
-            
+
             about_group.AddMenuItem (about_item, null);
             prefs_group.AddMenuItem (prefs_item, null);
         }
@@ -171,7 +171,7 @@ namespace Banshee.OsxBackend
                 elements_service.PrimaryWindowClose = OnPrimaryWindowClose;
             }
         }
-        
+
         private bool OnPrimaryWindowClose ()
         {
             CloseWindow (null, null);
diff --git a/src/Backends/Banshee.Osx/Makefile.in b/src/Backends/Banshee.Osx/Makefile.in
index b3c2be0..4793ec9 100644
--- a/src/Backends/Banshee.Osx/Makefile.in
+++ b/src/Backends/Banshee.Osx/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -374,6 +383,7 @@ RESOURCES = \
 @ENABLE_OSX_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_OSX_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_OSX_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_OSX_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_OSX_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_OSX_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_OSX_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -477,11 +487,12 @@ RESOURCES = \
 @ENABLE_OSX_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_OSX_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_OSX_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_OSX_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_OSX_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_OSX_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -499,6 +510,7 @@ RESOURCES = \
 @ENABLE_OSX_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_OSX_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_OSX_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_OSX_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_OSX_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -528,6 +540,7 @@ RESOURCES = \
 @ENABLE_OSX_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_OSX_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_OSX_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_OSX_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_OSX_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_OSX_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_OSX_TRUE at OUTPUT_FILES = \
@@ -549,14 +562,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.Osx/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.Osx/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.Osx/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.Osx/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -574,25 +587,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -622,13 +651,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -660,6 +693,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -682,6 +716,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -690,18 +726,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -762,7 +808,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_OSX_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_OSX_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_OSX_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_OSX_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_OSX_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_OSX_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_OSX_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_OSX_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -779,6 +825,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_OSX_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_OSX_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Banshee.Unix/Banshee.IO.Unix/DemuxVfs.cs b/src/Backends/Banshee.Unix/Banshee.IO.Unix/DemuxVfs.cs
index 25e7047..5da1e57 100644
--- a/src/Backends/Banshee.Unix/Banshee.IO.Unix/DemuxVfs.cs
+++ b/src/Backends/Banshee.Unix/Banshee.IO.Unix/DemuxVfs.cs
@@ -36,35 +36,35 @@ using Banshee.Base;
 namespace Banshee.IO.Unix
 {
     public class DemuxVfs : IDemuxVfs
-    {   
+    {
         private UnixFileInfo file_info;
-        
+
         public DemuxVfs (string path)
         {
             file_info = new UnixFileInfo (path);
         }
-        
+
         public void CloseStream (Stream stream)
         {
             stream.Close ();
         }
-        
-        public string Name { 
+
+        public string Name {
             get { return file_info.FullName; }
         }
-        
+
         public Stream ReadStream {
             get { return file_info.Open (FileMode.Open, FileAccess.Read); }
         }
-        
+
         public Stream WriteStream {
             get { return file_info.Open (FileMode.Open, FileAccess.ReadWrite); }
         }
-   
+
         public bool IsReadable {
             get { return file_info.CanAccess (AccessModes.R_OK); }
         }
-   
+
         public bool IsWritable {
             get { return file_info.CanAccess (AccessModes.W_OK); }
         }
diff --git a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
index 65359ce..fcfefc0 100644
--- a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
+++ b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
@@ -40,17 +40,17 @@ namespace Banshee.IO.Unix
     {
         [System.Runtime.InteropServices.DllImport ("libglib-2.0-0.dll")]
         private static extern int g_mkdir_with_parents (IntPtr path, int mode);
-    
+
         public void Create (string directory)
         {
             IntPtr path_ptr = IntPtr.Zero;
-            
+
             try {
                 path_ptr = GLib.Marshaller.StringToPtrGStrdup (directory);
                 if (path_ptr == IntPtr.Zero) {
                     throw new Exception ("Failed to allocate native directory string");
                 }
-            
+
                 // 493 == 0755 - C# doesn't do octal literals
                 if (g_mkdir_with_parents (path_ptr, 493) == -1) {
                     Mono.Unix.UnixMarshal.ThrowExceptionForLastError ();
@@ -64,18 +64,18 @@ namespace Banshee.IO.Unix
                 }
             }
         }
-        
+
         public void Delete (string directory)
         {
             Delete (directory, false);
         }
-        
+
         public void Delete (string directory, bool recursive)
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
             unix_dir.Delete (recursive);
         }
-        
+
         public bool Exists (string directory)
         {
             try {
@@ -85,7 +85,7 @@ namespace Banshee.IO.Unix
                 return false;
             }
         }
-        
+
         public IEnumerable<string> GetFiles (string directory)
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
@@ -95,7 +95,7 @@ namespace Banshee.IO.Unix
                 }
             }
         }
-        
+
         public IEnumerable<string> GetDirectories (string directory)
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
@@ -105,7 +105,7 @@ namespace Banshee.IO.Unix
                 }
             }
         }
-        
+
         public void Move (SafeUri from, SafeUri to)
         {
             Mono.Unix.Native.Stdlib.rename (from.LocalPath, to.LocalPath);
diff --git a/src/Backends/Banshee.Unix/Banshee.IO.Unix/File.cs b/src/Backends/Banshee.Unix/Banshee.IO.Unix/File.cs
index cbbb1f7..da64d13 100644
--- a/src/Backends/Banshee.Unix/Banshee.IO.Unix/File.cs
+++ b/src/Backends/Banshee.Unix/Banshee.IO.Unix/File.cs
@@ -41,7 +41,7 @@ namespace Banshee.IO.Unix
         private bool is_directory;
         private bool is_regular_file;
         private long mtime;
-        
+
         internal FileStat (string path)
         {
             buf = new Stat ();
@@ -52,11 +52,11 @@ namespace Banshee.IO.Unix
             is_directory &= ! ((buf.st_mode & FilePermissions.S_IFSOCK) == FilePermissions.S_IFSOCK);
             mtime = buf.st_mtime;
         }
-        
+
         internal bool IsDirectory {
             get { return is_directory; }
         }
-        
+
         internal bool IsRegularFile {
             get { return is_regular_file; }
         }
@@ -89,19 +89,19 @@ namespace Banshee.IO.Unix
         {
             System.IO.File.Copy (from.LocalPath, to.LocalPath, overwrite);
         }
-        
+
         public Stream OpenRead (SafeUri uri)
         {
             return new UnixFileInfo (uri.LocalPath).OpenRead ();
         }
-        
+
         public Stream OpenWrite (SafeUri uri, bool overwrite)
         {
-            return overwrite 
+            return overwrite
                 ? new UnixFileInfo (uri.LocalPath).Open (FileMode.Create, FileAccess.ReadWrite, FilePermissions.DEFFILEMODE)
                 : new UnixFileInfo (uri.LocalPath).OpenWrite ();
         }
-        
+
         public long GetSize (SafeUri uri)
         {
             try {
diff --git a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Provider.cs b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Provider.cs
index 1671663..9c19653 100644
--- a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Provider.cs
+++ b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Provider.cs
@@ -32,7 +32,7 @@ namespace Banshee.IO.Unix
 {
     public class Provider : Banshee.IO.IProvider
     {
-    	public Type FileProvider { 
+    	public Type FileProvider {
     	    get { return typeof (File); }
     	}
 
@@ -43,5 +43,7 @@ namespace Banshee.IO.Unix
     	public Type DemuxVfsProvider {
     	    get { return typeof (DemuxVfs); }
     	}
+
+        public bool LocalOnly { get { return true; } }
     }
 }
diff --git a/src/Backends/Banshee.Unix/Makefile.in b/src/Backends/Banshee.Unix/Makefile.in
index 409396c..26349ea 100644
--- a/src/Backends/Banshee.Unix/Makefile.in
+++ b/src/Backends/Banshee.Unix/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -373,6 +382,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -476,11 +486,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -498,6 +509,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -527,6 +539,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -547,14 +560,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Banshee.Unix/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Banshee.Unix/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Banshee.Unix/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Banshee.Unix/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -572,25 +585,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -620,13 +649,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -658,6 +691,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -678,6 +712,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -686,18 +722,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -758,7 +804,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -775,6 +821,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Backends/Makefile.am b/src/Backends/Makefile.am
index 0cc38e8..c7859a3 100644
--- a/src/Backends/Makefile.am
+++ b/src/Backends/Makefile.am
@@ -1,5 +1,6 @@
 SUBDIRS = \
 	Banshee.Hal \
+	Banshee.Gio \
 	Banshee.Gnome \
 	Banshee.GStreamer \
 	Banshee.Unix \
diff --git a/src/Backends/Makefile.in b/src/Backends/Makefile.in
index d02af45..77719af 100644
--- a/src/Backends/Makefile.in
+++ b/src/Backends/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -348,6 +365,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 SUBDIRS = \
 	Banshee.Hal \
+	Banshee.Gio \
 	Banshee.Gnome \
 	Banshee.GStreamer \
 	Banshee.Unix \
@@ -362,14 +380,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Backends/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Backends/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Backends/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Backends/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -387,6 +405,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -418,7 +437,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -452,16 +471,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -469,14 +488,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -488,7 +507,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -497,29 +516,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -540,29 +564,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -592,6 +631,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -611,6 +651,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -619,18 +661,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -651,8 +703,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -668,6 +720,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Beroe/Beroe/IndexerClient.cs b/src/Clients/Beroe/Beroe/IndexerClient.cs
index b3b5f7a..f4c0430 100644
--- a/src/Clients/Beroe/Beroe/IndexerClient.cs
+++ b/src/Clients/Beroe/Beroe/IndexerClient.cs
@@ -61,20 +61,20 @@ namespace Beroe
                 Log.Error ("Another indexer is already running");
                 return;
             }
-            
+
             Log.Information ("Indexer client started");
-            
+
             Startup ();
         }
-        
+
         private static void ActAsRemoteClient ()
         {
         }
-        
+
         private static void Startup ()
         {
             ThreadAssist.InitializeMainThread ();
-            
+
             ServiceManager.Initialize ();
             ServiceManager.RegisterService<DBusServiceManager> ();
             ServiceManager.RegisterService<BansheeDbConnection> ();
@@ -83,32 +83,32 @@ namespace Beroe
             ServiceManager.RegisterService<CollectionIndexerService> ();
             ServiceManager.RegisterService<IndexerClient> ();
             ServiceManager.Run ();
-            
+
             ServiceManager.Get<IndexerClient> ().Run ();
         }
-        
+
         private string [] reboot_args;
-        
+
         public void Run ()
         {
             ServiceManager.Get<CollectionIndexerService> ().ShutdownHandler = DBusConnection.QuitMainLoop;
-        
+
             ServiceManager.SourceManager.AddSource (new Banshee.Library.MusicLibrarySource ());
             ServiceManager.SourceManager.AddSource (new Banshee.Library.VideoLibrarySource ());
-            
+
             DBusConnection.RunMainLoop ();
-            
+
             ServiceManager.Shutdown ();
-            
+
             if (reboot_args != null) {
                 Log.Debug ("Rebooting");
-                
+
                 System.Text.StringBuilder builder = new System.Text.StringBuilder ();
                 foreach (string arg in reboot_args) {
                     builder.AppendFormat ("\"{0}\" ", arg);
                 }
-                
-                // FIXME: Using Process.Start sucks, but DBus doesn't let you specify 
+
+                // FIXME: Using Process.Start sucks, but DBus doesn't let you specify
                 // extra command line arguments
                 DBusConnection.Disconnect ("CollectionIndexer");
                 Process.Start ("banshee-1", builder.ToString ());
@@ -116,12 +116,12 @@ namespace Beroe
                 // Bus.Session.Iterate ();
             }
         }
-        
+
         public void Hello ()
         {
             Log.Debug ("Received a Hello over DBus");
         }
-        
+
         public void RebootWhenFinished (string [] args)
         {
             lock (this) {
@@ -134,11 +134,11 @@ namespace Beroe
                 });
             }
         }
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string IService.ServiceName {
             get { return "IndexerClient"; }
         }
diff --git a/src/Clients/Beroe/Makefile.in b/src/Clients/Beroe/Makefile.in
index 075bf33..af52676 100644
--- a/src/Clients/Beroe/Makefile.in
+++ b/src/Clients/Beroe/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -366,6 +375,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -469,11 +479,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -491,6 +502,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -520,6 +532,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -539,14 +552,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Beroe/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Beroe/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Beroe/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Beroe/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -564,25 +577,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -612,13 +641,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -650,6 +683,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -670,6 +704,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -678,18 +714,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -750,7 +796,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -767,6 +813,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Booter/Booter/Entry.cs b/src/Clients/Booter/Booter/Entry.cs
index 2730081..c788f45 100644
--- a/src/Clients/Booter/Booter/Entry.cs
+++ b/src/Clients/Booter/Booter/Entry.cs
@@ -76,10 +76,10 @@ namespace Booter
             if (CheckHelpVersion ()) {
                 return;
             }
-            
+
             if (DBusConnection.ApplicationInstanceAlreadyRunning) {
                 // DBus Command/Query/File Proxy Client
-                BootClient ("Halie"); 
+                BootClient ("Halie");
                 NotifyStartupComplete ();
             } else if (DBusConnection.NameHasOwner ("CollectionIndexer")) {
                 // Tell the existing indexer to start Banshee when it's done
@@ -100,19 +100,19 @@ namespace Booter
                 BootClient ("Nereid");
             }
         }
-        
+
         private static void BootClient (string clientName)
         {
             AppDomain.CurrentDomain.ExecuteAssembly (Path.Combine (Path.GetDirectoryName (
                 Assembly.GetEntryAssembly ().Location), String.Format ("{0}.exe", clientName)));
         }
-        
+
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern bool gdk_init_check (IntPtr argc, IntPtr argv);
-        
+
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern void gdk_notify_startup_complete ();
-        
+
         private static void NotifyStartupComplete ()
         {
             try {
@@ -133,15 +133,15 @@ namespace Booter
                 ShowVersion ();
                 return true;
             }
-            
+
             return false;
         }
-        
+
         private static void ShowHelp ()
         {
             Console.WriteLine ("Usage: {0} [options...] [files|URIs...]", "banshee-1");
             Console.WriteLine ();
-            
+
             Layout commands = new Layout (
                 new LayoutGroup ("help", Catalog.GetString ("Help Options"),
                     new LayoutOption ("help", Catalog.GetString ("Show this help")),
@@ -153,7 +153,7 @@ namespace Booter
                     new LayoutOption ("help-all", Catalog.GetString ("Show all option groups")),
                     new LayoutOption ("version", Catalog.GetString ("Show version information"))
                 ),
-                
+
                 new LayoutGroup ("playback", Catalog.GetString ("Playback Control Options"),
                     new LayoutOption ("next", Catalog.GetString ("Play the next track, optionally restarting if the 'restart' value is set")),
                     new LayoutOption ("previous", Catalog.GetString ("Play the previous track, optionally restarting if the 'restart value is set")),
@@ -167,7 +167,7 @@ namespace Booter
                     new LayoutOption ("set-volume=LEVEL", Catalog.GetString ("Set the playback volume (0-100)")),
                     new LayoutOption ("set-position=POS", Catalog.GetString ("Seek to a specific point (seconds, float)"))
                 ),
-                
+
                 new LayoutGroup ("query-player", Catalog.GetString ("Player Engine Query Options"),
                     new LayoutOption ("query-current-state", Catalog.GetString ("Current player state")),
                     new LayoutOption ("query-last-state", Catalog.GetString ("Last player state")),
@@ -176,7 +176,7 @@ namespace Booter
                     new LayoutOption ("query-volume", Catalog.GetString ("Player volume")),
                     new LayoutOption ("query-position", Catalog.GetString ("Player position in currently playing track"))
                 ),
-                
+
                 new LayoutGroup ("query-track", Catalog.GetString ("Playing Track Metadata Query Options"),
                     new LayoutOption ("query-uri", Catalog.GetString ("URI")),
                     new LayoutOption ("query-artist", Catalog.GetString ("Artist Name")),
@@ -191,36 +191,36 @@ namespace Booter
                     new LayoutOption ("query-score", Catalog.GetString ("Score")),
                     new LayoutOption ("query-bit-rate", Catalog.GetString ("Bit Rate"))
                 ),
-                
+
                 new LayoutGroup ("ui", Catalog.GetString ("User Interface Options"),
                     new LayoutOption ("show|--present", Catalog.GetString ("Present the user interface on the active workspace")),
                     new LayoutOption ("hide", Catalog.GetString ("Hide the user interface")),
                     new LayoutOption ("no-present", Catalog.GetString ("Do not present the user interface, regardless of any other options"))
                 ),
-                
-                new LayoutGroup ("debugging", Catalog.GetString ("Debugging and Development Options"), 
+
+                new LayoutGroup ("debugging", Catalog.GetString ("Debugging and Development Options"),
                     new LayoutOption ("debug", Catalog.GetString ("Enable general debugging features")),
                     new LayoutOption ("debug-sql", Catalog.GetString ("Enable debugging output of SQL queries")),
                     new LayoutOption ("debug-addins", Catalog.GetString ("Enable debugging output of Mono.Addins")),
                     new LayoutOption ("db=FILE", Catalog.GetString ("Specify an alternate database to use")),
                     new LayoutOption ("gconf-base-key=KEY", Catalog.GetString ("Specify an alternate key, default is /apps/banshee-1/")),
-                    new LayoutOption ("uninstalled", Catalog.GetString ("Optimize instance for running uninstalled; " + 
+                    new LayoutOption ("uninstalled", Catalog.GetString ("Optimize instance for running uninstalled; " +
                         "most notably, this will create an alternate Mono.Addins database in the working directory")),
                     new LayoutOption ("disable-dbus", Catalog.GetString ("Disable DBus support completely")),
                     new LayoutOption ("no-gtkrc", String.Format (Catalog.GetString (
-                        "Skip loading a custom gtkrc file ({0}) if it exists"), 
+                        "Skip loading a custom gtkrc file ({0}) if it exists"),
                         Path.Combine (Paths.ApplicationData, "gtkrc").Replace (
                             Environment.GetFolderPath (Environment.SpecialFolder.Personal), "~")))
                 )
             );
-            
+
             if (ApplicationContext.CommandLine.Contains ("help-all")) {
                 Console.WriteLine (commands);
                 return;
             }
-            
+
             List<string> errors = null;
-            
+
             foreach (KeyValuePair<string, string> argument in ApplicationContext.CommandLine.Arguments) {
                 switch (argument.Key) {
                     case "help": Console.WriteLine (commands.ToString ("help")); break;
@@ -236,14 +236,14 @@ namespace Booter
                         break;
                 }
             }
-            
+
             if (errors != null) {
                 Console.WriteLine (commands.LayoutLine (String.Format (Catalog.GetString (
                     "The following help arguments are invalid: {0}"),
                     Hyena.Collections.CollectionExtensions.Join (errors, "--", null, ", "))));
             }
         }
-        
+
         private static void ShowVersion ()
         {
             Console.WriteLine ("Banshee {0} ({1}) http://banshee-project.org", Application.DisplayVersion, Application.Version);
diff --git a/src/Clients/Booter/Makefile.in b/src/Clients/Booter/Makefile.in
index 490cfe6..2581da0 100644
--- a/src/Clients/Booter/Makefile.in
+++ b/src/Clients/Booter/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -55,6 +57,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -74,9 +77,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = banshee-1
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(bin_SCRIPTS) $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -141,6 +164,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -160,6 +185,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -173,29 +200,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -368,6 +376,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -471,11 +480,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -493,6 +503,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -522,6 +533,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -543,14 +555,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Booter/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Booter/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Booter/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Booter/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -568,46 +580,77 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 banshee-1: $(top_builddir)/config.status $(srcdir)/banshee-1.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -637,13 +680,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -675,6 +722,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -695,6 +743,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -703,20 +753,29 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
-
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -779,7 +838,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -799,6 +858,7 @@ uninstall-local: $(THEME_ICONS_SOURCE)
 
 install-exec-hook:
 	$(LN_S) -f banshee-1 $(DESTDIR)$(bindir)/muinshee
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Halie/Halie/Client.cs b/src/Clients/Halie/Halie/Client.cs
index 47b110d..1bfd8fb 100644
--- a/src/Clients/Halie/Halie/Client.cs
+++ b/src/Clients/Halie/Halie/Client.cs
@@ -52,16 +52,16 @@ namespace Halie
             void Present ();
             void Hide ();
         }
-        
+
         private static bool hide_field;
         private static DBusCommandService command;
-    
+
         public static void Main ()
         {
             if (!DBusConnection.ConnectTried) {
                 DBusConnection.Connect ();
             }
-            
+
             if (!DBusConnection.Enabled) {
                 Error ("All commands ignored, DBus support is disabled");
                 return;
@@ -69,22 +69,22 @@ namespace Halie
                 Error ("Banshee does not seem to be running");
                 return;
             }
-            
+
             command = DBusServiceManager.FindInstance<DBusCommandService> ("/DBusCommandService");
             hide_field = ApplicationContext.CommandLine.Contains ("hide-field");
-            
+
             bool present = HandlePlayerCommands () && !ApplicationContext.CommandLine.Contains ("indexer");
             HandleWindowCommands (present);
             HandleFiles ();
         }
-        
+
         private static void HandleWindowCommands (bool present)
         {
             IClientWindow window = DBusServiceManager.FindInstance<IClientWindow> ("/ClientWindow");
             if (window == null) {
                 return;
             }
-            
+
             foreach (KeyValuePair<string, string> arg in ApplicationContext.CommandLine.Arguments) {
                 switch (arg.Key) {
                     case "show":
@@ -95,12 +95,12 @@ namespace Halie
                         break;
                 }
             }
-            
+
             if (present && !ApplicationContext.CommandLine.Contains ("no-present")) {
                 window.Present ();
             }
         }
-        
+
         private static void HandleFiles ()
         {
             foreach (string file in ApplicationContext.CommandLine.Files) {
@@ -112,14 +112,14 @@ namespace Halie
                 }
             }
         }
-        
+
         private static bool HandlePlayerCommands ()
         {
             IPlayerEngineService player = DBusServiceManager.FindInstance<IPlayerEngineService> ("/PlayerEngine");
             IPlaybackControllerService controller = DBusServiceManager.FindInstance<IPlaybackControllerService> ("/PlaybackController");
             IDictionary<string, object> track = null;
             int handled_count = 0;
-            
+
             foreach (KeyValuePair<string, string> arg in ApplicationContext.CommandLine.Arguments) {
                 handled_count++;
                 switch (arg.Key) {
@@ -128,12 +128,12 @@ namespace Halie
                     case "pause":          player.Pause ();         break;
                     case "stop":           player.Close ();         break;
                     case "toggle-playing": player.TogglePlaying (); break;
-                    
+
                     // For the playback controller
                     case "first":    controller.First ();                                    break;
                     case "next":     controller.Next (ParseBool (arg.Value, "restart"));     break;
                     case "previous": controller.Previous (ParseBool (arg.Value, "restart")); break;
-                    case "stop-when-finished": 
+                    case "stop-when-finished":
                         controller.StopWhenFinished = !ParseBool (arg.Value);
                         break;
                     case "set-position":
@@ -158,10 +158,10 @@ namespace Halie
                         break;
                 }
             }
-            
+
             return handled_count <= 0;
         }
-        
+
         private static void HandleQuery (IPlayerEngineService player, IDictionary<string, object> track, string query)
         {
             // Translate legacy query arguments into new ones
@@ -170,7 +170,7 @@ namespace Halie
                 case "duration": query = "length"; break;
                 case "uri":      query = "URI";    break;
             }
-            
+
             switch (query) {
                 case "all":
                     if (track != null) {
@@ -178,16 +178,16 @@ namespace Halie
                             DisplayTrackField (field.Key, field.Value);
                         }
                     }
-                    
+
                     HandleQuery (player, track, "position");
                     HandleQuery (player, track, "volume");
                     HandleQuery (player, track, "current-state");
                     HandleQuery (player, track, "last-state");
                     HandleQuery (player, track, "can-pause");
                     HandleQuery (player, track, "can-seek");
-                    break; 
-                case "position": 
-                    DisplayTrackField ("position", TimeSpan.FromMilliseconds (player.Position).TotalSeconds); 
+                    break;
+                case "position":
+                    DisplayTrackField ("position", TimeSpan.FromMilliseconds (player.Position).TotalSeconds);
                     break;
                 case "volume":
                     DisplayTrackField ("volume", player.Volume);
@@ -227,7 +227,7 @@ namespace Halie
                     break;
             }
         }
-        
+
         private static void DisplayTrackField (string field, object value)
         {
             if (field == String.Empty) {
@@ -237,43 +237,43 @@ namespace Halie
             } else if (field == "length") {
                 field = "duration";
             }
-            
+
             string result = null;
             if (value is bool) {
                 result = (bool)value ? "true" : "false";
             } else {
                 result = value.ToString ();
             }
-            
+
             if (hide_field) {
                 Console.WriteLine (result);
             } else {
                 Console.WriteLine ("{0}: {1}", field.ToLower (), result);
             }
         }
-        
+
         private static bool ParseBool (string value)
         {
             return ParseBool (value, "true", "yes");
         }
-        
+
         private static bool ParseBool (string value, params string [] trueValues)
         {
             if (String.IsNullOrEmpty (value)) {
                 return false;
             }
-            
+
             value = value.ToLower ();
-            
+
             foreach (string trueValue in trueValues) {
                 if (value == trueValue) {
                     return true;
                 }
             }
-            
+
             return false;
         }
-        
+
         private static void Error (string error, params object [] args)
         {
             Console.WriteLine ("Error: {0}", String.Format (error, args));
diff --git a/src/Clients/Halie/Makefile.in b/src/Clients/Halie/Makefile.in
index 7bbdcc5..0e40e59 100644
--- a/src/Clients/Halie/Makefile.in
+++ b/src/Clients/Halie/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -366,6 +375,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -469,11 +479,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -491,6 +502,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -520,6 +532,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -539,14 +552,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Halie/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Halie/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Halie/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Halie/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -564,25 +577,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -612,13 +641,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -650,6 +683,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -670,6 +704,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -678,18 +714,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -750,7 +796,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -767,6 +813,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Makefile.in b/src/Clients/Makefile.in
index d9a4aec..c73667c 100644
--- a/src/Clients/Makefile.in
+++ b/src/Clients/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -361,14 +378,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -386,6 +403,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -417,7 +435,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -451,16 +469,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -468,14 +486,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -487,7 +505,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -496,29 +514,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -539,29 +562,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -591,6 +629,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -610,6 +649,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -618,18 +659,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -650,8 +701,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -667,6 +718,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Muinshee/Makefile.in b/src/Clients/Muinshee/Makefile.in
index 85e3db0..1cc3c5d 100644
--- a/src/Clients/Muinshee/Makefile.in
+++ b/src/Clients/Muinshee/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,6 +386,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -480,11 +490,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -502,6 +513,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -531,6 +543,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -550,14 +563,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Muinshee/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Muinshee/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Muinshee/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Muinshee/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -575,25 +588,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -623,13 +652,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -661,6 +694,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -681,6 +715,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -689,18 +725,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -761,7 +807,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -778,6 +824,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Muinshee/Muinshee/BaseDialog.cs b/src/Clients/Muinshee/Muinshee/BaseDialog.cs
index c180736..b7b2817 100644
--- a/src/Clients/Muinshee/Muinshee/BaseDialog.cs
+++ b/src/Clients/Muinshee/Muinshee/BaseDialog.cs
@@ -58,13 +58,13 @@ namespace Muinshee
         {
             this.queue = queue;
             VBox.Spacing = 6;
-            
+
             HBox filter_box = new HBox ();
             filter_box.Spacing = 6;
-            
+
             Label search_label = new Label ("_Search:");
             filter_box.PackStart (search_label, false, false, 0);
-            
+
             search_entry = new SearchEntry ();
             search_entry.Show ();
             search_entry.Changed += OnFilterChanged;
@@ -79,7 +79,7 @@ namespace Muinshee
             VBox.PackStart (sw, true, true, 0);
 
             AddDefaultCloseButton ();
-            
+
             Button queue_button = new ImageButton (Catalog.GetString ("En_queue"), "stock_timer");
             AddActionWidget (queue_button, Gtk.ResponseType.Apply);
 
@@ -123,7 +123,7 @@ namespace Muinshee
                 }
             }
         }
-        
+
         protected abstract void Queue ();
         protected abstract Widget GetItemWidget ();
         protected abstract TrackInfo FirstTrack { get; }
@@ -131,7 +131,7 @@ namespace Muinshee
         protected PlaylistSource QueueSource { get { return queue; } }
 
         protected static Banshee.Library.MusicLibrarySource Music { get { return ServiceManager.SourceManager.MusicLibrary; } }
-        
+
         public override void Destroy ()
         {
             OnFilterChanged (null, null);
diff --git a/src/Clients/Muinshee/Muinshee/Client.cs b/src/Clients/Muinshee/Muinshee/Client.cs
index 0cc6b68..8d39cbc 100644
--- a/src/Clients/Muinshee/Muinshee/Client.cs
+++ b/src/Clients/Muinshee/Muinshee/Client.cs
@@ -47,13 +47,13 @@ namespace Muinshee
         {
             Startup<Muinshee.Client> (args);
         }
-        
+
         protected override void OnRegisterServices ()
         {
             // Register the main interface
             ServiceManager.RegisterService<Muinshee.PlayerInterface> ();
         }
-        
+
         public override string ClientId {
             get { return "muinshee"; }
         }
diff --git a/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs b/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs
index ce95ff1..7b24847 100644
--- a/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs
+++ b/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs
@@ -37,7 +37,7 @@ namespace Muinshee
     public class MuinsheeActions : BansheeActionGroup
     {
         private Banshee.Playlist.PlaylistSource queue;
-        
+
         public MuinsheeActions (Banshee.Playlist.PlaylistSource queue) : base ("muinshee")
         {
             this.queue = queue;
@@ -58,7 +58,7 @@ namespace Muinshee
 
             // TODO disable certain actions
             // Actions.TrackActions.UpdateActions (false, false, "SearchMenu");
-            
+
             AddUiFromFile ("GlobalUI.xml");
         }
 
diff --git a/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs b/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs
index 42286bc..7a44adf 100644
--- a/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs
+++ b/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs
@@ -33,7 +33,7 @@ using Hyena.Gui;
 using Banshee.Collection.Gui;
 
 namespace Muinshee
-{    
+{
     public class MuinsheeTrackInfoDisplay : Banshee.Gui.Widgets.ClassicTrackInfoDisplay
     {
         private ImageSurface idle_album;
@@ -50,9 +50,9 @@ namespace Muinshee
         {
             idle_album = idle_album ?? PixbufImageSurface.Create (Banshee.Gui.IconThemeUtils.LoadIcon (
                 ArtworkSizeRequest, "media-optical"), true);
-            
-            ArtworkRenderer.RenderThumbnail (cr, idle_album, false, Allocation.X, Allocation.Y, 
-                ArtworkSizeRequest, ArtworkSizeRequest, 
+
+            ArtworkRenderer.RenderThumbnail (cr, idle_album, false, Allocation.X, Allocation.Y,
+                ArtworkSizeRequest, ArtworkSizeRequest,
                 false, 0, true, BackgroundColor);
         }
     }
diff --git a/src/Clients/Muinshee/Muinshee/PlayerInterface.cs b/src/Clients/Muinshee/Muinshee/PlayerInterface.cs
index 196fb24..cb94537 100644
--- a/src/Clients/Muinshee/Muinshee/PlayerInterface.cs
+++ b/src/Clients/Muinshee/Muinshee/PlayerInterface.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlayerInterface.cs
 //
 // Author:
@@ -64,11 +64,11 @@ namespace Muinshee
         private Toolbar header_toolbar;
 
         private MuinsheeActions actions;
-        
+
         // Major Interaction Components
         private TerseTrackListView track_view;
         private Label list_label;
-        
+
         public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"), "muinshee", -1, 450)
         {
         }
@@ -110,8 +110,8 @@ namespace Muinshee
             }
         }
 
-#region System Overrides 
-        
+#region System Overrides
+
         public override void Dispose ()
         {
             lock (this) {
@@ -123,19 +123,19 @@ namespace Muinshee
                 Gtk.Application.Quit ();
             }
         }
-        
-#endregion        
+
+#endregion
 
 #region Interface Construction
-        
+
         private void BuildPrimaryLayout ()
         {
             main_vbox = new VBox ();
-            
+
             Widget menu = new MainMenu ();
             menu.Show ();
             main_vbox.PackStart (menu, false, false, 0);
-           
+
             BuildHeader ();
 
             content_vbox = new VBox ();
@@ -147,30 +147,30 @@ namespace Muinshee
 
             BuildTrackInfo ();
             BuildViews ();
-            
+
             main_vbox.ShowAll ();
             Add (main_vbox);
         }
-        
+
         private void BuildHeader ()
         {
             Alignment toolbar_alignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
             toolbar_alignment.TopPadding = 3;
             toolbar_alignment.BottomPadding = 3;
-            
+
             header_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/MuinsheeHeaderToolbar");
             header_toolbar.ShowArrow = false;
             header_toolbar.ToolbarStyle = ToolbarStyle.BothHoriz;
-            
+
             toolbar_alignment.Add (header_toolbar);
             toolbar_alignment.ShowAll ();
-            
+
             main_vbox.PackStart (toolbar_alignment, false, false, 0);
-            
+
             Widget next_button = new NextButton (ActionService);
             next_button.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/MuinsheeHeaderToolbar/NextArrowButton", next_button);
-            
+
             ConnectedVolumeButton volume_button = new ConnectedVolumeButton ();
             volume_button.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/MuinsheeHeaderToolbar/VolumeButton", volume_button);
@@ -212,16 +212,16 @@ namespace Muinshee
         }
 
 #endregion
-        
+
 #region Events and Logic Setup
-        
+
         protected override void ConnectEvents ()
         {
             base.ConnectEvents ();
             ServiceManager.SourceManager.SourceUpdated += OnSourceUpdated;
             header_toolbar.ExposeEvent += OnToolbarExposeEvent;
         }
-        
+
 #endregion
 
 #region Service Event Handlers
@@ -232,9 +232,9 @@ namespace Muinshee
                 UpdateSourceInformation ();
             }
         }
-        
+
 #endregion
-        
+
 #region Helper Functions
 
         private void HandleTrackModelReloaded (object sender, EventArgs args)
@@ -263,7 +263,7 @@ namespace Muinshee
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string IDBusObjectName.ExportObjectName {
             get { return "MuinsheeClientWindow"; }
         }
diff --git a/src/Clients/Nereid/Makefile.in b/src/Clients/Nereid/Makefile.in
index 62fba37..1bf3f4a 100644
--- a/src/Clients/Nereid/Makefile.in
+++ b/src/Clients/Nereid/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -370,6 +379,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -473,11 +483,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -495,6 +506,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -524,6 +536,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -543,14 +556,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Clients/Nereid/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Clients/Nereid/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Nereid/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Clients/Nereid/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -568,25 +581,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -616,13 +645,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -654,6 +687,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -674,6 +708,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -682,18 +718,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -754,7 +800,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -771,6 +817,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Clients/Nereid/Nereid/Client.cs b/src/Clients/Nereid/Nereid/Client.cs
index 8675f57..5a93ef6 100644
--- a/src/Clients/Nereid/Nereid/Client.cs
+++ b/src/Clients/Nereid/Nereid/Client.cs
@@ -53,7 +53,7 @@ namespace Nereid
         {
             Startup<Nereid.Client> (args);
         }
-        
+
         protected override void OnRegisterServices ()
         {
             ServiceManager.RegisterService<Nereid.PlayerInterface> ();
diff --git a/src/Clients/Nereid/Nereid/PlayerInterface.cs b/src/Clients/Nereid/Nereid/PlayerInterface.cs
index 73b8216..aea08e1 100644
--- a/src/Clients/Nereid/Nereid/PlayerInterface.cs
+++ b/src/Clients/Nereid/Nereid/PlayerInterface.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlayerInterface.cs
 //
 // Author:
@@ -58,39 +58,53 @@ namespace Nereid
     {
         // Major Layout Components
         private VBox primary_vbox;
+        private Table header_table;
+        private MainMenu main_menu;
         private Toolbar header_toolbar;
-        private Toolbar footer_toolbar;
+        private HBox footer_toolbar;
         private HPaned views_pane;
         private ViewContainer view_container;
-        
+
         // Major Interaction Components
         private SourceView source_view;
         private CompositeTrackSourceContents composite_view;
         private ObjectListSourceContents object_view;
         private Label status_label;
 
+        public MainMenu MainMenu {
+            get { return main_menu; }
+        }
+
+        public Toolbar HeaderToolbar {
+            get { return header_toolbar; }
+        }
+
+        public Table HeaderTable {
+            get { return header_table; }
+        }
+
         protected PlayerInterface (IntPtr ptr) : base (ptr)
         {
         }
-        
+
         public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"), "player_window", 1024, 700)
         {
         }
-        
+
         protected override void Initialize ()
         {
             BuildPrimaryLayout ();
             ConnectEvents ();
 
             ActionService.SourceActions.SourceView = this;
-            
+
             composite_view.TrackView.HasFocus = true;
-            
+
             InitialShowPresent ();
         }
-        
-#region System Overrides 
-        
+
+#region System Overrides
+
         public override void Dispose ()
         {
             lock (this) {
@@ -99,54 +113,63 @@ namespace Nereid
                 Gtk.Application.Quit ();
             }
         }
-        
-#endregion        
+
+#endregion
 
 #region Interface Construction
-        
+
         private void BuildPrimaryLayout ()
         {
             primary_vbox = new VBox ();
-            
-            Widget menu = new MainMenu ();
-            menu.Show ();
-            primary_vbox.PackStart (menu, false, false, 0);
-           
+
             BuildHeader ();
             BuildViews ();
             BuildFooter ();
-            
+
             primary_vbox.Show ();
             Add (primary_vbox);
         }
-        
+
         private void BuildHeader ()
         {
+            header_table = new Table (2, 2, false);
+            header_table.Show ();
+            primary_vbox.PackStart (header_table, false, false, 0);
+
+            main_menu = new MainMenu ();
+            main_menu.Show ();
+
+            header_table.Attach (main_menu, 0, 1, 0, 1,
+                AttachOptions.Expand | AttachOptions.Fill,
+                AttachOptions.Shrink, 0, 0);
+
             Alignment toolbar_alignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
             toolbar_alignment.TopPadding = 3;
             toolbar_alignment.BottomPadding = 3;
-            
+
             header_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/HeaderToolbar");
             header_toolbar.ShowArrow = false;
             header_toolbar.ToolbarStyle = ToolbarStyle.BothHoriz;
-            
+
             toolbar_alignment.Add (header_toolbar);
             toolbar_alignment.ShowAll ();
-            
-            primary_vbox.PackStart (toolbar_alignment, false, false, 0);
-            
+
+            header_table.Attach (toolbar_alignment, 0, 2, 1, 2,
+                AttachOptions.Expand | AttachOptions.Fill,
+                AttachOptions.Shrink, 0, 0);
+
             Widget next_button = new NextButton (ActionService);
             next_button.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/NextArrowButton", next_button);
-            
+
             ConnectedSeekSlider seek_slider = new ConnectedSeekSlider ();
             seek_slider.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/SeekSlider", seek_slider);
-            
+
             TrackInfoDisplay track_info_display = new ClassicTrackInfoDisplay ();
             track_info_display.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/TrackInfoDisplay", track_info_display, true);
-            
+
             ConnectedVolumeButton volume_button = new ConnectedVolumeButton ();
             volume_button.Show ();
             ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/VolumeButton", volume_button);
@@ -155,53 +178,51 @@ namespace Nereid
         private void BuildViews ()
         {
             VBox source_box = new VBox ();
-            
+
             views_pane = new HPaned ();
             PersistentPaneController.Control (views_pane, SourceViewWidth);
             view_container = new ViewContainer ();
-            
+
             source_view = new SourceView ();
             composite_view = new CompositeTrackSourceContents ();
-            
+
             Hyena.Widgets.ScrolledWindow source_scroll = new Hyena.Widgets.ScrolledWindow ();
-            source_scroll.AddWithFrame (source_view);       
-            
+            source_scroll.AddWithFrame (source_view);
+
             composite_view.TrackView.HeaderVisible = false;
             view_container.Content = composite_view;
-            
+
             source_box.PackStart (source_scroll, true, true, 0);
             source_box.PackStart (new UserJobTileHost (), false, false, 0);
-            
+
             source_view.SetSizeRequest (125, -1);
             view_container.SetSizeRequest (425, -1);
-            
+
             views_pane.Pack1 (source_box, false, false);
             views_pane.Pack2 (view_container, true, false);
-            
+
             source_box.ShowAll ();
             view_container.Show ();
             views_pane.Show ();
-            
+
             primary_vbox.PackStart (views_pane, true, true, 0);
         }
 
         private void BuildFooter ()
         {
-            footer_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/FooterToolbar");
-            footer_toolbar.ShowArrow = false;
-            footer_toolbar.ToolbarStyle = ToolbarStyle.BothHoriz;
+            footer_toolbar = new HBox () { BorderWidth = 2 };
 
             Widget task_status = new Banshee.Gui.Widgets.TaskStatusIcon ();
 
             EventBox status_event_box = new EventBox ();
             status_event_box.ButtonPressEvent += OnStatusBoxButtonPress;
-            
+
             status_label = new Label ();
             status_event_box.Add (status_label);
 
             HBox status_hbox = new HBox (true, 0);
             status_hbox.PackStart (status_event_box, false, false, 0);
-            
+
             Alignment status_align = new Alignment (0.5f, 0.5f, 1.0f, 1.0f);
             status_align.Add (status_hbox);
 
@@ -210,15 +231,15 @@ namespace Nereid
                 status_align.LeftPadding = (uint)args.Allocation.Width;
             };
 
-            ActionService.PopulateToolbarPlaceholder (footer_toolbar, "/FooterToolbar/TaskStatus", task_status, false);
-            ActionService.PopulateToolbarPlaceholder (footer_toolbar, "/FooterToolbar/StatusBar", status_align, true);
-            ActionService.PopulateToolbarPlaceholder (footer_toolbar, "/FooterToolbar/RepeatButton", repeat_button);
+            footer_toolbar.PackStart (task_status, false, false, 0);
+            footer_toolbar.PackStart (status_align, true, true, 0);
+            footer_toolbar.PackStart (repeat_button, false, false, 0);
 
             footer_toolbar.ShowAll ();
             primary_vbox.PackStart (footer_toolbar, false, true, 0);
         }
 
-        private void OnStatusBoxButtonPress (object o, ButtonPressEventArgs args) 
+        private void OnStatusBoxButtonPress (object o, ButtonPressEventArgs args)
         {
             Source source = ServiceManager.SourceManager.ActiveSource;
             if (source != null) {
@@ -228,9 +249,9 @@ namespace Nereid
         }
 
 #endregion
-        
+
 #region Events and Logic Setup
-        
+
         protected override void ConnectEvents ()
         {
             base.ConnectEvents ();
@@ -238,7 +259,7 @@ namespace Nereid
             // Service events
             ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
             ServiceManager.SourceManager.SourceUpdated += OnSourceUpdated;
-            
+
             ActionService.TrackActions ["SearchForSameArtistAction"].Activated += OnProgrammaticSearch;
             ActionService.TrackActions ["SearchForSameAlbumAction"].Activated += OnProgrammaticSearch;
 
@@ -247,7 +268,7 @@ namespace Nereid
             views_pane.SizeRequested += delegate {
                 SourceViewWidth.Set (views_pane.Position);
             };
-            
+
             source_view.RowActivated += delegate {
                 Source source = ServiceManager.SourceManager.ActiveSource;
                 if (source is ITrackModelSource) {
@@ -260,11 +281,20 @@ namespace Nereid
                     }
                 }
             };
-            
+
             header_toolbar.ExposeEvent += OnToolbarExposeEvent;
-            footer_toolbar.ExposeEvent += OnToolbarExposeEvent;
         }
-        
+
+        // Hack method for the Moblin extension to disable the custom
+        // theme overriding of the header toolbar rendering; we should
+        // probably just do away with it altogether, but it needs
+        // further evaluation.
+
+        public void DisableHeaderToolbarExposeEvent ()
+        {
+            header_toolbar.ExposeEvent -= OnToolbarExposeEvent;
+        }
+
 #endregion
 
 #region Service Event Handlers
@@ -276,57 +306,57 @@ namespace Nereid
             view_container.SearchEntry.Query = source.FilterQuery;
             view_container.SearchEntry.Ready = true;
         }
-        
+
         private Source previous_source = null;
         private TrackListModel previous_track_model = null;
         private void OnActiveSourceChanged (SourceEventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 Source source = ServiceManager.SourceManager.ActiveSource;
-    
+
                 view_container.SearchSensitive = source != null && source.CanSearch;
-                
+
                 if (source == null) {
                     return;
                 }
-                
+
                 view_container.Title = source.Name;
                 view_container.SearchEntry.Ready = false;
                 view_container.SearchEntry.CancelSearch ();
-    
+
                 if (source.FilterQuery != null) {
                     view_container.SearchEntry.Query = source.FilterQuery;
                     view_container.SearchEntry.ActivateFilter ((int)source.FilterType);
                 }
-    
+
                 if (view_container.Content != null) {
                     view_container.Content.ResetSource ();
                 }
-    
+
                 if (previous_track_model != null) {
                     previous_track_model.Reloaded -= HandleTrackModelReloaded;
                     previous_track_model = null;
                 }
-    
+
                 if (source is ITrackModelSource) {
                     previous_track_model = (source as ITrackModelSource).TrackModel;
                     previous_track_model.Reloaded += HandleTrackModelReloaded;
                 }
-                
+
                 if (previous_source != null) {
                     previous_source.Properties.PropertyChanged -= OnSourcePropertyChanged;
                 }
-                
+
                 previous_source = source;
                 previous_source.Properties.PropertyChanged += OnSourcePropertyChanged;
-                
+
                 UpdateSourceContents (source);
-                
+
                 UpdateSourceInformation ();
                 view_container.SearchEntry.Ready = true;
             });
         }
-        
+
         private void OnSourcePropertyChanged (object o, PropertyChangeEventArgs args)
         {
             if (args.PropertyName == "Nereid.SourceContents") {
@@ -335,20 +365,20 @@ namespace Nereid
                 });
             }
         }
-        
+
         private void UpdateSourceContents (Source source)
         {
             if (source == null) {
                 return;
             }
-            
+
             // Connect the source models to the views if possible
             ISourceContents contents = source.GetProperty<ISourceContents> ("Nereid.SourceContents",
                 source.GetInheritedProperty<bool> ("Nereid.SourceContentsPropagate"));
 
             view_container.ClearHeaderWidget ();
             view_container.ClearFooter ();
-            
+
             if (contents != null) {
                 if (view_container.Content != contents) {
                     view_container.Content = contents;
@@ -363,7 +393,7 @@ namespace Nereid
                 if (object_view == null) {
                     object_view = new ObjectListSourceContents ();
                 }
-                
+
                 view_container.Content = object_view;
                 view_container.Content.SetSource (source);
                 view_container.Show ();
@@ -393,7 +423,7 @@ namespace Nereid
             if (source.Properties.Contains ("Nereid.SourceContents.FooterWidget")) {
                 footer_widget = source.Properties.Get<Widget> ("Nereid.SourceContents.FooterWidget");
             }
-            
+
             if (footer_widget != null) {
                 view_container.SetFooter (footer_widget);
             }
@@ -412,17 +442,17 @@ namespace Nereid
 #endregion
 
 #region UI Event Handlers
-        
+
         private void OnSearchEntryChanged (object o, EventArgs args)
         {
             Source source = ServiceManager.SourceManager.ActiveSource;
             if (source == null)
                 return;
-            
+
             source.FilterType = (TrackFilterType)view_container.SearchEntry.ActiveFilterID;
             source.FilterQuery = view_container.SearchEntry.Query;
         }
-        
+
 #endregion
 
 #region Implement Interfaces
@@ -436,7 +466,7 @@ namespace Nereid
         {
             source_view.BeginRenameSource (source);
         }
-        
+
         public void ResetHighlight ()
         {
             source_view.ResetHighlight ();
@@ -447,7 +477,7 @@ namespace Nereid
         }
 
 #endregion
-        
+
 #region Gtk.Window Overrides
 
         private bool accel_group_active = true;
@@ -461,12 +491,12 @@ namespace Nereid
 
             (o as Widget).FocusOutEvent -= OnEntryFocusOutEvent;
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
         {
             bool focus_search = false;
-            
-            if (Focus is Gtk.Entry && (GtkUtilities.NoImportantModifiersAreSet () && 
+
+            if (Focus is Gtk.Entry && (GtkUtilities.NoImportantModifiersAreSet () &&
                 evnt.Key != Gdk.Key.Control_L && evnt.Key != Gdk.Key.Control_R)) {
                 if (accel_group_active) {
                     RemoveAccelGroup (ActionService.UIManager.AccelGroup);
@@ -481,7 +511,7 @@ namespace Nereid
                     accel_group_active = true;
                 }
             }
-            
+
             switch (evnt.Key) {
                 case Gdk.Key.f:
                     if (Gdk.ModifierType.ControlMask == (evnt.State & Gdk.ModifierType.ControlMask)) {
@@ -498,11 +528,11 @@ namespace Nereid
                     break;
             }
 
-            if (focus_search && !view_container.SearchEntry.HasFocus && !source_view.EditingRow) {
+            if (focus_search && view_container.SearchEntry.Visible && !view_container.SearchEntry.HasFocus && !source_view.EditingRow) {
                 view_container.SearchEntry.HasFocus = true;
                 return true;
             }
-            
+
             return base.OnKeyPressEvent (evnt);
         }
 
@@ -549,7 +579,7 @@ namespace Nereid
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string IDBusObjectName.ExportObjectName {
             get { return "ClientWindow"; }
         }
diff --git a/src/Clients/Nereid/Nereid/ViewContainer.cs b/src/Clients/Nereid/Nereid/ViewContainer.cs
index 4cebd42..4d65cea 100644
--- a/src/Clients/Nereid/Nereid/ViewContainer.cs
+++ b/src/Clients/Nereid/Nereid/ViewContainer.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ViewContainer.cs
 //
 // Author:
@@ -51,22 +51,22 @@ namespace Nereid
         private Label search_label;
         private Banshee.ContextPane.ContextPane context_pane;
         private VBox footer;
-        
+
         private ISourceContents content;
-        
+
         public ViewContainer ()
         {
-            BuildHeader ();           
-            
+            BuildHeader ();
+
             Spacing = 6;
             SearchSensitive = false;
         }
-        
+
         private void BuildHeader ()
         {
             header = new HBox ();
             footer = new VBox ();
-            
+
             EventBox title_box = new EventBox ();
             title_label = new Label ();
             title_label.Xalign = 0.0f;
@@ -86,17 +86,17 @@ namespace Nereid
             };
 
             header_box = new EventBox ();
-            
+
             BuildSearchEntry ();
-            
+
             search_label = new Label (Catalog.GetString ("_Search:"));
             search_label.MnemonicWidget = search_entry.InnerEntry;
-            
+
             header.PackStart (title_box, true, true, 0);
             header.PackStart (header_box, false, false, 0);
             header.PackStart (search_label, false, false, 5);
             header.PackStart (search_entry, false, false, 0);
-            
+
             InterfaceActionService uia = ServiceManager.Get<InterfaceActionService> ();
             if (uia != null) {
                 Gtk.Action action = uia.GlobalActions["WikiSearchHelpAction"];
@@ -104,17 +104,17 @@ namespace Nereid
                     MenuItem item = new SeparatorMenuItem ();
                     item.Show ();
                     search_entry.Menu.Append (item);
-                    
+
                     item = new ImageMenuItem (Stock.Help, null);
                     item.Activated += delegate { action.Activate (); };
                     item.Show ();
                     search_entry.Menu.Append (item);
                 }
             }
-            
+
             header.ShowAll ();
             search_entry.Show ();
-            
+
             PackStart (header, false, false, 0);
             PackEnd (footer, false, false, 0);
 
@@ -127,16 +127,16 @@ namespace Nereid
 
             PackEnd (new ConnectedMessageBar (), false, true, 0);
         }
-        
+
         private struct SearchFilter
         {
             public int Id;
             public string Field;
             public string Title;
         }
-        
+
         private Dictionary<int, SearchFilter> search_filters = new Dictionary<int, SearchFilter> ();
-        
+
         private void AddSearchFilter (TrackFilterType id, string field, string title)
         {
             SearchFilter filter = new SearchFilter ();
@@ -145,7 +145,7 @@ namespace Nereid
             filter.Title = title;
             search_filters.Add (filter.Id, filter);
         }
-        
+
         private void BuildSearchEntry ()
         {
             AddSearchFilter (TrackFilterType.None, String.Empty, Catalog.GetString ("Artist, Album, or Title"));
@@ -216,7 +216,7 @@ namespace Nereid
                 footer.Show ();
             }
         }
-        
+
         public void ClearFooter ()
         {
             footer.Hide ();
@@ -224,15 +224,15 @@ namespace Nereid
                 footer.Remove (child);
             }
         }
-        
+
         public HBox Header {
             get { return header; }
         }
-        
+
         public SearchEntry SearchEntry {
             get { return search_entry; }
         }
-        
+
         public ISourceContents Content {
             get { return content; }
             set {
@@ -250,23 +250,23 @@ namespace Nereid
                     PackStart (value.Widget, !context_pane.Large, true, 0);
                     value.Widget.Show ();
                 }
-                
+
                 // Remove the old one
                 if (content != null && content.Widget != null) {
                     Remove (content.Widget);
                 }
-                
+
                 content = value;
             }
         }
-        
+
         public string Title {
             set { title_label.Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText (value)); }
         }
-        
+
         public bool SearchSensitive {
             get { return search_entry.Sensitive; }
-            set { 
+            set {
                 search_entry.Sensitive = value;
                 search_label.Sensitive = value;
                 search_entry.Visible = value;
diff --git a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/IndexerClient.cs b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/IndexerClient.cs
index 3867fcc..94c2a5b 100644
--- a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/IndexerClient.cs
+++ b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/IndexerClient.cs
@@ -42,23 +42,23 @@ namespace Banshee.Collection.Indexer.RemoteHelper
     {
         private const string application_bus_name = "org.bansheeproject.Banshee";
         private const string indexer_bus_name = "org.bansheeproject.CollectionIndexer";
-        
+
         private const string service_interface = "org.bansheeproject.CollectionIndexer.Service";
         private static ObjectPath service_path = new ObjectPath ("/org/bansheeproject/Banshee/CollectionIndexerService");
-    
+
         private IBus session_bus;
         private bool listening;
         private ICollectionIndexerService service;
         private bool cleanup_and_shutdown;
         private bool index_when_collection_changed = true;
-        
+
         public void Start ()
         {
             ShowDebugMessages = true;
             Debug ("Acquiring org.freedesktop.DBus session instance");
             session_bus = Bus.Session.GetObject<IBus> ("org.freedesktop.DBus", new ObjectPath ("/org/freedesktop/DBus"));
             session_bus.NameOwnerChanged += OnBusNameOwnerChanged;
-            
+
             if (Bus.Session.NameHasOwner (indexer_bus_name)) {
                 Debug ("{0} is already started", indexer_bus_name);
                 ConnectToIndexerService ();
@@ -77,7 +77,7 @@ namespace Banshee.Collection.Indexer.RemoteHelper
                 }
             }
         }
-        
+
         private void Index ()
         {
             if (HasCollectionChanged) {
@@ -91,23 +91,23 @@ namespace Banshee.Collection.Indexer.RemoteHelper
         {
             ThreadPool.QueueUserWorkItem (delegate {
                 Debug ("Running indexer");
-                
+
                 try {
                     UpdateIndex (indexer);
                 } catch (Exception e) {
                     Console.Error.WriteLine (e);
                 }
-                
+
                 Debug ("Indexer finished");
-                
+
                 indexer.Dispose ();
-                
+
                 if (!ApplicationAvailable || !listening) {
                     DisconnectFromIndexerService ();
                 }
             });
         }
-        
+
         private void ConnectToIndexerService ()
         {
             DisconnectFromIndexerService ();
@@ -119,26 +119,26 @@ namespace Banshee.Collection.Indexer.RemoteHelper
             } else {
                 Debug ("Connected to {0}", service_interface);
             }
-            
+
             service.CleanupAndShutdown += OnCleanupAndShutdown;
-            
+
             if (ApplicationAvailable) {
                 Debug ("Listening to service's CollectionChanged signal (full-app is running)");
                 listening = true;
                 service.CollectionChanged += OnCollectionChanged;
             }
-            
+
             Index ();
         }
-        
+
         private void DisconnectFromIndexerService ()
         {
             if (service == null) {
                 return;
             }
-            
+
             Debug ("Disconnecting from service");
-            
+
             if (listening) {
                 try {
                     listening = false;
@@ -147,7 +147,7 @@ namespace Banshee.Collection.Indexer.RemoteHelper
                     Debug (e.ToString ());
                 }
             }
-            
+
             try {
                 service.CleanupAndShutdown -= OnCleanupAndShutdown;
             } catch (Exception e) {
@@ -159,10 +159,10 @@ namespace Banshee.Collection.Indexer.RemoteHelper
             } catch (Exception e) {
                 Debug (e.ToString ());
             }
-            
+
             ResetInternalState ();
         }
-        
+
         private void ResetInternalState ()
         {
             if (service == null) {
@@ -175,59 +175,59 @@ namespace Banshee.Collection.Indexer.RemoteHelper
             cleanup_and_shutdown = false;
             ResetState ();
         }
-        
+
         private void ResolveIndexerService ()
         {
             int attempts = 0;
-            
+
             while (attempts++ < 4) {
                 try {
                     Debug ("Resolving {0} (attempt {1})", service_interface, attempts);
                     service = Bus.Session.GetObject<ICollectionIndexerService> (indexer_bus_name, service_path);
                     service.Hello ();
                     return;
-                } catch { 
+                } catch {
                     service = null;
                     System.Threading.Thread.Sleep (2000);
                 }
             }
         }
-        
+
         private void OnCollectionChanged ()
         {
             if (IndexWhenCollectionChanged) {
                 Index ();
             }
         }
-        
+
         private void OnCleanupAndShutdown ()
         {
             cleanup_and_shutdown = true;
         }
-        
+
         protected void Debug (string message, params object [] args)
         {
             Log.DebugFormat (message, args);
         }
-        
+
         protected abstract bool HasCollectionChanged { get; }
-        
+
         protected abstract void UpdateIndex (ICollectionIndexer indexer);
-        
+
         protected abstract void ResetState ();
-        
+
         protected ICollectionIndexer CreateIndexer ()
         {
             ObjectPath object_path = service.CreateIndexer ();
             Debug ("Creating an ICollectionIndexer ({0})", object_path);
             return Bus.Session.GetObject<ICollectionIndexer> (indexer_bus_name, object_path);
         }
-        
+
         public bool ShowDebugMessages {
             get { return Log.Debugging; }
             set { Log.Debugging = value; }
         }
-        
+
         protected bool CleanupAndShutdown {
             get { return cleanup_and_shutdown; }
         }
@@ -236,11 +236,11 @@ namespace Banshee.Collection.Indexer.RemoteHelper
             get { return index_when_collection_changed; }
             set { index_when_collection_changed = value; }
         }
-        
+
         protected ICollectionIndexerService Service {
             get { return service; }
         }
-        
+
         protected bool ApplicationAvailable {
             get { return Bus.Session.NameHasOwner (application_bus_name); }
         }
diff --git a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/SimpleIndexerClient.cs b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/SimpleIndexerClient.cs
index dceda0d..36ef9f5 100644
--- a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/SimpleIndexerClient.cs
+++ b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer.RemoteHelper/SimpleIndexerClient.cs
@@ -35,18 +35,18 @@ namespace Banshee.Collection.Indexer.RemoteHelper
     {
         private _SimpleIndexerClient client;
         private List<string> export_fields;
-        
+
         public SimpleIndexerClient ()
         {
             client = new _SimpleIndexerClient (this);
         }
-        
+
         public void Start ()
         {
             client.Start ();
             OnStarted ();
         }
-        
+
         public string [] GetAvailableExportFields ()
         {
             return client.GetAvailableExportFields ();
@@ -55,76 +55,76 @@ namespace Banshee.Collection.Indexer.RemoteHelper
         protected bool IndexWhenCollectionChanged {
             set { client.IndexWhenCollectionChanged = value; }
         }
-        
+
         public void AddExportField (params string [] fields)
         {
             if (export_fields == null) {
                 export_fields = new List<string> ();
             }
-            
+
             foreach (string field in fields) {
                 if (!export_fields.Contains (field)) {
                     export_fields.Add (field);
                 }
             }
         }
-        
+
         public bool RemoveExportField (string field)
         {
             if (export_fields != null) {
                 return export_fields.Remove (field);
             }
-            
+
             return false;
         }
-        
+
         public IEnumerable<string> ExportFields {
-            get { 
+            get {
                 if (export_fields == null) {
                     yield break;
                 }
-                
+
                 foreach (string field in export_fields) {
                     yield return field;
                 }
             }
         }
-        
+
         protected virtual void OnStarted ()
         {
         }
-        
+
         protected virtual void OnBeginUpdateIndex ()
         {
         }
-        
+
         protected virtual void OnEndUpdateIndex ()
         {
         }
-        
+
         protected abstract void IndexResult (IDictionary<string, object> result);
         protected abstract void OnShutdownWhileIndexing ();
         protected abstract int CollectionCount { get; }
         protected abstract DateTime CollectionLastModified { get; }
-            
+
         private class _SimpleIndexerClient : IndexerClient
         {
             private object shutdown_mutex = new object ();
             private bool indexer_running;
             private bool shutdown_requested;
-            
+
             private SimpleIndexerClient parent;
-            
+
             public _SimpleIndexerClient (SimpleIndexerClient parent)
             {
                 this.parent = parent;
             }
-            
+
             public string [] GetAvailableExportFields ()
             {
                 return Service.GetAvailableExportFields ();
             }
-        
+
             protected override void ResetState ()
             {
                 lock (shutdown_mutex) {
@@ -133,49 +133,49 @@ namespace Banshee.Collection.Indexer.RemoteHelper
                     }
                 }
             }
-            
+
             protected override void UpdateIndex (ICollectionIndexer indexer)
             {
                 lock (shutdown_mutex) {
                     indexer_running = true;
                     shutdown_requested = false;
                 }
-                
+
                 bool shutdown_while_indexing = false;
-                
+
                 if (parent.export_fields != null && parent.export_fields.Count > 0) {
                     indexer.SetExportFields (parent.export_fields.ToArray ());
                 }
-                
+
                 parent.OnBeginUpdateIndex ();
-                
+
                 for (int i = 0, models = indexer.GetModelCounts (); i < models; i++) {
                     for (int j = 0, items = indexer.GetModelResultsCount (i); j < items; j++) {
                         if (Shutdown) {
                             shutdown_while_indexing = true;
                             break;
                         }
-                        
+
                         parent.IndexResult (indexer.GetResult (i, j));
                     }
-                    
+
                     if (shutdown_while_indexing) {
                         break;
                     }
                 }
-                
+
                 lock (shutdown_mutex) {
                     indexer_running = false;
                     shutdown_requested = false;
                 }
-                
+
                 if (shutdown_while_indexing) {
                     parent.OnShutdownWhileIndexing ();
                 }
-                
+
                 parent.OnEndUpdateIndex ();
             }
-            
+
             protected override bool HasCollectionChanged {
                 get { return Service.HasCollectionCountChanged (parent.CollectionCount) ||
                     Service.HasCollectionLastModifiedChanged (Hyena.DateTimeUtil.ToTimeT (parent.CollectionLastModified)); }
diff --git a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexer.cs b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexer.cs
index 684bed0..8fd60c5 100644
--- a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexer.cs
+++ b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexer.cs
@@ -33,22 +33,22 @@ using NDesk.DBus;
 namespace Banshee.Collection.Indexer
 {
     public delegate void SaveToXmlFinishedHandler (bool success, string path);
-    
+
     [Interface ("org.bansheeproject.CollectionIndexer.Indexer")]
     public interface ICollectionIndexer
     {
         event ActionHandler IndexingFinished;
         event SaveToXmlFinishedHandler SaveToXmlFinished;
-        
+
         void Index ();
         void Dispose ();
-        
+
         void SetExportFields (string [] fields);
-        
+
         int GetModelCounts ();
         int GetModelResultsCount (int modelIndex);
         IDictionary<string, object> GetResult (int modelIndex, int itemIndex);
-        
+
         void SaveToXml (string path);
     }
 }
diff --git a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexerService.cs b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexerService.cs
index 6100762..2cce19a 100644
--- a/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexerService.cs
+++ b/src/Core/Banshee.CollectionIndexer/Banshee.Collection.Indexer/ICollectionIndexerService.cs
@@ -38,7 +38,7 @@ namespace Banshee.Collection.Indexer
     {
         event ActionHandler CollectionChanged;
         event ActionHandler CleanupAndShutdown;
-        
+
         void Hello ();
         void Shutdown ();
         ObjectPath CreateIndexer ();
diff --git a/src/Core/Banshee.CollectionIndexer/Hyena/ConsoleCrayon.cs b/src/Core/Banshee.CollectionIndexer/Hyena/ConsoleCrayon.cs
index c492d30..453d3a0 100644
--- a/src/Core/Banshee.CollectionIndexer/Hyena/ConsoleCrayon.cs
+++ b/src/Core/Banshee.CollectionIndexer/Hyena/ConsoleCrayon.cs
@@ -87,7 +87,7 @@ namespace Hyena
         // License: MIT/X11
         // Authors: Gonzalo Paniagua Javier <gonzalo at ximian.com>
         // (C) 2005-2006 Novell, Inc <http://www.novell.com>
-        
+
         private static int TranslateColor (ConsoleColor desired, out bool light)
         {
             light = false;
@@ -113,7 +113,7 @@ namespace Hyena
                 case ConsoleColor.White: default: light = true; return 7;
             }
         }
-        
+
         private static string GetAnsiColorControlCode (ConsoleColor color, bool isForeground)
         {
             // lighter fg colours are 90 -> 97 rather than 30 -> 37
@@ -133,7 +133,7 @@ namespace Hyena
 #region xterm Detection
 
         private static bool? xterm_colors = null;
-        internal static bool XtermColors { 
+        internal static bool XtermColors {
             get {
                 if (xterm_colors == null) {
                     DetectXtermColors ();
@@ -145,7 +145,7 @@ namespace Hyena
 
         [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")]
         private extern static int _isatty (int fd);
-            
+
         private static bool isatty (int fd)
         {
             try {
@@ -158,11 +158,11 @@ namespace Hyena
         private static void DetectXtermColors ()
         {
             bool _xterm_colors = false;
-                
+
             switch (Environment.GetEnvironmentVariable ("TERM")) {
                 case "xterm":
                 case "rxvt":
-                case "rxvt-unicode": 
+                case "rxvt-unicode":
                     if (Environment.GetEnvironmentVariable ("COLORTERM") != null) {
                         _xterm_colors = true;
                     }
@@ -181,7 +181,7 @@ namespace Hyena
 
         private static bool? runtime_is_mono;
         internal static bool RuntimeIsMono {
-            get { 
+            get {
                 if (runtime_is_mono == null) {
                     runtime_is_mono = Type.GetType ("System.MonoType") != null;
                 }
diff --git a/src/Core/Banshee.CollectionIndexer/Hyena/DateTimeUtil.cs b/src/Core/Banshee.CollectionIndexer/Hyena/DateTimeUtil.cs
index 2282682..be77504 100644
--- a/src/Core/Banshee.CollectionIndexer/Hyena/DateTimeUtil.cs
+++ b/src/Core/Banshee.CollectionIndexer/Hyena/DateTimeUtil.cs
@@ -61,13 +61,13 @@ namespace Hyena
         internal static string FormatDuration (long time) {
             return FormatDuration (TimeSpan.FromSeconds (time));
         }
-        
+
         internal static string FormatDuration (TimeSpan time) {
             return FormatDuration (time.Hours, time.Minutes, time.Seconds);
         }
-        
+
         internal static string FormatDuration (int hours, int minutes, int seconds) {
-            return (hours > 0 ? 
+            return (hours > 0 ?
                     String.Format ("{0}:{1:00}:{2:00}", hours, minutes, seconds) :
                     String.Format ("{0}:{1:00}", minutes, seconds));
         }
diff --git a/src/Core/Banshee.CollectionIndexer/Hyena/Log.cs b/src/Core/Banshee.CollectionIndexer/Hyena/Log.cs
index c56613f..bab70e7 100644
--- a/src/Core/Banshee.CollectionIndexer/Hyena/Log.cs
+++ b/src/Core/Banshee.CollectionIndexer/Hyena/Log.cs
@@ -37,17 +37,17 @@ namespace Hyena
     internal class LogNotifyArgs : EventArgs
     {
         private LogEntry entry;
-        
+
         internal LogNotifyArgs (LogEntry entry)
         {
             this.entry = entry;
         }
-        
+
         internal LogEntry Entry {
             get { return entry; }
         }
     }
-        
+
     internal enum LogEntryType
     {
         Debug,
@@ -55,14 +55,14 @@ namespace Hyena
         Error,
         Information
     }
-    
+
     internal class LogEntry
     {
         private LogEntryType type;
         private string message;
         private string details;
         private DateTime timestamp;
-        
+
         internal LogEntry (LogEntryType type, string message, string details)
         {
             this.type = type;
@@ -71,27 +71,27 @@ namespace Hyena
             this.timestamp = DateTime.Now;
         }
 
-        internal LogEntryType Type { 
+        internal LogEntryType Type {
             get { return type; }
         }
-        
-        internal string Message { 
-            get { return message; } 
+
+        internal string Message {
+            get { return message; }
         }
-        
-        internal string Details { 
-            get { return details; } 
+
+        internal string Details {
+            get { return details; }
         }
 
-        internal DateTime TimeStamp { 
-            get { return timestamp; } 
+        internal DateTime TimeStamp {
+            get { return timestamp; }
         }
     }
-    
+
     internal static class Log
     {
         internal static event LogNotifyHandler Notify;
-        
+
         private static Dictionary<uint, DateTime> timers = new Dictionary<uint, DateTime> ();
         private static uint next_timer_id = 1;
 
@@ -100,13 +100,13 @@ namespace Hyena
             get { return debugging; }
             set { debugging = value; }
         }
-        
+
         internal static void Commit (LogEntryType type, string message, string details, bool showUser)
         {
             if (type == LogEntryType.Debug && !Debugging) {
                 return;
             }
-        
+
             if (type != LogEntryType.Information || (type == LogEntryType.Information && !showUser)) {
                 switch (type) {
                     case LogEntryType.Error: ConsoleCrayon.ForegroundColor = ConsoleColor.Red; break;
@@ -114,19 +114,19 @@ namespace Hyena
                     case LogEntryType.Information: ConsoleCrayon.ForegroundColor = ConsoleColor.Green; break;
                     case LogEntryType.Debug: ConsoleCrayon.ForegroundColor = ConsoleColor.Blue; break;
                 }
-                
+
                 Console.Write ("[{0} {1:00}:{2:00}:{3:00}.{4:000}]", TypeString (type), DateTime.Now.Hour,
                     DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
-                
+
                 ConsoleCrayon.ResetColor ();
-                               
+
                 if (details != null) {
                     Console.WriteLine (" {0} - {1}", message, details);
                 } else {
                     Console.WriteLine (" {0}", message);
                 }
             }
-            
+
             if (showUser) {
                 OnNotify (new LogEntry (type, message, details));
             }
@@ -142,7 +142,7 @@ namespace Hyena
             }
             return null;
         }
-        
+
         private static void OnNotify (LogEntry entry)
         {
             LogNotifyHandler handler = Notify;
@@ -150,95 +150,95 @@ namespace Hyena
                 handler (new LogNotifyArgs (entry));
             }
         }
-        
+
         #region Timer Methods
-        
+
         internal static uint DebugTimerStart (string message)
         {
             return TimerStart (message, false);
         }
-        
+
         internal static uint InformationTimerStart (string message)
         {
             return TimerStart (message, true);
         }
-        
+
         private static uint TimerStart (string message, bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return 0;
             }
-            
+
             if (isInfo) {
                 Information (message);
             } else {
                 Debug (message);
             }
-            
+
             return TimerStart (isInfo);
         }
-        
+
         internal static uint DebugTimerStart ()
         {
             return TimerStart (false);
         }
-        
+
         internal static uint InformationTimerStart ()
         {
             return TimerStart (true);
         }
-            
+
         private static uint TimerStart (bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return 0;
             }
-            
+
             uint timer_id = next_timer_id++;
             timers.Add (timer_id, DateTime.Now);
             return timer_id;
         }
-        
+
         internal static void DebugTimerPrint (uint id)
         {
             if (!Debugging) {
                 return;
             }
-            
+
             TimerPrint (id, "Operation duration: {0}", false);
         }
-        
+
         internal static void DebugTimerPrint (uint id, string message)
         {
             if (!Debugging) {
                 return;
             }
-            
+
             TimerPrint (id, message, false);
         }
-        
+
         internal static void InformationTimerPrint (uint id)
         {
             TimerPrint (id, "Operation duration: {0}", true);
         }
-        
+
         internal static void InformationTimerPrint (uint id, string message)
         {
             TimerPrint (id, message, true);
         }
-        
+
         private static void TimerPrint (uint id, string message, bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return;
             }
-            
+
             DateTime finish = DateTime.Now;
-            
+
             if (!timers.ContainsKey (id)) {
                 return;
             }
-            
+
             TimeSpan duration = finish - timers[id];
             string d_message;
             if (duration.TotalSeconds < 60) {
@@ -246,116 +246,116 @@ namespace Hyena
             } else {
                 d_message = duration.ToString ();
             }
-            
+
             if (isInfo) {
                 InformationFormat (message, d_message);
             } else {
                 DebugFormat (message, d_message);
             }
         }
-        
+
         #endregion
-        
+
         #region Public Debug Methods
-                                    
+
         internal static void Debug (string message, string details)
         {
             if (Debugging) {
                 Commit (LogEntryType.Debug, message, details, false);
             }
         }
-        
+
         internal static void Debug (string message)
         {
             if (Debugging) {
                 Debug (message, null);
             }
         }
-        
+
         internal static void DebugFormat (string format, params object [] args)
         {
             if (Debugging) {
                 Debug (String.Format (format, args));
             }
         }
-                
+
         #endregion
-        
+
         #region Public Information Methods
-            
+
         internal static void Information (string message)
         {
             Information (message, null);
         }
-        
+
         internal static void Information (string message, string details)
         {
             Information (message, details, false);
         }
-        
+
         internal static void Information (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Information, message, details, showUser);
         }
-        
+
         internal static void Information (string message, bool showUser)
         {
             Information (message, null, showUser);
         }
-        
+
         internal static void InformationFormat (string format, params object [] args)
         {
             Information (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Warning Methods
-        
+
         internal static void Warning (string message)
         {
             Warning (message, null);
         }
-        
+
         internal static void Warning (string message, string details)
         {
             Warning (message, details, false);
         }
-        
+
         internal static void Warning (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Warning, message, details, showUser);
         }
-        
+
         internal static void Warning (string message, bool showUser)
         {
             Warning (message, null, showUser);
         }
-        
+
         internal static void WarningFormat (string format, params object [] args)
         {
             Warning (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Error Methods
-        
+
         internal static void Error (string message)
         {
             Error (message, null);
         }
-        
+
         internal static void Error (string message, string details)
         {
             Error (message, details, false);
         }
-        
+
         internal static void Error (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Error, message, details, showUser);
         }
-        
+
         internal static void Error (string message, bool showUser)
         {
             Error (message, null, showUser);
@@ -365,26 +365,26 @@ namespace Hyena
         {
             Error (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Exception Methods
-        
+
         internal static void Exception (Exception e)
         {
             Exception (null, e);
         }
-        
+
         internal static void Exception (string message, Exception e)
         {
             Stack<Exception> exception_chain = new Stack<Exception> ();
             StringBuilder builder = new StringBuilder ();
-            
+
             while (e != null) {
                 exception_chain.Push (e);
                 e = e.InnerException;
             }
-            
+
             while (exception_chain.Count > 0) {
                 e = exception_chain.Pop ();
                 builder.AppendFormat ("{0} (in `{1}')", e.Message, e.Source).AppendLine ();
@@ -393,11 +393,11 @@ namespace Hyena
                     builder.AppendLine ();
                 }
             }
-        
+
             // FIXME: We should save these to an actual log file
             Log.Warning (message ?? "Caught an exception", builder.ToString (), false);
         }
-        
+
         #endregion
     }
 }
diff --git a/src/Core/Banshee.CollectionIndexer/Makefile.in b/src/Core/Banshee.CollectionIndexer/Makefile.in
index a892331..c267567 100644
--- a/src/Core/Banshee.CollectionIndexer/Makefile.in
+++ b/src/Core/Banshee.CollectionIndexer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -375,6 +384,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -478,11 +488,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -500,6 +511,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -529,6 +541,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -548,14 +561,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Banshee.CollectionIndexer/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Banshee.CollectionIndexer/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Banshee.CollectionIndexer/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Banshee.CollectionIndexer/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -573,25 +586,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -621,13 +650,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -659,6 +692,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -679,6 +713,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -687,18 +723,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -759,7 +805,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -779,6 +825,7 @@ uninstall-local: $(THEME_ICONS_SOURCE)
 
 #ASSEMBLY_FILE_TMP=$(ASSEMBLY_FILE)
 #ASSEMBLY_FILE=$(strip $(patsubst .exe, .dll, $(ASSEMBLY_FILE_TMP)))
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs b/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
index f8866d5..8d0446f 100644
--- a/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
@@ -37,23 +37,23 @@ namespace Banshee.Base
 
     public static class ApplicationContext
     {
-        static ApplicationContext () 
+        static ApplicationContext ()
         {
             Log.Debugging = Debugging;
         }
-    
+
         private static CommandLineParser command_line = new CommandLineParser ();
         public static CommandLineParser CommandLine {
             set { command_line = value; }
             get { return command_line; }
         }
-        
+
         private static Layout command_line_layout;
         public static Layout CommandLineLayout {
             get { return command_line_layout; }
             set { command_line_layout = value; }
         }
-        
+
         private static bool? debugging = null;
         public static bool Debugging {
             get {
@@ -62,16 +62,16 @@ namespace Banshee.Base
                     debugging |= CommandLine.Contains ("debug-sql");
                     debugging |= EnvironmentIsSet ("BANSHEE_DEBUG");
                 }
-                
+
                 return debugging.Value;
             }
         }
-        
+
         public static bool EnvironmentIsSet (string env)
         {
             return !String.IsNullOrEmpty (Environment.GetEnvironmentVariable (env));
         }
-        
+
         public static System.Globalization.CultureInfo InternalCultureInfo {
             get { return System.Globalization.CultureInfo.InvariantCulture; }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs b/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs
index 5d09b82..bfe7f0a 100644
--- a/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs
@@ -45,29 +45,29 @@ namespace Banshee.Base
         {
             return CoverExists (CreateArtistAlbumId (artist, album));
         }
-    
+
         public static bool CoverExists (string aaid)
         {
             return CoverExistsForSize (aaid, 0);
         }
-        
+
         public static bool CoverExistsForSize (string aaid, int size)
         {
             return aaid == null ? false : File.Exists (GetPathForSize (aaid, size));
         }
-        
+
         public static string GetPath (string aaid)
         {
             return GetPathForSize (aaid, 0);
         }
-    
+
         public static string GetPathForSize (string aaid, int size)
         {
             return size == 0
                 ? Path.Combine (RootPath, String.Format ("{0}.jpg", aaid))
-                : Path.Combine (RootPath, Path.Combine (size.ToString (), String.Format ("{0}.jpg", aaid))); 
+                : Path.Combine (RootPath, Path.Combine (size.ToString (), String.Format ("{0}.jpg", aaid)));
         }
-    
+
         public static string CreateArtistAlbumId (string artist, string album)
         {
             return CreateArtistAlbumId (artist, album, false);
@@ -83,8 +83,8 @@ namespace Banshee.Base
             string sm_album = EscapePart (album);
 
             return String.IsNullOrEmpty (sm_artist) || String.IsNullOrEmpty (sm_album)
-                ? null 
-                : String.Format ("{0}{1}{2}", sm_artist, asUriPart ? "/" : "-", sm_album); 
+                ? null
+                : String.Format ("{0}{1}{2}", sm_artist, asUriPart ? "/" : "-", sm_album);
         }
 
         private static Regex filter_regex = new Regex (@"[^A-Za-z0-9]*", RegexOptions.Compiled);
@@ -93,22 +93,22 @@ namespace Banshee.Base
             if (String.IsNullOrEmpty (part)) {
                 return null;
             }
-            
+
             int lp_index = part.LastIndexOf ('(');
             if (lp_index > 0) {
                 part = part.Substring (0, lp_index);
             }
-            
+
             return filter_regex.Replace (part, "").ToLower ();
         }
-        
+
         private static string root_path = Path.Combine (XdgBaseDirectorySpec.GetUserDirectory (
             "XDG_CACHE_HOME", ".cache"),  "album-art");
-            
+
         static CoverArtSpec () {
             Hyena.Log.DebugFormat ("Album artwork path set to {0}", root_path);
         }
-            
+
         public static string RootPath {
             get { return root_path; }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs b/src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs
index 2a15c9f..b0f2bf7 100644
--- a/src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/FileNamePattern.cs
@@ -39,131 +39,171 @@ namespace Banshee.Base
 {
     public static class FileNamePattern
     {
-        public delegate string ExpandTokenHandler (ITrackInfo track, object replace);
+        public delegate string ExpandTokenHandler (TrackInfo track, object replace);
         public delegate string FilterHandler (string path);
-        
+
         public static FilterHandler Filter;
-        
+
         public struct Conversion
         {
-            private string token;
-            private string name;
-            private ExpandTokenHandler handler;
-            
+            private readonly string token;
+            private readonly string name;
+            private readonly ExpandTokenHandler handler;
+
+            private readonly string token_string;
+
             public Conversion (string token, string name, ExpandTokenHandler handler)
             {
                 this.token = token;
                 this.name = name;
                 this.handler = handler;
+
+                this.token_string = "%" + this.token + "%";
             }
-            
+
             public string Token {
                 get { return token; }
             }
-            
+
             public string Name {
                 get { return name; }
             }
-            
+
             public ExpandTokenHandler Handler {
                 get { return handler; }
             }
+
+            public string TokenString {
+                get { return token_string; }
+            }
         }
-    
+
         private static SortedList<string, Conversion> conversion_table;
 
         public static void AddConversion (string token, string name, ExpandTokenHandler handler)
         {
             conversion_table.Add (token, new Conversion (token, name, handler));
         }
-        
+
         static FileNamePattern ()
         {
             conversion_table = new SortedList<string, Conversion> ();
-            
+
             AddConversion ("track_artist", Catalog.GetString ("Track Artist"),
-                delegate (ITrackInfo t, object r) {
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayArtistName);
             });
 
             AddConversion ("album_artist", Catalog.GetString ("Album Artist"),
-                delegate (ITrackInfo t, object r) {
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayAlbumArtistName);
             });
 
             // Alias for %album_artist%
             AddConversion ("artist", Catalog.GetString ("Album Artist"),
-                delegate (ITrackInfo t, object r) {
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayAlbumArtistName);
             });
 
             AddConversion ("album_artist_initial", Catalog.GetString("Album Artist Initial"),
-                delegate (ITrackInfo t, object r) {
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayAlbumArtistName.Substring(0, 1));
             });
 
-            AddConversion ("genre", Catalog.GetString ("Genre"),  
-                delegate (ITrackInfo t, object r) {
+            AddConversion ("conductor", Catalog.GetString ("Conductor"),
+                delegate (TrackInfo t, object r) {
+                    return Escape (t == null ? (string)r : t.Conductor);
+            });
+
+            AddConversion ("composer", Catalog.GetString ("Composer"),
+                delegate (TrackInfo t, object r) {
+                    return Escape (t == null ? (string)r : t.Composer);
+            });
+
+            AddConversion ("genre", Catalog.GetString ("Genre"),
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayGenre);
             });
 
-            AddConversion ("album", Catalog.GetString ("Album"),  
-                delegate (ITrackInfo t, object r) {
+            AddConversion ("album", Catalog.GetString ("Album"),
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayAlbumTitle);
             });
-            
-            AddConversion ("title", Catalog.GetString ("Title"),  
-                delegate (ITrackInfo t, object r) {
+
+            AddConversion ("title", Catalog.GetString ("Title"),
+                delegate (TrackInfo t, object r) {
                     return Escape (t == null ? (string)r : t.DisplayTrackTitle);
             });
-             
-            AddConversion ("year", Catalog.GetString ("Year"),  
-                delegate (ITrackInfo t, object r) {
-                    return String.Format ("{0}", t == null ? (int)r : t.Year);
+
+            AddConversion ("year", Catalog.GetString ("Year"),
+                delegate (TrackInfo t, object r) {
+                    int year = t == null ? (int)r : t.Year;
+                    return year > 0 ? String.Format ("{0}", year) : null;
+            });
+
+            AddConversion ("track_count", Catalog.GetString ("Count"),
+                delegate (TrackInfo t, object r) {
+                    int track_count = t == null ? (int)r : t.TrackCount;
+                    return track_count > 0 ? String.Format ("{0:00}", track_count) : null;
+            });
+
+            AddConversion ("track_number", Catalog.GetString ("Number"),
+                delegate (TrackInfo t, object r) {
+                    int track_number = t == null ? (int)r : t.TrackNumber;
+                    return track_number > 0 ? String.Format ("{0:00}", track_number) : null;
             });
-             
-            AddConversion ("track_count", Catalog.GetString ("Count"),  
-                delegate (ITrackInfo t, object r) {
-                    return String.Format ("{0:00}", t == null ? (int)r : t.TrackCount);
+
+            AddConversion ("track_count_nz", Catalog.GetString ("Count (unsorted)"),
+                delegate (TrackInfo t, object r) {
+                    int track_count = t == null ? (int)r : t.TrackCount;
+                    return track_count > 0 ? String.Format ("{0}", track_count) : null;
             });
-             
-            AddConversion ("track_number", Catalog.GetString ("Number"),  
-                delegate (ITrackInfo t, object r) {
-                    return String.Format ("{0:00}", t == null ? (int)r : t.TrackNumber);
+
+            AddConversion ("track_number_nz", Catalog.GetString ("Number (unsorted)"),
+                delegate (TrackInfo t, object r) {
+                    int track_number = t == null ? (int)r : t.TrackNumber;
+                    return track_number > 0 ? String.Format ("{0}", track_number) : null;
             });
-             
-            AddConversion ("track_count_nz", Catalog.GetString ("Count (unsorted)"),  
-                delegate (ITrackInfo t, object r) {
-                    return String.Format ("{0}", t == null ? (int)r : t.TrackCount);
+
+            AddConversion ("disc_count", Catalog.GetString ("Disc Count"),
+                delegate (TrackInfo t, object r) {
+                    int disc_count = t == null ? (int)r : t.DiscCount;
+                    return disc_count > 0 ? String.Format ("{0}", disc_count) : null;
             });
-             
-            AddConversion ("track_number_nz", Catalog.GetString ("Number (unsorted)"),  
-                delegate (ITrackInfo t, object r) {
-                    return String.Format ("{0}", t == null ? (int)r : t.TrackNumber);
+
+            AddConversion ("disc_number", Catalog.GetString ("Disc Number"),
+                delegate (TrackInfo t, object r) {
+                    int disc_number = t == null ? (int)r : t.DiscNumber;
+                    return disc_number > 0 ? String.Format ("{0}", disc_number) : null;
             });
-            
+
+            AddConversion ("grouping", Catalog.GetString ("Grouping"),
+                delegate (TrackInfo t, object r) {
+                    return Escape (t == null ? (string)r : t.Grouping);
+            });
+
             AddConversion ("path_sep", Path.DirectorySeparatorChar.ToString (),
-                delegate (ITrackInfo t, object r) {
+                delegate (TrackInfo t, object r) {
                     return Path.DirectorySeparatorChar.ToString ();
             });
         }
-        
+
         public static IEnumerable<Conversion> PatternConversions {
             get { return conversion_table.Values; }
         }
-        
+
         public static string DefaultFolder {
             get { return "%album_artist%%path_sep%%album%"; }
         }
-        
+
         public static string DefaultFile {
             get { return "%track_number%. %title%"; }
         }
-        
+
         public static string DefaultPattern {
             get { return CreateFolderFilePattern (DefaultFolder, DefaultFile); }
         }
-        
+
         private static string [] suggested_folders = new string [] {
             DefaultFolder,
             "%album_artist%%path_sep%%album_artist% - %album%",
@@ -172,11 +212,11 @@ namespace Banshee.Base
             "%album%",
             "%album_artist%"
         };
-        
+
         public static string [] SuggestedFolders {
             get { return suggested_folders; }
         }
-    
+
         private static string [] suggested_files = new string [] {
             DefaultFile,
             "%track_number%. %track_artist% - %title%",
@@ -185,20 +225,20 @@ namespace Banshee.Base
             "%track_artist% (%album%) - %track_number% - %title%",
             "%title%"
         };
-        
+
         public static string [] SuggestedFiles {
             get { return suggested_files; }
         }
-        
+
         private static string OnFilter (string input)
         {
             string repl_pattern = input;
-            
+
             FilterHandler filter_handler = Filter;
             if (filter_handler != null) {
                 repl_pattern = filter_handler (repl_pattern);
             }
-            
+
             return repl_pattern;
         }
 
@@ -209,14 +249,11 @@ namespace Banshee.Base
 
         public static string CreatePatternDescription (string pattern)
         {
-            string repl_pattern = pattern;
-            foreach (Conversion conversion in PatternConversions) {
-                repl_pattern = repl_pattern.Replace ("%" + conversion.Token + "%", conversion.Name);
-            }
-            return OnFilter (repl_pattern);
+            pattern = Convert (pattern, conversion => conversion.Name);
+            return OnFilter (pattern);
         }
 
-        public static string CreateFromTrackInfo (ITrackInfo track)
+        public static string CreateFromTrackInfo (TrackInfo track)
         {
             string pattern = null;
 
@@ -231,22 +268,43 @@ namespace Banshee.Base
             return CreateFromTrackInfo (pattern, track);
         }
 
-        public static string CreateFromTrackInfo (string pattern, ITrackInfo track)
+        public static string CreateFromTrackInfo (string pattern, TrackInfo track)
         {
-            string repl_pattern;
-
             if (pattern == null || pattern.Trim () == String.Empty) {
-                repl_pattern = DefaultPattern;
-            } else {
-                repl_pattern = pattern;
+                pattern = DefaultPattern;
             }
 
+            pattern = Convert (pattern, conversion => conversion.Handler (track, null));
+
+            return OnFilter (pattern);
+        }
+
+        private static Regex optional_tokens_regex = new Regex ("{([^}]*)}", RegexOptions.Compiled);
+
+        public static string Convert (string pattern, Func<Conversion, string> handler)
+        {
+            pattern = optional_tokens_regex.Replace (pattern, delegate (Match match) {
+                var sub_pattern = match.Groups[1].Value;
+                foreach (var conversion in PatternConversions) {
+                    var token_string = conversion.TokenString;
+                    if (!sub_pattern.Contains (token_string)) {
+                        continue;
+                    }
+                    var replacement = handler (conversion);
+                    if (String.IsNullOrEmpty (replacement)) {
+                        sub_pattern = String.Empty;
+                        break;
+                    }
+                    sub_pattern = sub_pattern.Replace (token_string, replacement);
+                }
+                return sub_pattern;
+            });
+
             foreach (Conversion conversion in PatternConversions) {
-                repl_pattern = repl_pattern.Replace ("%" + conversion.Token + "%", 
-                    conversion.Handler (track, null));
+                pattern = pattern.Replace (conversion.TokenString, handler (conversion));
             }
-            
-            return OnFilter (repl_pattern);
+
+            return pattern;
         }
 
         public static string BuildFull (string base_dir, TrackInfo track)
@@ -254,24 +312,24 @@ namespace Banshee.Base
             return BuildFull (base_dir, track, Path.GetExtension (track.Uri.ToString ()));
         }
 
-        public static string BuildFull (string base_dir, ITrackInfo track, string ext)
+        public static string BuildFull (string base_dir, TrackInfo track, string ext)
         {
             if (ext == null || ext.Length < 1) {
                 ext = String.Empty;
             } else if (ext[0] != '.') {
                 ext = String.Format (".{0}", ext);
             }
-            
+
             string songpath = CreateFromTrackInfo (track) + ext;
             songpath = Hyena.StringUtil.EscapePath (songpath);
-            string dir = Path.GetFullPath (Path.Combine (base_dir, 
+            string dir = Path.GetFullPath (Path.Combine (base_dir,
                 Path.GetDirectoryName (songpath)));
             string filename = Path.Combine (dir, Path.GetFileName (songpath));
-                
+
             if (!Banshee.IO.Directory.Exists (dir)) {
                 Banshee.IO.Directory.Create (dir);
             }
-            
+
             return filename;
         }
 
diff --git a/src/Core/Banshee.Core/Banshee.Base/Localization.cs b/src/Core/Banshee.Core/Banshee.Base/Localization.cs
index 4a30fe4..8036d6d 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Localization.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Localization.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <abockover at novell.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Xml;
 using System.Xml.XPath;
@@ -35,49 +35,49 @@ using System.Runtime.InteropServices;
 namespace Banshee.Base
 {
     public static class Localization
-    {        
+    {
         private static string [] default_languages = { "C" };
         private static string [] instance_languages = null;
         private static string [] instance_xml_languages = null;
         private static XPathExpression [] instance_xpath_expressions = null;
-        
+
         public static string [] Languages {
             get {
                 if(instance_languages == null) {
                     instance_languages = GetLanguageNames();
                 }
-                
+
                 return instance_languages;
             }
         }
-        
+
         public static string [] XmlLanguages {
-            get { 
+            get {
                 if(instance_xml_languages != null) {
                     return instance_xml_languages;
                 }
-                
+
                 List<string> xml_langs = new List<string>();
                 bool prepend_empty = false;
                 bool first = true;
-                
+
                 foreach(string lang in Languages) {
                     if(first && (lang == "C" || lang.StartsWith("en_US"))) {
                         prepend_empty = true;
                     }
-                    
+
                     first = false;
                     xml_langs.Add(lang);
                 }
-                
+
                 if(prepend_empty) {
                     xml_langs.Insert(0, "");
                 } else {
                     xml_langs.Add("");
                 }
-                
+
                 instance_xml_languages = xml_langs.ToArray();
-                
+
                 return instance_xml_languages;
             }
         }
@@ -98,12 +98,12 @@ namespace Banshee.Base
                 return instance_xpath_expressions;
             }
         }
-        
+
         public static XmlNode SelectSingleNode(XmlNode parent, string query)
         {
             XmlNodeList list = parent.SelectNodes(query);
             XmlNode result = null;
-            
+
             foreach(XPathExpression xpath_exp in XPathExpressions) {
                 foreach(XmlNode child in list) {
                     XPathNavigator nav = child.CreateNavigator();
@@ -113,20 +113,20 @@ namespace Banshee.Base
                         break;
                     }
                 }
-                
+
                 if(result != null) {
                     break;
                 }
             }
-            
+
             return result;
         }
-        
+
         public static List<XmlNode> SelectNodes(XmlNode parent, string query)
         {
             XmlNodeList list = parent.SelectNodes(query);
             List<XmlNode> result = new List<XmlNode>();
-            
+
             foreach(XPathExpression xpath_exp in XPathExpressions) {
                 foreach(XmlNode child in list) {
                     XPathNavigator nav = child.CreateNavigator();
@@ -136,10 +136,10 @@ namespace Banshee.Base
                     }
                 }
             }
-            
+
             return result;
         }
-        
+
         [DllImport("libglib-2.0-0.dll")]
         private static extern IntPtr g_get_language_names();
 
diff --git a/src/Core/Banshee.Core/Banshee.Base/NamingUtil.cs b/src/Core/Banshee.Core/Banshee.Base/NamingUtil.cs
index d614942..66a4357 100644
--- a/src/Core/Banshee.Core/Banshee.Base/NamingUtil.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/NamingUtil.cs
@@ -37,33 +37,33 @@ namespace Banshee.Base
     public static class NamingUtil
     {
         public delegate bool PostfixDuplicateIncrementHandler (string check);
-    
+
         public static string GenerateTrackCollectionName (IEnumerable tracks, string fallback)
         {
             Dictionary<string, int> weight_map = new Dictionary<string, int> ();
-            
+
             if (tracks == null) {
                 return fallback;
             }
-            
+
             foreach (TrackInfo track in tracks) {
                 string artist = null;
                 string album = null;
-                
+
                 if (track.ArtistName != null) {
                     artist = track.ArtistName.Trim ();
                     if (artist == String.Empty) {
                         artist = null;
                     }
                 }
-                
+
                 if (track.AlbumTitle != null) {
                     album = track.AlbumTitle.Trim ();
                     if (album == String.Empty) {
                         album = null;
                     }
                 }
-                
+
                 if (artist != null && album != null) {
                     IncrementCandidate (weight_map, "\0" + artist + " - " + album);
                     IncrementCandidate (weight_map, artist);
@@ -74,13 +74,13 @@ namespace Banshee.Base
                     IncrementCandidate (weight_map, album);
                 }
             }
-            
+
             int max_hit_count = 0;
             string max_candidate = fallback;
-            
+
             List<string> sorted_keys = new List<string> (weight_map.Keys);
             sorted_keys.Sort ();
-            
+
             foreach (string candidate in sorted_keys) {
                 int current_hit_count = weight_map[candidate];
                 if (current_hit_count > max_hit_count) {
@@ -88,14 +88,14 @@ namespace Banshee.Base
                     max_candidate = candidate;
                 }
             }
-            
+
             if (max_candidate[0] == '\0') {
                 return max_candidate.Substring (1);
             }
-            
+
             return max_candidate;
         }
-        
+
         private static void IncrementCandidate (Dictionary<string, int> map, string hit)
         {
             if (map.ContainsKey (hit)) {
@@ -104,19 +104,19 @@ namespace Banshee.Base
                 map.Add (hit, 1);
             }
         }
-        
+
         public static string PostfixDuplicate (string prefix, PostfixDuplicateIncrementHandler duplicateHandler)
         {
             if (duplicateHandler == null) {
                 throw new ArgumentNullException ("A PostfixDuplicateIncrementHandler delegate must be given");
             }
-            
+
             string name = prefix;
             for (int i = 1; true; i++) {
                 if (!duplicateHandler (name)) {
                     return name;
                 }
-                
+
                 name = prefix + " " + i;
             }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Base/Paths.cs b/src/Core/Banshee.Core/Banshee.Base/Paths.cs
index 9cf8874..256ace3 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Paths.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Paths.cs
@@ -31,7 +31,7 @@ using System.IO;
 using Mono.Unix;
 
 using Banshee.Configuration.Schema;
- 
+
 namespace Banshee.Base
 {
     public class Paths
@@ -40,16 +40,16 @@ namespace Banshee.Base
         {
             return GetTempFileName (dir, null);
         }
-        
+
         public static string GetTempFileName (string dir, string extension)
         {
             return GetTempFileName (new DirectoryInfo (dir), extension);
         }
-        
+
         public static string GetTempFileName (DirectoryInfo dir, string extension)
         {
             string path = null;
-            
+
             if (dir == null || !dir.Exists) {
                 throw new DirectoryNotFoundException ();
             }
@@ -59,10 +59,10 @@ namespace Banshee.Base
                 string file = extension == null ? guid : String.Format ("{0}.{1}", guid, extension);
                 path = Path.Combine (dir.FullName, file);
             } while (File.Exists (path));
-        
+
             return path;
         }
-        
+
         public static string Combine (string first, params string [] components)
         {
             if (String.IsNullOrEmpty (first)) {
@@ -70,13 +70,13 @@ namespace Banshee.Base
             } else if (components == null || components.Length < 1) {
                 throw new ArgumentException ("One or more path components must be provided", "components");
             }
-            
+
             string result = first;
-            
+
             foreach (string component in components) {
                 result = Path.Combine (result, component);
             }
-            
+
             return result;
         }
 
@@ -107,57 +107,57 @@ namespace Banshee.Base
             // this is super lame, should handle quoting/escaping
             return path.Split (':');
         }
-        
+
         public static string MakePathRelative (string path, string to)
         {
             if (String.IsNullOrEmpty (path) || String.IsNullOrEmpty (to)) {
                 return null;
             }
-            
+
             if (path == to) {
                 return String.Empty;
             }
-            
+
             if (to[to.Length - 1] != Path.DirectorySeparatorChar) {
                 to = to + Path.DirectorySeparatorChar;
             }
-            
+
             if (path.Length < to.Length) {
                 return null;
             }
-            
+
             return path.StartsWith (to)
                 ? path.Substring (to.Length)
                 : null;
         }
-        
+
         private static string legacy_application_data = Path.Combine (Environment.GetFolderPath (
             Environment.SpecialFolder.ApplicationData), "banshee");
-    
+
         public static string LegacyApplicationData {
             get { return legacy_application_data; }
         }
-        
+
         private static string application_data = Path.Combine (Environment.GetFolderPath (
             Environment.SpecialFolder.ApplicationData), "banshee-1");
-        
+
         public static string ApplicationData {
-            get { 
+            get {
                 if (!Directory.Exists (application_data)) {
                     Directory.CreateDirectory (application_data);
                 }
-                
-                return application_data; 
+
+                return application_data;
             }
         }
-        
+
         private static string application_cache = Path.Combine (XdgBaseDirectorySpec.GetUserDirectory (
             "XDG_CACHE_HOME", ".cache"), "banshee-1");
-        
+
         public static string ApplicationCache {
             get { return application_cache; }
         }
-        
+
         public static string ExtensionCacheRoot {
             get { return Path.Combine (ApplicationCache, "extensions"); }
         }
@@ -165,50 +165,50 @@ namespace Banshee.Base
         public static string SystemTempDir {
             get { return "/tmp/"; }
         }
-        
+
         public static string TempDir {
             get {
                 string dir = Path.Combine (ApplicationCache, "temp");
-        
+
                 if (File.Exists (dir)) {
                     File.Delete (dir);
                 }
-                
+
                 Directory.CreateDirectory (dir);
                 return dir;
             }
         }
-        
+
         private static string installed_application_prefix = null;
         public static string InstalledApplicationPrefix {
             get {
                 if (installed_application_prefix == null) {
                     installed_application_prefix = Path.GetDirectoryName (
                         System.Reflection.Assembly.GetExecutingAssembly ().Location);
-                    
+
                     if (Directory.Exists (Paths.Combine (installed_application_prefix, "share", "banshee-1"))) {
                         return installed_application_prefix;
                     }
-                        
+
                     DirectoryInfo entry_directory = new DirectoryInfo (installed_application_prefix);
-                    
+
                     if (entry_directory != null && entry_directory.Parent != null && entry_directory.Parent.Parent != null) {
                         installed_application_prefix = entry_directory.Parent.Parent.FullName;
                     }
                 }
-                
+
                 return installed_application_prefix;
             }
         }
-        
+
         public static string InstalledApplicationDataRoot {
             get { return Path.Combine (InstalledApplicationPrefix, "share"); }
         }
-        
+
         public static string InstalledApplicationData {
             get { return Path.Combine (InstalledApplicationDataRoot, "banshee-1"); }
         }
-        
+
         public static string GetInstalledDataDirectory (string path)
         {
             return Path.Combine (InstalledApplicationData, path);
diff --git a/src/Core/Banshee.Core/Banshee.Base/PlatformHacks.cs b/src/Core/Banshee.Core/Banshee.Base/PlatformHacks.cs
index d11073e..7f6f689 100644
--- a/src/Core/Banshee.Core/Banshee.Base/PlatformHacks.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/PlatformHacks.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlatformHacks.cs
 //
 // Author:
@@ -37,34 +37,34 @@ namespace Banshee.Base
         // For the SEGV trap hack (see below)
         [DllImport ("libc")]
         private static extern int sigaction (Mono.Unix.Native.Signum sig, IntPtr act, IntPtr oact);
-        
+
         private static IntPtr mono_jit_segv_handler = IntPtr.Zero;
-        
+
         public static void TrapMonoJitSegv ()
         {
             if (Environment.OSVersion.Platform != PlatformID.Unix) {
                 return;
             }
-        
-            // We must get a reference to the JIT's SEGV handler because 
+
+            // We must get a reference to the JIT's SEGV handler because
             // GStreamer will set its own and not restore the previous, which
             // will cause what should be NullReferenceExceptions to be unhandled
             // segfaults for the duration of the instance, as the JIT is powerless!
             // FIXME: http://bugzilla.gnome.org/show_bug.cgi?id=391777
-            
+
             try {
                 mono_jit_segv_handler = Marshal.AllocHGlobal (512);
                 sigaction (Mono.Unix.Native.Signum.SIGSEGV, IntPtr.Zero, mono_jit_segv_handler);
             } catch {
             }
         }
-        
+
         public static void RestoreMonoJitSegv ()
         {
             if (Environment.OSVersion.Platform != PlatformID.Unix || mono_jit_segv_handler.Equals (IntPtr.Zero)) {
                 return;
             }
-            
+
             // Reset the SEGV handle to that of the JIT again (SIGH!)
             try {
                 sigaction (Mono.Unix.Native.Signum.SIGSEGV, mono_jit_segv_handler, IntPtr.Zero);
@@ -72,10 +72,10 @@ namespace Banshee.Base
             } catch {
             }
         }
-        
+
         [DllImport ("libc")] // Linux
         private static extern int prctl (int option, byte [] arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5);
-        
+
         [DllImport ("libc")] // BSD
         private static extern void setproctitle (byte [] fmt, byte [] str_arg);
 
@@ -84,19 +84,19 @@ namespace Banshee.Base
             if (Environment.OSVersion.Platform != PlatformID.Unix) {
                 return;
             }
-        
+
             try {
-                if (prctl (15 /* PR_SET_NAME */, Encoding.ASCII.GetBytes (name + "\0"), 
+                if (prctl (15 /* PR_SET_NAME */, Encoding.ASCII.GetBytes (name + "\0"),
                     IntPtr.Zero, IntPtr.Zero, IntPtr.Zero) != 0) {
-                    throw new ApplicationException ("Error setting process name: " + 
+                    throw new ApplicationException ("Error setting process name: " +
                         Mono.Unix.Native.Stdlib.GetLastError ());
                 }
             } catch (EntryPointNotFoundException) {
-                setproctitle (Encoding.ASCII.GetBytes ("%s\0"), 
+                setproctitle (Encoding.ASCII.GetBytes ("%s\0"),
                     Encoding.ASCII.GetBytes (name + "\0"));
             }
         }
-        
+
         public static void TrySetProcessName (string name)
         {
             try {
diff --git a/src/Core/Banshee.Core/Banshee.Base/ProductInformation.cs b/src/Core/Banshee.Core/Banshee.Base/ProductInformation.cs
index 81445bb..ae24e8e 100644
--- a/src/Core/Banshee.Core/Banshee.Base/ProductInformation.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/ProductInformation.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Collections.Generic;
 using System.Xml;
@@ -35,11 +35,11 @@ namespace Banshee.Base
     public static class ProductInformation
     {
         private static SortedList<string, ProductAuthor> authors = new SortedList<string, ProductAuthor>  ();
-        private static SortedList<string, ProductTranslation> translations 
+        private static SortedList<string, ProductTranslation> translations
             = new SortedList<string, ProductTranslation> ();
         private static string [] artists;
         private static string [] contributors;
-        
+
         static ProductInformation ()
         {
         //    try {
@@ -48,22 +48,22 @@ namespace Banshee.Base
        //     } catch {
      //       }
         }
-        
+
         private static void LoadContributors ()
         {
             List<string> artists_list = new List<string> ();
             List<string> contributors_list = new List<string> ();
-        
+
             XmlDocument doc = new XmlDocument ();
             doc.LoadXml (AssemblyResource.GetFileContents ("contributors.xml"));
-        
+
             foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
                 if (node.FirstChild == null || node.FirstChild.Value == null) {
                     continue;
                 }
 
                 string name = node.FirstChild.Value.Trim ();
-                
+
                 switch (node.Name) {
                     case "author":
                         authors.Add (name, new ProductAuthor (name, node.Attributes["role"].Value));
@@ -78,122 +78,122 @@ namespace Banshee.Base
                         break;
                 }
             }
-            
+
             artists = artists_list.ToArray ();
             contributors = contributors_list.ToArray ();
-            
+
             Array.Sort (artists);
             Array.Sort (contributors);
         }
-        
+
         private static void LoadTranslators ()
         {
             XmlDocument doc = new XmlDocument ();
             doc.LoadXml (AssemblyResource.GetFileContents ("translators.xml"));
-        
+
             foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
                 if (node.Name != "language") {
                     continue;
                 }
-                
+
                 try {
                     string language_code = node.Attributes["code"].Value.Trim ();
                     string language_name = node.Attributes["name"].Value.Trim ();
-                    
+
                     ProductTranslation translation = new ProductTranslation (language_code, language_name);
-                    
+
                     foreach (XmlNode person in node.ChildNodes) {
                         if (person.Name != "person") {
                             continue;
                         }
-                        
+
                         translation.AddTranslator (person.FirstChild.Value.Trim ());
                     }
-                    
+
                     translations.Add (language_name, translation);
                 } catch {
                 }
             }
         }
-        
+
         public static IEnumerable<ProductTranslation> Translations {
             get { return translations.Values; }
         }
-        
+
         public static IEnumerable<ProductAuthor> Authors {
             get { return authors.Values; }
         }
-        
+
         public static string [] Contributors {
             get { return contributors; }
         }
-        
+
         public static string [] Artists {
             get { return artists; }
         }
-        
+
         public static string License {
             get { return AssemblyResource.GetFileContents ("COPYING"); }
         }
     }
-    
+
     public class ProductTranslation
     {
         private string language_code;
         private string language_name;
         private SortedList<string, string> translators = new SortedList<string, string> ();
-        
+
         private ProductTranslation ()
         {
         }
-        
+
         internal ProductTranslation (string languageCode, string languageName)
         {
             language_code = languageCode;
             language_name = languageName;
         }
-        
+
         internal void AddTranslator (string translator)
         {
             translators.Add (translator, translator);
         }
-        
+
         public string LanguageCode {
             get { return language_code; }
         }
-        
+
         public string LanguageName {
             get { return language_name; }
         }
-        
+
         public IEnumerable<string> Translators {
             get { return translators.Values; }
         }
     }
-    
+
     public class ProductAuthor
     {
         private string name;
         private string role;
-        
+
         private ProductAuthor ()
         {
         }
-        
+
         internal ProductAuthor (string name, string role)
         {
             if (name == null || role == null) {
                 throw new ArgumentNullException ("name or role cannot be null");
             }
-            
+
             this.name = name;
             this.role = role;
         }
-        
+
         public string Name {
             get { return name; }
         }
-        
+
         public string Role {
             get { return role; }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Base/Resource.cs b/src/Core/Banshee.Core/Banshee.Base/Resource.cs
index 6de004a..9dde175 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Resource.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Resource.cs
@@ -38,7 +38,7 @@ namespace Banshee.Base
         {
             return GetFileContents (Assembly.GetCallingAssembly (), name);
         }
-        
+
         public static string GetFileContents (Assembly assembly, string name)
         {
             using (StreamReader reader = new StreamReader (assembly.GetManifestResourceStream (name))) {
diff --git a/src/Core/Banshee.Core/Banshee.Base/SafeUri.cs b/src/Core/Banshee.Core/Banshee.Base/SafeUri.cs
index e6c8f34..4ab9bd1 100644
--- a/src/Core/Banshee.Core/Banshee.Base/SafeUri.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/SafeUri.cs
@@ -5,31 +5,31 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Runtime.InteropServices;
 
-namespace Banshee.Base 
+namespace Banshee.Base
 {
     public class SafeUri
     {
@@ -38,14 +38,14 @@ namespace Banshee.Base
             Yes,
             No
         }
-        
+
         private static int MAX_SCHEME_LENGTH = 6;
 
         private string uri;
         private string local_path;
         private string scheme;
         private LocalPathCheck local_path_check = LocalPathCheck.NotPerformed;
-        
+
         public SafeUri (string uri)
         {
             int scheme_delimit_index = uri.IndexOf ("://");
@@ -55,7 +55,7 @@ namespace Banshee.Base
                 this.uri = FilenameToUri (uri);
             }
         }
-        
+
         public SafeUri (string uri, bool isUri)
         {
             if (isUri) {
@@ -64,7 +64,7 @@ namespace Banshee.Base
                 this.uri = FilenameToUri (uri);
             }
         }
-        
+
         public SafeUri (Uri uri)
         {
             this.uri = uri.AbsoluteUri;
@@ -83,46 +83,46 @@ namespace Banshee.Base
 
             string uri = GLib.Marshaller.Utf8PtrToString (uri_ptr);
             GLib.Marshaller.Free (uri_ptr);
-            
+
             return uri;
         }
-        
+
         public static string UriToFilename (string uri)
         {
             // TODO: replace with managed conversion to avoid marshalling
             IntPtr uri_ptr = GLib.Marshaller.StringToPtrGStrdup (uri);
             IntPtr path_ptr = g_filename_from_uri (uri_ptr, IntPtr.Zero, IntPtr.Zero);
             GLib.Marshaller.Free (uri_ptr);
-            
+
             if (path_ptr == IntPtr.Zero) {
                 throw new ApplicationException ("URI could not be converted to local file location");
             }
-            
+
             string path = GLib.Marshaller.Utf8PtrToString (path_ptr);
             GLib.Marshaller.Free (path_ptr);
-            
+
             return path;
         }
-        
+
         public static string UriToFilename (SafeUri uri)
         {
             return UriToFilename (uri.AbsoluteUri);
         }
-        
+
         public override string ToString ()
         {
             return AbsoluteUri;
         }
-        
+
         public override bool Equals (object o)
         {
             if (!(o is SafeUri)) {
                 return false;
             }
-            
+
             return (o as SafeUri).AbsoluteUri == AbsoluteUri;
         }
-        
+
         public override int GetHashCode ()
         {
             return AbsoluteUri.GetHashCode ();
@@ -131,7 +131,7 @@ namespace Banshee.Base
         public string AbsoluteUri {
             get { return uri; }
         }
-        
+
         public bool IsLocalPath {
             get {
                 if (local_path_check == LocalPathCheck.NotPerformed) {
@@ -143,39 +143,39 @@ namespace Banshee.Base
                         return false;
                     }
                 }
-                
+
                 return local_path_check == LocalPathCheck.Yes;
             }
-        }               
-        
+        }
+
         public string AbsolutePath {
             get {
                 if (local_path == null && IsLocalPath) {
                     local_path = UriToFilename (uri);
                 }
-                
+
                 return local_path;
             }
         }
-        
+
         public string LocalPath {
             get { return AbsolutePath; }
         }
-        
+
         public string Scheme {
             get {
                 if (scheme == null) {
                     scheme = uri.Substring (0, uri.IndexOf ("://"));
                 }
-                
+
                 return scheme;
             }
         }
-        
+
         public bool IsFile {
             get { return Scheme == System.Uri.UriSchemeFile; }
         }
-        
+
         [DllImport ("libglib-2.0-0.dll")]
         private static extern IntPtr g_filename_to_uri (IntPtr filename, IntPtr hostname, IntPtr error);
 
diff --git a/src/Core/Banshee.Core/Banshee.Base/Tests/CoverArtSpecTests.cs b/src/Core/Banshee.Core/Banshee.Base/Tests/CoverArtSpecTests.cs
index 597f09e..5335c3d 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Tests/CoverArtSpecTests.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Tests/CoverArtSpecTests.cs
@@ -40,20 +40,20 @@ namespace Banshee.Base.Tests
         {
             Assert.AreEqual (expected, CoverArtSpec.EscapePart (original));
         }
-        
+
         [Test]
         public void TestEmpty ()
         {
             AssertEscaped (null, null);
             AssertEscaped ("", null);
         }
-        
+
         [Test]
         public void TestLowercased ()
         {
             AssertEscaped ("A", "a");
         }
-        
+
         [Test]
         public void TestUnwanted ()
         {
@@ -76,12 +76,12 @@ namespace Banshee.Base.Tests
             AssertEscaped ("`", "");
             AssertEscaped ("'", "");
             AssertEscaped ("\"", "");
-            
+
             // Banshee-specific: strip *everything* non-ASCII
             AssertEscaped ("\u00e9toile", "toile");
             AssertEscaped ("e\u0301", "e");
         }
-        
+
         [Test]
         public void TestStripNotes ()
         {
diff --git a/src/Core/Banshee.Core/Banshee.Base/Tests/FileNamePatternTests.cs b/src/Core/Banshee.Core/Banshee.Base/Tests/FileNamePatternTests.cs
index 5913663..4227d7d 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Tests/FileNamePatternTests.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Tests/FileNamePatternTests.cs
@@ -54,22 +54,76 @@ namespace Banshee.Base.Tests
             Assert.AreEqual (null,  Paths.MakePathRelative ("/foo/bar/baz", "foo"));
             Assert.AreEqual (null,  Paths.MakePathRelative ("/fo", "/foo"));
         }
-    
+
         [Test]
         public void CreateFromTrackInfo()
         {
             SampleTrackInfo track = new SampleTrackInfo();
             string built = FileNamePattern.CreateFromTrackInfo(
-                "%artist%:%album%:%title%:%track_number%:" + 
+                "%artist%:%album%:%title%:%track_number%:" +
                 "%track_count%:%track_number_nz%:%track_count_nz%",
                 track);
-    
+
             Assert.AreEqual(String.Format("{0}:{1}:{2}:{3}:{4}:{5}:{6}",
-                track.ArtistName, track.AlbumTitle, track.TrackTitle, 
+                track.ArtistName, track.AlbumTitle, track.TrackTitle,
                 ZeroPad(track.TrackNumber), ZeroPad(track.TrackCount),
                 track.TrackNumber, track.TrackCount),
                 built);
         }
+
+        [Test]
+        public void OptionalTokens ()
+        {
+            var track = new TrackInfo {
+                ArtistName = "Esoteric",
+                AlbumTitle = "The Maniacal Vale",
+                TrackTitle = "Silence",
+                DiscNumber = 2,
+                DiscCount = 2,
+                TrackNumber = 1,
+                Year = 2008,
+                Grouping = ""
+            };
+            var pattern =
+                "{%grouping%%path_sep%}" +
+                "%album_artist%%path_sep%" +
+                "{%year% }%album%{ (disc %disc_number% of %disc_count%)}%path_sep%" +
+                "{%track_number%. }%title%.oga";
+            Assert.AreEqual (
+                "Esoteric/2008 The Maniacal Vale (disc 2 of 2)/01. Silence.oga",
+                FileNamePattern.Convert (pattern, conversion => conversion.Handler (track, null)));
+        }
+
+        [Test]
+        public void OptionalTokenShouldBeEmptyIfZero ()
+        {
+            var track = new TrackInfo {
+                DiscNumber = 0
+            };
+            var pattern = "{ (disc %disc_number%)}";
+            Assert.IsEmpty (FileNamePattern.Convert (pattern, conversion => conversion.Handler (track, null)));
+        }
+
+        [Test]
+        public void OptionalTokenShouldBeEmptyIfEmpty ()
+        {
+            var track = new TrackInfo {
+                Genre = ""
+            };
+            var pattern = "{ (%genre%)}";
+            Assert.IsEmpty (FileNamePattern.Convert (pattern, conversion => conversion.Handler (track, null)));
+        }
+
+        [Test]
+        public void OptionalTokenShouldBeEmptyIfOnlyOneIsZero ()
+        {
+            var track = new TrackInfo {
+                DiscNumber = 0,
+                DiscCount = 2
+            };
+            var pattern = "{ (disc %disc_number% of %disc_count%)}";
+            Assert.IsEmpty (FileNamePattern.Convert (pattern, conversion => conversion.Handler (track, null)));
+        }
     }
 }
 
diff --git a/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs b/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
index bc3e699..8a94b8b 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
@@ -43,29 +43,29 @@ using Hyena.Tests;
 namespace Banshee.Base.Tests
 {
     // FIXME: These tests don't really belong here
-    
+
     [TestFixture]
     public class TaglibReadWriteTests : TestBase
     {
         private string [] files;
-        
+
         [TestFixtureSetUp]
         public void Setup ()
         {
             Mono.Addins.AddinManager.Initialize (BinDir);
-            
+
             files = new string [] {
                 Path.Combine (TestsDir, "data/test.mp3")
             };
         }
-    
+
         [Test]
         public void TestSystemIO ()
         {
             Banshee.IO.Provider.SetProvider (new Banshee.IO.SystemIO.Provider ());
             WriteMetadata (files, ChangeTrack, VerifyTrack);
         }
-    
+
         [Test]
         public void TestUnixIO ()
         {
@@ -158,9 +158,9 @@ namespace Banshee.Base.Tests
                 AssertForEach<string> (files, delegate (string uri) {
                     string extension = System.IO.Path.GetExtension (uri);
                     newuri = new SafeUri (Path.Combine (TestsDir, "data/test_write." + extension));
-    
+
                     Banshee.IO.File.Copy (new SafeUri (uri), newuri, true);
-    
+
                     ChangeAndVerify (newuri, change, verify);
                 });
             } finally {
@@ -169,25 +169,25 @@ namespace Banshee.Base.Tests
                     Banshee.IO.File.Delete (newuri);
             }
         }
-    
+
         private void ChangeAndVerify (SafeUri uri, Action<TrackInfo> change, Action<TrackInfo> verify)
         {
             TagLib.File file = StreamTagger.ProcessUri (uri);
             TrackInfo track = new TrackInfo ();
             StreamTagger.TrackInfoMerge (track, file);
-    
+
             // Make changes
             change (track);
-    
+
             // Save changes
-            bool saved = StreamTagger.SaveToFile (track);
+            bool saved = StreamTagger.SaveToFile (track, true, true);
             Assert.IsTrue (saved);
-    
+
             // Read changes
             file = StreamTagger.ProcessUri (uri);
             track = new TrackInfo ();
-            StreamTagger.TrackInfoMerge (track, file);
-    
+            StreamTagger.TrackInfoMerge (track, file, false, true);
+
             // Verify changes
             verify (track);
         }
@@ -200,6 +200,8 @@ namespace Banshee.Base.Tests
             track.TrackNumber = 4;
             track.DiscNumber = 4;
             track.Year = 1999;
+            track.Rating = 2;
+            track.PlayCount = 3;
         }
 
         private void VerifyTrack (TrackInfo track)
@@ -210,17 +212,19 @@ namespace Banshee.Base.Tests
             Assert.AreEqual (4, track.TrackNumber);
             Assert.AreEqual (4, track.DiscNumber);
             Assert.AreEqual (1999, track.Year);
+            Assert.AreEqual (2, track.Rating);
+            Assert.AreEqual (3, track.PlayCount);
         }
 
         private Type unix_io_type;
-    
+
         private Banshee.IO.IProvider CreateUnixIOProvider ()
         {
             if (unix_io_type == null) {
                 Assembly asm = Assembly.LoadFrom (BinDir + "/Banshee.Unix.dll");
                 unix_io_type = asm.GetType ("Banshee.IO.Unix.Provider");
             }
-            
+
             return (Banshee.IO.IProvider)Activator.CreateInstance (unix_io_type);
         }
     }
diff --git a/src/Core/Banshee.Core/Banshee.Base/UriList.cs b/src/Core/Banshee.Core/Banshee.Base/UriList.cs
index 8c3ae1f..a5caa68 100644
--- a/src/Core/Banshee.Core/Banshee.Base/UriList.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/UriList.cs
@@ -6,24 +6,24 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -34,10 +34,10 @@ using System.Collections.Generic;
 
 namespace Banshee.Base
 {
-    public class UriList : List<SafeUri> 
+    public class UriList : List<SafeUri>
     {
         public UriList (string [] uris)
-        {    
+        {
             // FIXME this is so lame do real chacking at some point
             foreach (string str in uris) {
                 SafeUri uri;
@@ -47,23 +47,23 @@ namespace Banshee.Base
                 } else {
                     uri = new SafeUri (str);
                 }
-                
+
                 Add (uri);
             }
         }
 
-        public UriList (string data) 
+        public UriList (string data)
         {
             LoadFromString (data);
         }
-        
-        /*public UriList (Gtk.SelectionData selection) 
+
+        /*public UriList (Gtk.SelectionData selection)
         {
             // FIXME this should check the atom etc.
             LoadFromString (System.Text.Encoding.UTF8.GetString (selection.Data));
         }*/
 
-        private void LoadFromString (string data) 
+        private void LoadFromString (string data)
         {
             string [] items = data.Split ('\n');
 
@@ -71,7 +71,7 @@ namespace Banshee.Base
                 if (item.StartsWith ("#")) {
                     continue;
                 }
-                
+
                 SafeUri uri;
                 string s = item;
 
@@ -84,7 +84,7 @@ namespace Banshee.Base
                 } catch {
                     continue;
                 }
-                
+
                 Add (uri);
             }
         }
@@ -93,8 +93,8 @@ namespace Banshee.Base
         {
             return new SafeUri (Path.GetFullPath (path));
         }
-        
-        public override string ToString () 
+
+        public override string ToString ()
         {
             StringBuilder list = new StringBuilder ();
 
@@ -102,17 +102,17 @@ namespace Banshee.Base
                 if (uri == null) {
                     break;
                 }
-                
+
                 list.Append (uri.AbsoluteUri + "\r\n");
             }
 
             return list.ToString ();
         }
-        
+
         public string [] LocalPaths {
             get {
                 int count = 0;
-                
+
                 foreach (SafeUri uri in this) {
                     if (uri.IsFile) {
                         count++;
@@ -121,13 +121,13 @@ namespace Banshee.Base
 
                 string [] paths = new string[count];
                 count = 0;
-                
+
                 foreach (SafeUri uri in this) {
                     if (uri.IsFile) {
                         paths[count++] = uri.LocalPath;
                     }
                 }
-                
+
                 return paths;
             }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Base/XdgBaseDirectorySpec.cs b/src/Core/Banshee.Core/Banshee.Base/XdgBaseDirectorySpec.cs
index 1145db6..67e9fd3 100644
--- a/src/Core/Banshee.Core/Banshee.Base/XdgBaseDirectorySpec.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/XdgBaseDirectorySpec.cs
@@ -37,7 +37,7 @@ namespace Banshee.Base
         {
             string home_dir = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
             string config_dir = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
-            
+
             string env_path = Environment.GetEnvironmentVariable (key);
             if (!String.IsNullOrEmpty (env_path)) {
                 return env_path;
@@ -75,7 +75,7 @@ namespace Banshee.Base
                 }
             } catch (FileNotFoundException) {
             }
-            
+
             return Path.Combine (home_dir, fallback);
         }
     }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs
index f31333b..2f4be23 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs
@@ -38,7 +38,7 @@ namespace Banshee.Collection
     public class AlbumInfo : CacheableItem
     {
         public static readonly string UnknownAlbumTitle = Catalog.GetString ("Unknown Album");
-        
+
         private string title;
         private string title_sort;
         private string artist_name;
@@ -47,65 +47,65 @@ namespace Banshee.Collection
         private string artwork_id;
         private DateTime release_date = DateTime.MinValue;
         private string musicbrainz_id;
-        
+
         public AlbumInfo ()
         {
         }
-        
+
         public AlbumInfo (string title)
         {
             this.title = title;
         }
-        
+
         public virtual string ArtistName {
             get { return artist_name; }
             set { artist_name = value; }
         }
-        
+
         public virtual string ArtistNameSort {
             get { return artist_name_sort; }
             set { artist_name_sort = String.IsNullOrEmpty (value) ? null : value; }
         }
-        
+
         public virtual string Title {
             get { return title; }
             set { title = value; }
         }
-        
+
         public virtual string TitleSort {
             get { return title_sort; }
             set { title_sort = String.IsNullOrEmpty (value) ? null : value; }
         }
-        
+
         public virtual bool IsCompilation {
             get { return is_compilation; }
             set { is_compilation = value; }
         }
-        
+
         public virtual string MusicBrainzId {
             get { return musicbrainz_id; }
             set { musicbrainz_id = value; }
         }
-        
+
         public virtual DateTime ReleaseDate {
             get { return release_date; }
             set { release_date = value; }
         }
-        
+
         public virtual string ArtworkId {
-            get { 
+            get {
                 if (artwork_id == null) {
                     artwork_id = CoverArtSpec.CreateArtistAlbumId (ArtistName, Title);
                 }
-                
+
                 return artwork_id;
             }
         }
-        
+
         public string DisplayArtistName {
             get { return StringUtil.MaybeFallback (ArtistName, ArtistInfo.UnknownArtistName); }
         }
-        
+
         public string DisplayTitle {
             get { return StringUtil.MaybeFallback (Title, UnknownAlbumTitle); }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs
index aab3566..bbf9253 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs
@@ -35,36 +35,36 @@ namespace Banshee.Collection
     public class ArtistInfo : CacheableItem
     {
         public static readonly string UnknownArtistName = Catalog.GetString ("Unknown Artist");
-        
+
         private string name;
         private string name_sort;
         private string musicbrainz_id;
-        
+
         public ArtistInfo ()
         {
         }
-        
+
         public ArtistInfo(string name, string name_sort)
         {
             this.name = name;
             this.name_sort = name_sort;
         }
-                
+
         public virtual string MusicBrainzId {
             get { return musicbrainz_id; }
             set { musicbrainz_id = value; }
         }
-        
+
         public virtual string Name {
             get { return name; }
             set { name = value; }
         }
-        
+
         public virtual string NameSort {
             get { return name_sort; }
             set { name_sort = String.IsNullOrEmpty (value) ? null : value; }
         }
-        
+
         public string DisplayName {
             get { return StringUtil.MaybeFallback (Name, UnknownArtistName); }
         }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs b/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs
index d383f03..6c0e444 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs
@@ -34,7 +34,7 @@ namespace Banshee.Collection
 {
     public class CacheableItem : ICacheableItem
     {
-    
+
 #region Implement ICacheableItem
 
         private object cache_entry_id;
diff --git a/src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs
index 278da38..4399eac 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs
@@ -47,9 +47,9 @@ namespace Banshee.Collection
         private void LoadFromUri (SafeUri uri)
         {
             ParsePath (uri.LocalPath);
-   
+
             TagLib.File file = Banshee.IO.DemuxVfs.OpenFile (uri.LocalPath);
-   
+
             ArtistName = Choose (file.Tag.JoinedAlbumArtists, ArtistName);
             AlbumTitle = Choose (file.Tag.Album, AlbumTitle);
             TrackTitle = Choose (file.Tag.Title, TrackTitle);
@@ -76,7 +76,7 @@ namespace Banshee.Collection
             if (uri.IsLocalPath) {
                 filename = uri.AbsolutePath;
             }
-            
+
             match = Regex.Match (filename, @"(\d+)\.? *(.*)$");
             if (match.Success) {
                 TrackNumber = Convert.ToInt32 (match.Groups[1].ToString ());
@@ -108,32 +108,32 @@ namespace Banshee.Collection
                     AlbumTitle = filename;
                     continue;
                 }
-                
+
                 if (ArtistName == String.Empty) {
                     ArtistName = filename;
                     continue;
                 }
-                
+
                 break;
             }
-            
+
             ArtistName = ArtistName.Trim ();
             AlbumTitle = AlbumTitle.Trim ();
             TrackTitle = TrackTitle.Trim ();
-            
+
             if (ArtistName.Length == 0) {
                 ArtistName = /*"Unknown Artist"*/ null;
             }
-            
+
             if (AlbumTitle.Length == 0) {
                 AlbumTitle = /*"Unknown Album"*/ null;
             }
-            
+
             if (TrackTitle.Length == 0) {
                 TrackTitle = /*"Unknown Title"*/ null;
             }
         }
- 
+
 		private static string Choose (string priority, string fallback)
 		{
 			return String.IsNullOrEmpty (priority) ? fallback : priority;
diff --git a/src/Core/Banshee.Core/Banshee.Collection/IPodcastInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/IPodcastInfo.cs
new file mode 100644
index 0000000..229273e
--- /dev/null
+++ b/src/Core/Banshee.Core/Banshee.Collection/IPodcastInfo.cs
@@ -0,0 +1,40 @@
+//
+// IPodcastInfo.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Banshee.Collection
+{
+    public interface IPodcastInfo
+    {
+        string Description { get; }
+        DateTime ReleaseDate { get; }
+        //TimeSpan BookmarkTime { get; set; }
+        //bool RememberPosition { get; set; }
+    }
+}
diff --git a/src/Core/Banshee.Core/Banshee.Collection/ITrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/ITrackInfo.cs
index 150a02b..fe43a9e 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/ITrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/ITrackInfo.cs
@@ -38,7 +38,7 @@ namespace Banshee.Collection
         string DisplayAlbumTitle { get; }
         string DisplayTrackTitle { get; }
         string DisplayGenre { get; }
-        
+
         int TrackNumber { get; }
         int TrackCount { get; }
         int Year { get; }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs
index b86a2af..4f50859 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs
@@ -32,7 +32,7 @@ namespace Banshee.Collection
 {
     public class SampleTrackInfo : TrackInfo
     {
-        public SampleTrackInfo () 
+        public SampleTrackInfo ()
         {
             ArtistName = "The Beatles";
             TrackTitle = "Ticket to Ride";
@@ -41,7 +41,7 @@ namespace Banshee.Collection
             TrackCount = 14;
             Duration = TimeSpan.FromSeconds (182);
             Year = 1965;
-            
+
             CanPlay = true;
             CanSaveToDatabase = true;
         }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/TrackFilterType.cs b/src/Core/Banshee.Core/Banshee.Collection/TrackFilterType.cs
index 284ce3e..9ab263a 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/TrackFilterType.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/TrackFilterType.cs
@@ -1,4 +1,4 @@
-// 
+//
 // TrackFilterType.cs
 //
 // Author:
diff --git a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
index f04e10b..117496f 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
@@ -55,7 +55,7 @@ namespace Banshee.Collection
                 set { export_name = value; }
             }
         }
-    
+
         public delegate bool IsPlayingHandler (TrackInfo track);
         public static IsPlayingHandler IsPlayingMethod;
 
@@ -105,7 +105,7 @@ namespace Banshee.Collection
         private int skip_count;
         private DateTime last_played;
         private DateTime last_skipped;
-        
+
         private StreamPlaybackError playback_error = StreamPlaybackError.None;
 
         public TrackInfo ()
@@ -137,7 +137,7 @@ namespace Banshee.Collection
 
         public override string ToString ()
         {
-            return String.Format ("{0} - {1} (on {2}) <{3}> [{4}]", ArtistName, TrackTitle, 
+            return String.Format ("{0} - {1} (on {2}) <{3}> [{4}]", ArtistName, TrackTitle,
                 AlbumTitle, Duration, Uri == null ? "<unknown>" : Uri.AbsoluteUri);
         }
 
@@ -146,23 +146,23 @@ namespace Banshee.Collection
             if (track == null || track.Uri == null || Uri == null) {
                 return false;
             }
-            
+
             return track.Uri.AbsoluteUri == Uri.AbsoluteUri;
         }
-        
+
         public bool ArtistAlbumEqual (TrackInfo track)
         {
             if (track == null) {
                 return false;
             }
-            
+
             return ArtworkId == track.ArtworkId;
         }
 
         public virtual void Save ()
         {
         }
-        
+
         public bool IsPlaying {
             get { return (IsPlayingMethod != null) ? IsPlayingMethod (this) : false; }
         }
@@ -172,7 +172,7 @@ namespace Banshee.Collection
             get { return uri; }
             set { uri = value; }
         }
-        
+
         [Exportable]
         public string LocalPath {
             get { return Uri == null || !Uri.IsLocalPath ? null : Uri.LocalPath; }
@@ -235,13 +235,13 @@ namespace Banshee.Collection
             get { return IsCompilation ? album_artist ?? Catalog.GetString ("Various Artists") : ArtistName; }
             set { album_artist = value; }
         }
-        
+
         [Exportable]
         public virtual string AlbumArtistSort {
             get { return album_artist_sort; }
             set { album_artist_sort = String.IsNullOrEmpty (value) ? null : value; }
         }
-        
+
         [Exportable]
         public virtual bool IsCompilation {
             get { return is_compilation; }
@@ -253,65 +253,65 @@ namespace Banshee.Collection
             get { return track_title; }
             set { track_title = value; }
         }
-        
+
         [Exportable (ExportName = "namesort")]
         public virtual string TrackTitleSort {
             get { return track_title_sort; }
             set { track_title_sort = String.IsNullOrEmpty (value) ? null : value; }
         }
-        
+
         [Exportable]
         public virtual string MusicBrainzId {
             get { return musicbrainz_id; }
             set { musicbrainz_id = value; }
         }
-        
+
         [Exportable]
         public virtual string ArtistMusicBrainzId {
             get { return null; }
         }
-        
+
         [Exportable]
         public virtual string AlbumMusicBrainzId {
             get { return null; }
         }
-        
+
         public virtual DateTime ReleaseDate {
             get { return release_date; }
             set { release_date = value; }
-        }        
+        }
 
         public virtual object ExternalObject {
             get { return null; }
         }
-        
-        public string DisplayArtistName { 
-            get { return StringUtil.MaybeFallback (ArtistName, ArtistInfo.UnknownArtistName); } 
+
+        public string DisplayArtistName {
+            get { return StringUtil.MaybeFallback (ArtistName, ArtistInfo.UnknownArtistName); }
         }
 
         public string DisplayAlbumArtistName {
             get { return StringUtil.MaybeFallback (AlbumArtist, DisplayArtistName); }
         }
 
-        public string DisplayAlbumTitle { 
-            get { return StringUtil.MaybeFallback (AlbumTitle, AlbumInfo.UnknownAlbumTitle); } 
+        public string DisplayAlbumTitle {
+            get { return StringUtil.MaybeFallback (AlbumTitle, AlbumInfo.UnknownAlbumTitle); }
         }
 
-        public string DisplayTrackTitle { 
-            get { return StringUtil.MaybeFallback (TrackTitle, UnknownTitle); } 
+        public string DisplayTrackTitle {
+            get { return StringUtil.MaybeFallback (TrackTitle, UnknownTitle); }
         }
 
-        public string DisplayGenre { 
-            get { 
+        public string DisplayGenre {
+            get {
                 string genre = Genre == null ? null : Genre.Trim ();
                 return String.IsNullOrEmpty (genre)
                     ? String.Empty
                     : genre;
             }
         }
-        
+
         [Exportable (ExportName = "artwork-id")]
-        public virtual string ArtworkId { 
+        public virtual string ArtworkId {
             get { return CoverArtSpec.CreateArtistAlbumId (AlbumArtist, AlbumTitle); }
         }
 
@@ -338,7 +338,7 @@ namespace Banshee.Collection
             get { return disc_number; }
             set { disc_number = value; }
         }
-        
+
         [Exportable]
         public virtual int DiscCount {
             get { return (disc_count != 0 && disc_count < DiscNumber) ? DiscNumber : disc_count; }
@@ -362,20 +362,20 @@ namespace Banshee.Collection
             get { return conductor; }
             set { conductor = value; }
         }
-        
+
         [Exportable]
         public virtual string Grouping {
             get { return grouping; }
             set { grouping = value; }
         }
-        
+
         [Exportable]
         public virtual string Copyright {
             get { return copyright; }
             set { copyright = value; }
         }
 
-        [Exportable]        
+        [Exportable]
         public virtual string LicenseUri {
             get { return license_uri; }
             set { license_uri = value; }
@@ -392,7 +392,7 @@ namespace Banshee.Collection
             get { return rating; }
             set { rating = value; }
         }
-        
+
         [Exportable]
         public virtual int Score {
             get { return score; }
@@ -428,7 +428,7 @@ namespace Banshee.Collection
             get { return duration; }
             set { duration = value; }
         }
-        
+
         [Exportable]
         public virtual DateTime DateAdded {
             get { return date_added; }
@@ -446,7 +446,7 @@ namespace Banshee.Collection
             get { return last_skipped; }
             set { last_skipped = value; }
         }
-        
+
         public virtual StreamPlaybackError PlaybackError {
             get { return playback_error; }
             set { playback_error = value; }
@@ -465,7 +465,7 @@ namespace Banshee.Collection
             get { return can_save_to_database; }
             set { can_save_to_database = value; }
         }
-        
+
         private bool is_live = false;
         public bool IsLive {
             get { return is_live; }
@@ -483,7 +483,7 @@ namespace Banshee.Collection
             get { return enabled && can_play; }
             set { enabled = value; }
         }
-        
+
         public virtual string MetadataHash {
             get {
                 System.Text.StringBuilder sb = new System.Text.StringBuilder ();
@@ -499,13 +499,13 @@ namespace Banshee.Collection
         }
 
         private TrackMediaAttributes media_attributes = TrackMediaAttributes.Default;
-        
+
         [Exportable]
         public virtual TrackMediaAttributes MediaAttributes {
             get { return media_attributes; }
             set { media_attributes = value; }
         }
-        
+
         public bool HasAttribute (TrackMediaAttributes attr)
         {
             return (MediaAttributes & attr) != 0;
@@ -554,7 +554,7 @@ namespace Banshee.Collection
         }
 
 #region Exportable Properties
-        
+
         public static void ExportableMerge (TrackInfo source, TrackInfo dest)
         {
             // Use the high level TrackInfo type if the source and dest types differ
@@ -562,7 +562,7 @@ namespace Banshee.Collection
             if (source.GetType () != type) {
                 type = typeof (TrackInfo);
             }
-            
+
             foreach (KeyValuePair<string, PropertyInfo> iter in GetExportableProperties (type)) {
                 try {
                     PropertyInfo property = iter.Value;
@@ -574,11 +574,11 @@ namespace Banshee.Collection
                 }
             }
         }
-        
+
         public static IEnumerable<KeyValuePair<string, PropertyInfo>> GetExportableProperties (Type type)
         {
             FindExportableProperties (type);
-            
+
             Dictionary<string, PropertyInfo> properties = null;
             if (exportable_properties.TryGetValue (type, out properties)) {
                 foreach (KeyValuePair<string, PropertyInfo> property in properties) {
@@ -586,12 +586,12 @@ namespace Banshee.Collection
                 }
             }
         }
-        
+
         public IDictionary<string, object> GenerateExportable ()
         {
             return GenerateExportable (null);
         }
-        
+
         public IDictionary<string, object> GenerateExportable (string [] fields)
         {
             Dictionary<string, object> dict = new Dictionary<string, object> ();
@@ -605,17 +605,17 @@ namespace Banshee.Collection
                             break;
                         }
                     }
-                    
+
                     if (!found) {
                         continue;
                     }
                 }
-                
+
                 object value = property.Value.GetValue (this, null);
                 if (value == null) {
                     continue;
                 }
-                
+
                 if (value is TimeSpan) {
                     value = ((TimeSpan)value).TotalSeconds;
                 } else if (value is DateTime) {
@@ -626,11 +626,11 @@ namespace Banshee.Collection
                 } else if (value is TrackMediaAttributes) {
                     value = value.ToString ();
                 } else if (!(value.GetType ().IsPrimitive || value is string)) {
-                    Log.WarningFormat ("Invalid property in {0} marked as [Exportable]: ({1} is a {2})", 
+                    Log.WarningFormat ("Invalid property in {0} marked as [Exportable]: ({1} is a {2})",
                         property.Value.DeclaringType, property.Value.Name, value.GetType ());
                     continue;
                 }
-                
+
                 // A bit lame
                 if (!(value is string)) {
                     string str_value = value.ToString ();
@@ -638,16 +638,16 @@ namespace Banshee.Collection
                         continue;
                     }
                 }
-                
+
                 dict.Add (property.Key, value);
             }
-            
+
             return dict;
         }
-        
+
         private static Dictionary<Type, Dictionary<string, PropertyInfo>> exportable_properties;
         private static object exportable_properties_mutex = new object ();
-        
+
         private static void FindExportableProperties (Type type)
         {
             lock (exportable_properties_mutex) {
@@ -656,7 +656,7 @@ namespace Banshee.Collection
                 } else if (exportable_properties.ContainsKey (type)) {
                     return;
                 }
-                
+
                 // Build a stack of types to reflect
                 Stack<Type> probe_types = new Stack<Type> ();
                 Type probe_type = type;
@@ -669,57 +669,57 @@ namespace Banshee.Collection
                     }
                     probe_type = probe_type.BaseType;
                 }
-                
+
                 if (!is_track_info) {
                     throw new ArgumentException ("Type must derive from Banshee.Collection.TrackInfo", "type");
                 }
-            
+
                 // Iterate through all types
                 while (probe_types.Count > 0) {
                     probe_type = probe_types.Pop ();
                     if (exportable_properties.ContainsKey (probe_type)) {
                         continue;
                     }
-                    
+
                     Dictionary<string, PropertyInfo> properties = null;
-                    
+
                     // Reflect the type for exportable properties
                     foreach (PropertyInfo property in probe_type.GetProperties (BindingFlags.Public | BindingFlags.Instance)) {
                         if (property.DeclaringType != probe_type) {
                             continue;
                         }
-                        
+
                         object [] exportable_attrs = property.GetCustomAttributes (typeof (ExportableAttribute), true);
                         if (exportable_attrs == null || exportable_attrs.Length == 0) {
                             continue;
                         }
-                        
+
                         string export_name = ((ExportableAttribute)exportable_attrs[0]).ExportName
                             ?? StringUtil.CamelCaseToUnderCase (property.Name, '-');
-                        
+
                         if (String.IsNullOrEmpty (export_name) || (properties != null && properties.ContainsKey (export_name))) {
                             continue;
                         }
-                        
+
                         if (properties == null) {
                             properties = new Dictionary<string, PropertyInfo> ();
                             exportable_properties.Add (probe_type, properties);
                         }
-                        
+
                         properties.Add (export_name, property);
                     }
-                    
+
                     // Merge properties in the type hierarchy through linking or aggregation
                     Type parent_type = probe_type.BaseType;
                     bool link = !exportable_properties.ContainsKey (probe_type);
-                    
+
                     while (parent_type != null) {
                         Dictionary<string, PropertyInfo> parent_properties = null;
                         if (!exportable_properties.TryGetValue (parent_type, out parent_properties)) {
                             parent_type = parent_type.BaseType;
                             continue;
                         }
-                        
+
                         if (link) {
                             // Link entire property set between types
                             exportable_properties.Add (probe_type, parent_properties);
@@ -730,13 +730,13 @@ namespace Banshee.Collection
                                 properties.Add (parent_property.Key, parent_property.Value);
                             }
                         }
-                        
+
                         parent_type = parent_type.BaseType;
                     }
                 }
             }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.Core/Banshee.Collection/TrackMediaAttributes.cs b/src/Core/Banshee.Core/Banshee.Collection/TrackMediaAttributes.cs
index bd7b893..2e631ee 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/TrackMediaAttributes.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/TrackMediaAttributes.cs
@@ -41,7 +41,7 @@ namespace Banshee.Collection
         Podcast = (1 << 4),     // 16
         TvShow = (1 << 5),      // 32
         Movie = (1 << 6),       // 64
-        
+
         Default = AudioStream | Music // 5
     }
 }
\ No newline at end of file
diff --git a/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs
index 4a25f4a..9cd7c48 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs
@@ -34,7 +34,7 @@ namespace Banshee.Collection
 {
     public class UnknownTrackInfo : TrackInfo
     {
-        public UnknownTrackInfo(SafeUri uri) 
+        public UnknownTrackInfo(SafeUri uri)
         {
             Uri = uri;
             IsLive = true;
diff --git a/src/Core/Banshee.Core/Banshee.Configuration.Schema/ImportSchema.cs b/src/Core/Banshee.Core/Banshee.Configuration.Schema/ImportSchema.cs
index 6cef73b..7cf07ff 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration.Schema/ImportSchema.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration.Schema/ImportSchema.cs
@@ -5,30 +5,30 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Banshee.Configuration;
- 
+
 namespace Banshee.Configuration.Schema
 {
     public static class ImportSchema
@@ -38,6 +38,6 @@ namespace Banshee.Configuration.Schema
             true,
             "Show the Initial Import Dialog",
             "Show the Initial Import Dialog when the Banshee library is empty"
-        );   
+        );
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.Configuration.Schema/LibrarySchema.cs b/src/Core/Banshee.Core/Banshee.Configuration.Schema/LibrarySchema.cs
index 8030e76..6a17f7d 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration.Schema/LibrarySchema.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration.Schema/LibrarySchema.cs
@@ -5,30 +5,30 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Banshee.Configuration;
- 
+
 namespace Banshee.Configuration.Schema
 {
     public static class LibrarySchema
@@ -56,7 +56,7 @@ namespace Banshee.Configuration.Schema
                 "%track_count%, %track_number_nz% (No prefixed zero), %track_count_nz% (No prefixed zero), " +
                 "%album_artist_initial%, %artist% (deprecated, use %album_artist%)."
         );
-        
+
         public static readonly SchemaEntry<bool> CopyOnImport = new SchemaEntry<bool>(
             "library", "copy_on_import",
             false,
@@ -70,12 +70,19 @@ namespace Banshee.Configuration.Schema
             "Move music on info save",
             "Move music within banshee music library directory when saving track info"
         );
-        
+
         public static readonly SchemaEntry<bool> WriteMetadata = new SchemaEntry<bool>(
             "library", "write_metadata",
             false,
             "Write metadata back to audio files",
             "If enabled, metadata (tags) will be written back to audio files when using the track metadata editor."
         );
+
+        public static readonly SchemaEntry<bool> WriteRatingsAndPlayCounts = new SchemaEntry<bool>(
+            "library", "write_rating",
+            false,
+            "Store ratings within supported files",
+            "If enabled, rating and playcount metadata will be written back to audio files."
+        );
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs
index c41f17b..e8134dc 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs
@@ -44,7 +44,7 @@ namespace Banshee.Configuration
                 if (client != null) {
                     return;
                 }
-                
+
                 if (AddinManager.IsInitialized) {
                     foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
                         "/Banshee/Platform/ConfigurationClient")) {
@@ -57,14 +57,14 @@ namespace Banshee.Configuration
                             Log.Warning ("Configuration client extension failed to load", e.Message);
                         }
                     }
-                    
+
                     if (client == null) {
                         client = new XmlConfigurationClient ();
                     }
                 } else {
                     client = new MemoryConfigurationClient ();
                 }
-                
+
                 Log.DebugFormat ("Configuration client extension loaded ({0})", client.GetType ().FullName);
             }
         }
@@ -77,37 +77,37 @@ namespace Banshee.Configuration
                 return client;
             }
         }
-        
+
         public static T Get<T> (SchemaEntry<T> entry)
         {
             return Client.Get<T> (entry);
         }
-        
+
         public static T Get<T> (SchemaEntry<T> entry, T fallback)
         {
             return Client.Get<T> (entry, fallback);
         }
-        
+
         public static T Get<T> (string key, T fallback)
         {
             return Client.Get<T> (key, fallback);
         }
-        
+
         public static T Get<T> (string @namespace, string key, T fallback)
         {
             return Client.Get<T> (@namespace, key, fallback);
         }
-        
+
         public static void Set<T> (SchemaEntry<T> entry, T value)
         {
             Client.Set<T> (entry, value);
         }
-        
+
         public static void Set<T> (string key, T value)
         {
             Client.Set<T> (key, value);
         }
-        
+
         public static void Set<T> (string @namespace, string key, T value)
         {
             Client.Set<T> (@namespace, key, value);
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
index 9b2b351..10064ba 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/IConfigurationClient.cs
@@ -34,7 +34,7 @@ namespace Banshee.Configuration
         T Get<T> (SchemaEntry<T> entry, T fallback);
         T Get<T> (string key, T fallback);
         T Get<T> (string @namespace, string key, T fallback);
-        
+
         void Set<T> (SchemaEntry<T> entry, T value);
         void Set<T> (string key, T value);
         void Set<T> (string @namespace, string key, T value);
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
index e597551..8f62aad 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/MemoryConfigurationClient.cs
@@ -71,7 +71,7 @@ namespace Banshee.Configuration
             lock (this) {
                 string fq_key = MakeKey (namespce, key);
                 object value;
-                
+
                 if (config.TryGetValue (fq_key, out value)) {
                     if (value == null) {
                         return default (T);
@@ -79,7 +79,7 @@ namespace Banshee.Configuration
                         return (T)value;
                     }
                 }
-                
+
                 return fallback;
             }
         }
@@ -95,12 +95,12 @@ namespace Banshee.Configuration
                 }
             }
         }
-                
+
         public static string MakeKey (string namespce, string key)
         {
             return String.Format ("{0}{1}{2}", namespce, String.IsNullOrEmpty (namespce) ? String.Empty : ".", key);
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs b/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
index 704dfff..3a30333 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/SchemaEntry.cs
@@ -33,8 +33,8 @@ namespace Banshee.Configuration
     public struct SchemaEntry<T> : IEquatable<SchemaEntry<T>>
     {
         public static SchemaEntry<T> Zero;
-    
-        public SchemaEntry (string @namespace, string key, T defaultValue, 
+
+        public SchemaEntry (string @namespace, string key, T defaultValue,
             string shortDescription, string longDescription) :
             this (@namespace, key, defaultValue, default(T), default(T), shortDescription, longDescription)
         {
@@ -82,17 +82,17 @@ namespace Banshee.Configuration
         public readonly T MaxValue;
         public readonly string ShortDescription;
         public readonly string LongDescription;
-        
+
         public bool Equals (SchemaEntry<T> entry)
         {
             return Namespace == entry.Namespace && Key == entry.Key;
         }
-        
+
         public override bool Equals (object o)
         {
             return (o is SchemaEntry<T>) && Equals ((SchemaEntry<T>)o);
         }
-        
+
         public override int GetHashCode ()
         {
             return Namespace.GetHashCode () ^ Key.GetHashCode ();
diff --git a/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs b/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
index 3288c1c..2823a40 100644
--- a/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
+++ b/src/Core/Banshee.Core/Banshee.Configuration/XmlConfigurationClient.cs
@@ -42,24 +42,24 @@ namespace Banshee.Configuration
         private const string namespace_tag_name = "namespace";
         private const string value_tag_name = "value";
         private const string tag_identifier_attribute_name = "name";
-        
+
         private static string file_path {
             get {
                 return Path.Combine(Paths.ApplicationData, "config.xml");
             }
         }
         private static XmlDocument xml_document;
-        
+
         private static System.Timers.Timer timer;
         private static object timer_mutex = new object();
         private static volatile bool delay_write;
-        
+
         public XmlConfigurationClient()
         {
             timer = new System.Timers.Timer(100); // a 10th of a second
             timer.Elapsed += new ElapsedEventHandler(OnTimerElapsedEvent);
             timer.AutoReset = true;
-            
+
             xml_document = new XmlDocument();
             bool make_new_xml = true;
             if(File.Exists(file_path)) {
@@ -73,33 +73,33 @@ namespace Banshee.Configuration
                 xml_document.LoadXml("<configuration />");
             }
         }
-        
+
         public T Get<T>(SchemaEntry<T> entry)
         {
             return Get<T>(entry.Namespace, entry.Key, entry.DefaultValue);
         }
-        
+
         public T Get<T>(SchemaEntry<T> entry, T fallback)
         {
             return Get<T>(entry.Namespace, entry.Key, fallback);
         }
-        
+
         public T Get<T>(string key, T fallback)
         {
             return Get<T>(null, key, fallback);
         }
-        
+
         public T Get<T>(string namespce, string key, T fallback)
         {
             lock(xml_document) {
                 XmlNode namespace_node = GetNamespaceNode(namespce == null
                     ? new string [] {null_namespace}
                     : namespce.Split('.'), false);
-                
+
                 if(namespace_node == null) {
                     return fallback;
                 }
-                
+
                 foreach(XmlNode node in namespace_node.ChildNodes) {
                     if(node.Attributes[tag_identifier_attribute_name].Value == key && node.Name == value_tag_name) {
                         XmlSerializer serializer = new XmlSerializer(typeof(T));
@@ -110,17 +110,17 @@ namespace Banshee.Configuration
                 return fallback;
             }
         }
-        
+
         public void Set<T>(SchemaEntry<T> entry, T value)
         {
             Set(entry.Namespace, entry.Key, value);
         }
-        
+
         public void Set<T>(string key, T value)
         {
             Set(null, key, value);
         }
-        
+
         public void Set<T>(string namespce, string key, T value)
         {
             lock(xml_document) {
@@ -134,11 +134,11 @@ namespace Banshee.Configuration
                 if(fragment.FirstChild is XmlDeclaration) {
                     fragment.RemoveChild(fragment.FirstChild); // This is only a problem with Microsoft's System.Xml
                 }
-                
+
                 XmlNode namespace_node = GetNamespaceNode(namespce == null
                     ? new string [] {null_namespace}
                     : namespce.Split('.'), true);
-                
+
                 bool found = false;
                 foreach(XmlNode node in namespace_node.ChildNodes) {
                     if(node.Attributes[tag_identifier_attribute_name].Value == key && node.Name == value_tag_name) {
@@ -158,16 +158,16 @@ namespace Banshee.Configuration
                 QueueWrite();
             }
         }
-        
+
         private XmlNode GetNamespaceNode(string [] namespace_parts, bool create)
         {
             return GetNamespaceNode(xml_document.DocumentElement, namespace_parts, create);
         }
-        
+
         private XmlNode GetNamespaceNode(XmlNode parent_node, string [] namespace_parts, bool create)
         {
             XmlNode node = parent_node.FirstChild ?? parent_node;
-            
+
             do {
                 if(node.Name == namespace_tag_name && node.Attributes[tag_identifier_attribute_name].Value == namespace_parts[0]) {
                     if(namespace_parts.Length > 1) {
@@ -182,7 +182,7 @@ namespace Banshee.Configuration
                     node = node.NextSibling;
                 }
             } while(node != null);
-            
+
             if(create) {
                 XmlNode appending_node = parent_node;
                 foreach(string s in namespace_parts) {
@@ -197,7 +197,7 @@ namespace Banshee.Configuration
             }
             return node;
         }
-        
+
         // Queue XML file writes to minimize disk access
         private static void QueueWrite()
         {
@@ -209,7 +209,7 @@ namespace Banshee.Configuration
                 }
             }
         }
-        
+
         private static void OnTimerElapsedEvent(object o, ElapsedEventArgs args)
         {
             lock(timer_mutex) {
diff --git a/src/Core/Banshee.Core/Banshee.I18n/AssemblyCatalogAttribute.cs b/src/Core/Banshee.Core/Banshee.I18n/AssemblyCatalogAttribute.cs
index fc3058b..7a9bebc 100644
--- a/src/Core/Banshee.Core/Banshee.I18n/AssemblyCatalogAttribute.cs
+++ b/src/Core/Banshee.Core/Banshee.I18n/AssemblyCatalogAttribute.cs
@@ -35,17 +35,17 @@ namespace Banshee.I18n
     {
         private string domain;
         private string localedir;
-        
+
         public AssemblyCatalogAttribute (string domain, string localedir)
         {
             this.domain = domain;
             this.localedir = localedir;
         }
-        
+
         public string Domain {
             get { return domain; }
         }
-        
+
         public string LocaleDir {
             get { return localedir; }
         }
diff --git a/src/Core/Banshee.Core/Banshee.I18n/Catalog.cs b/src/Core/Banshee.Core/Banshee.I18n/Catalog.cs
index ef7e920..b4b815b 100644
--- a/src/Core/Banshee.Core/Banshee.I18n/Catalog.cs
+++ b/src/Core/Banshee.Core/Banshee.I18n/Catalog.cs
@@ -39,19 +39,19 @@ namespace Banshee.I18n
     {
         private static Dictionary<Assembly, string> domain_assembly_map = new Dictionary<Assembly, string> ();
         private static List<Assembly> default_domain_assemblies = new List<Assembly> ();
-        
+
         public static void Init (string domain, string localeDir)
         {
             if (String.IsNullOrEmpty (domain)) {
                 throw new ArgumentException ("No text domain specified");
             }
-            
+
             IntPtr domain_ptr = UnixMarshal.StringToHeap (domain);
             IntPtr localedir_ptr = IntPtr.Zero;
-            
+
             try {
                 BindTextDomainCodeset (domain_ptr);
-            
+
                 if (localeDir != null && localeDir.Length > 0) {
                     localedir_ptr = UnixMarshal.StringToHeap (localeDir);
                     BindTextDomain (domain_ptr, localedir_ptr);
@@ -63,32 +63,32 @@ namespace Banshee.I18n
                 }
             }
         }
-        
+
         public static string GetString (string msgid)
         {
             return GetString (GetDomainForAssembly (Assembly.GetCallingAssembly ()), msgid);
         }
-        
+
         public static string GetString (string domain, string msgid)
         {
             IntPtr msgid_ptr = UnixMarshal.StringToHeap (msgid);
             IntPtr domain_ptr = domain == null ? IntPtr.Zero : UnixMarshal.StringToHeap (domain);
-            
+
             if (domain == null) {
                 // FIXME banshee-1?
                 IntPtr ptr = UnixMarshal.StringToHeap ("banshee");
                 UnixMarshal.FreeHeap (ptr);
             }
-            
+
             try {
-                IntPtr ret_ptr = domain_ptr == IntPtr.Zero ? 
+                IntPtr ret_ptr = domain_ptr == IntPtr.Zero ?
                     gettext (msgid_ptr) :
                     dgettext (domain_ptr, msgid_ptr);
-                
+
                 if (msgid_ptr != ret_ptr) {
                     return UnixMarshal.PtrToStringUnix (ret_ptr);
                 }
-                
+
                 return msgid;
             } finally {
                 UnixMarshal.FreeHeap (msgid_ptr);
@@ -97,34 +97,34 @@ namespace Banshee.I18n
                 }
             }
         }
-        
+
         public static string GetString (string msgid, string msgidPlural, int n)
         {
             return GetString (GetDomainForAssembly (Assembly.GetCallingAssembly ()), msgid, msgidPlural, n);
         }
-        
+
         public static string GetPluralString (string msgid, string msgidPlural, int n)
         {
             return GetString (msgid, msgidPlural, n);
         }
-        
+
         public static string GetString (string domain, string msgid, string msgidPlural, int n)
         {
             IntPtr msgid_ptr = UnixMarshal.StringToHeap (msgid);
             IntPtr msgid_plural_ptr = UnixMarshal.StringToHeap (msgidPlural);
             IntPtr domain_ptr = domain == null ? IntPtr.Zero : UnixMarshal.StringToHeap (domain);
-                
+
             try {
-                IntPtr ret_ptr = domain_ptr == IntPtr.Zero ? 
+                IntPtr ret_ptr = domain_ptr == IntPtr.Zero ?
                     ngettext (msgid_ptr, msgid_plural_ptr, n) :
                     dngettext (domain_ptr, msgid_ptr, msgid_plural_ptr, n);
-                
+
                 if (ret_ptr == msgid_ptr) {
                     return msgid;
                 } else if (ret_ptr == msgid_plural_ptr) {
                     return msgidPlural;
                 }
-                
+
                 return UnixMarshal.PtrToStringUnix (ret_ptr);
             } finally {
                 UnixMarshal.FreeHeap (msgid_ptr);
@@ -134,7 +134,7 @@ namespace Banshee.I18n
                 }
             }
         }
-        
+
         private static string GetDomainForAssembly (Assembly assembly)
         {
             if (default_domain_assemblies.Contains (assembly)) {
@@ -142,27 +142,27 @@ namespace Banshee.I18n
             } else if (domain_assembly_map.ContainsKey (assembly)) {
                 return domain_assembly_map[assembly];
             }
-            
+
             AssemblyCatalogAttribute [] attributes = assembly.GetCustomAttributes (
                 typeof(AssemblyCatalogAttribute), true) as AssemblyCatalogAttribute [];
-                
+
             if (attributes == null || attributes.Length == 0) {
                 default_domain_assemblies.Add (assembly);
                 return null;
             }
-            
+
             string domain = attributes[0].Domain;
-            
+
             Init (domain, attributes[0].LocaleDir);
             domain_assembly_map.Add (assembly, domain);
-            
+
             return domain;
         }
-        
+
         private static void BindTextDomainCodeset (IntPtr domain)
         {
             IntPtr codeset = UnixMarshal.StringToHeap("UTF-8");
-            
+
             try {
                 if (bind_textdomain_codeset (domain, codeset) == IntPtr.Zero) {
                     throw new UnixIOException (Mono.Unix.Native.Errno.ENOMEM);
@@ -178,22 +178,22 @@ namespace Banshee.I18n
                 throw new UnixIOException (Mono.Unix.Native.Errno.ENOMEM);
             }
         }
-        
+
         [DllImport ("intl")]
         private static extern IntPtr bind_textdomain_codeset (IntPtr domain, IntPtr codeset);
-        
+
         [DllImport ("intl")]
         private static extern IntPtr bindtextdomain (IntPtr domain, IntPtr locale_dir);
-        
+
         [DllImport ("intl")]
         private static extern IntPtr dgettext (IntPtr domain, IntPtr msgid);
-        
+
         [DllImport ("intl")]
         private static extern IntPtr dngettext (IntPtr domain, IntPtr msgid_singular, IntPtr msgid_plural, Int32 n);
 
         [DllImport ("intl")]
         private static extern IntPtr gettext (IntPtr msgid);
-        
+
         [DllImport ("intl")]
         private static extern IntPtr ngettext (IntPtr msgid_singular, IntPtr msgid_plural, Int32 n);
     }
diff --git a/src/Core/Banshee.Core/Banshee.IO.SystemIO/DemuxVfs.cs b/src/Core/Banshee.Core/Banshee.IO.SystemIO/DemuxVfs.cs
index 58f2673..912d36b 100644
--- a/src/Core/Banshee.Core/Banshee.IO.SystemIO/DemuxVfs.cs
+++ b/src/Core/Banshee.Core/Banshee.IO.SystemIO/DemuxVfs.cs
@@ -34,37 +34,37 @@ using Banshee.Base;
 namespace Banshee.IO.SystemIO
 {
     public class DemuxVfs : Banshee.IO.IDemuxVfs
-    {   
+    {
         private FileInfo file_info;
-        
+
         public DemuxVfs (string path)
         {
             file_info = new FileInfo (path);
         }
-                
+
         public void CloseStream (Stream stream)
         {
             stream.Close ();
         }
-        
-        public string Name { 
+
+        public string Name {
             get { return file_info.FullName; }
         }
-        
+
         public Stream ReadStream {
             get { return file_info.Open (FileMode.Open, FileAccess.Read, FileShare.Read); }
         }
-        
+
         public Stream WriteStream {
             get { return file_info.Open (FileMode.Open, FileAccess.ReadWrite); }
         }
-   
+
         public bool IsReadable {
             get {
                 try {
                     ReadStream.Close ();
                     return true;
-                } catch { 
+                } catch {
                     return false;
                 }
             }
@@ -75,7 +75,7 @@ namespace Banshee.IO.SystemIO
                 try {
                     WriteStream.Close ();
                     return true;
-                } catch { 
+                } catch {
                     return false;
                 }
             }
diff --git a/src/Core/Banshee.Core/Banshee.IO.SystemIO/Directory.cs b/src/Core/Banshee.Core/Banshee.IO.SystemIO/Directory.cs
index 8251f29..fe8fe2b 100644
--- a/src/Core/Banshee.Core/Banshee.IO.SystemIO/Directory.cs
+++ b/src/Core/Banshee.Core/Banshee.IO.SystemIO/Directory.cs
@@ -39,27 +39,27 @@ namespace Banshee.IO.SystemIO
         {
             System.IO.Directory.CreateDirectory (directory);
         }
-        
+
         public void Delete (string directory)
         {
             Delete (directory, false);
         }
-        
+
         public void Delete (string directory, bool recursive)
         {
             System.IO.Directory.Delete (directory, recursive);
         }
-        
+
         public bool Exists (string directory)
         {
             return System.IO.Directory.Exists (directory);
         }
-        
+
         public IEnumerable<string> GetFiles (string directory)
         {
             return System.IO.Directory.GetFiles (directory);
         }
-        
+
         public IEnumerable<string> GetDirectories (string directory)
         {
             return System.IO.Directory.GetDirectories (directory);
diff --git a/src/Core/Banshee.Core/Banshee.IO.SystemIO/File.cs b/src/Core/Banshee.Core/Banshee.IO.SystemIO/File.cs
index 7f23055..140c2bb 100644
--- a/src/Core/Banshee.Core/Banshee.IO.SystemIO/File.cs
+++ b/src/Core/Banshee.Core/Banshee.IO.SystemIO/File.cs
@@ -54,7 +54,7 @@ namespace Banshee.IO.SystemIO
         {
             System.IO.File.Copy (from.LocalPath, to.LocalPath, overwrite);
         }
-        
+
         public long GetSize (SafeUri uri)
         {
             try {
@@ -68,15 +68,15 @@ namespace Banshee.IO.SystemIO
         {
             return Hyena.DateTimeUtil.FromDateTime (new System.IO.FileInfo (uri.LocalPath).LastWriteTime);
         }
-        
+
         public System.IO.Stream OpenRead (SafeUri uri)
         {
             return System.IO.File.OpenRead (uri.LocalPath);
         }
-        
+
         public System.IO.Stream OpenWrite (SafeUri uri, bool overwrite)
         {
-            return overwrite 
+            return overwrite
                 ? System.IO.File.Open (uri.LocalPath, FileMode.Create, FileAccess.ReadWrite)
                 : System.IO.File.OpenWrite (uri.LocalPath);
         }
diff --git a/src/Core/Banshee.Core/Banshee.IO.SystemIO/Provider.cs b/src/Core/Banshee.Core/Banshee.IO.SystemIO/Provider.cs
index 409e3e1..8b27299 100644
--- a/src/Core/Banshee.Core/Banshee.IO.SystemIO/Provider.cs
+++ b/src/Core/Banshee.Core/Banshee.IO.SystemIO/Provider.cs
@@ -32,7 +32,7 @@ namespace Banshee.IO.SystemIO
 {
     public class Provider : Banshee.IO.IProvider
     {
-    	public Type FileProvider { 
+    	public Type FileProvider {
     	    get { return typeof (File); }
     	}
 
@@ -43,5 +43,7 @@ namespace Banshee.IO.SystemIO
     	public Type DemuxVfsProvider {
     	    get { return typeof (DemuxVfs); }
     	}
+
+        public bool LocalOnly { get { return true; } }
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.IO/DemuxVfs.cs b/src/Core/Banshee.Core/Banshee.IO/DemuxVfs.cs
index 64e722b..a6fe361 100644
--- a/src/Core/Banshee.Core/Banshee.IO/DemuxVfs.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/DemuxVfs.cs
@@ -35,12 +35,12 @@ namespace Banshee.IO
     {
         public static TagLib.File OpenFile (string file, string mimetype, TagLib.ReadStyle readStyle)
         {
-            return TagLib.File.Create (Provider.CreateDemuxVfs (file), mimetype, readStyle); 
+            return TagLib.File.Create (Provider.CreateDemuxVfs (file), mimetype, readStyle);
         }
-        
+
         public static TagLib.File OpenFile (string file)
         {
-            return TagLib.File.Create (Provider.CreateDemuxVfs (file)); 
+            return TagLib.File.Create (Provider.CreateDemuxVfs (file));
         }
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.IO/DirectoryScannerPipelineElement.cs b/src/Core/Banshee.Core/Banshee.IO/DirectoryScannerPipelineElement.cs
index 6535f9e..ef6526b 100644
--- a/src/Core/Banshee.Core/Banshee.IO/DirectoryScannerPipelineElement.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/DirectoryScannerPipelineElement.cs
@@ -34,7 +34,7 @@ using Hyena.Collections;
 using Banshee.Base;
 
 namespace Banshee.IO
-{  
+{
     public class DirectoryScannerPipelineElement : QueuePipelineElement<string>
     {
         protected override string ProcessItem (string item)
@@ -42,23 +42,23 @@ namespace Banshee.IO
             ScanForFiles (item);
             return null;
         }
-        
+
         private void ScanForFiles (string source)
         {
             CheckForCanceled ();
-            
+
             bool is_regular_file = false;
             bool is_directory = false;
-            
+
             SafeUri source_uri = new SafeUri (source);
-            
+
             try {
                 is_regular_file = Banshee.IO.File.Exists (source_uri);
                 is_directory = !is_regular_file && Banshee.IO.Directory.Exists (source);
             } catch {
                 return;
             }
-            
+
             if (is_regular_file) {
                 try {
                     if (!Path.GetFileName (source).StartsWith (".")) {
diff --git a/src/Core/Banshee.Core/Banshee.IO/ExtensionSet.cs b/src/Core/Banshee.Core/Banshee.IO/ExtensionSet.cs
index 9921e9c..c7ce789 100644
--- a/src/Core/Banshee.Core/Banshee.IO/ExtensionSet.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/ExtensionSet.cs
@@ -46,13 +46,13 @@ namespace Banshee.IO
             if (String.IsNullOrEmpty (path)) {
                 return false;
             }
-            
+
             int index = path.LastIndexOf ('.');
             if (index < 0 || index == path.Length || index == path.Length - 1) {
                 return false;
             }
-            
-            return Array.BinarySearch<string> (extensions, 
+
+            return Array.BinarySearch<string> (extensions,
                 path.Substring (index + 1).ToLower ()) >= 0;
         }
 
diff --git a/src/Core/Banshee.Core/Banshee.IO/File.cs b/src/Core/Banshee.Core/Banshee.IO/File.cs
index e0c61f9..f5785c2 100644
--- a/src/Core/Banshee.Core/Banshee.IO/File.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/File.cs
@@ -43,7 +43,7 @@ namespace Banshee.IO
     	{
     	    return Provider.File.Exists (uri);
     	}
-        
+
     	public static void Move (SafeUri from, SafeUri to)
     	{
     	    Provider.File.Move (from, to);
diff --git a/src/Core/Banshee.Core/Banshee.IO/IDirectory.cs b/src/Core/Banshee.Core/Banshee.IO/IDirectory.cs
index b1134be..495caf8 100644
--- a/src/Core/Banshee.Core/Banshee.IO/IDirectory.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/IDirectory.cs
@@ -36,13 +36,13 @@ namespace Banshee.IO
     public interface IDirectory
     {
         bool Exists (string directory);
-        
+
         void Create (string directory);
         void Move (SafeUri from, SafeUri to);
-        
+
         void Delete (string directory);
         void Delete (string directory, bool recursive);
-        
+
         // FIXME: These probably need to normalize to SafeUri
         IEnumerable<string> GetFiles (string directory);
         IEnumerable<string> GetDirectories (string directory);
diff --git a/src/Core/Banshee.Core/Banshee.IO/IFile.cs b/src/Core/Banshee.Core/Banshee.IO/IFile.cs
index 1d8ad13..465acc3 100644
--- a/src/Core/Banshee.Core/Banshee.IO/IFile.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/IFile.cs
@@ -40,7 +40,7 @@ namespace Banshee.IO
         void Copy (SafeUri from, SafeUri to, bool overwrite);
         long GetSize (SafeUri uri);
         long GetModifiedTime (SafeUri uri);
-        
+
         System.IO.Stream OpenRead (SafeUri uri);
         System.IO.Stream OpenWrite (SafeUri uri, bool overwrite);
     }
diff --git a/src/Core/Banshee.Core/Banshee.IO/IProvider.cs b/src/Core/Banshee.Core/Banshee.IO/IProvider.cs
index 2010f19..4250b31 100644
--- a/src/Core/Banshee.Core/Banshee.IO/IProvider.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/IProvider.cs
@@ -35,5 +35,6 @@ namespace Banshee.IO
         Type FileProvider { get; }
         Type DirectoryProvider { get; }
         Type DemuxVfsProvider { get; }
+        bool LocalOnly { get; }
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.IO/Provider.cs b/src/Core/Banshee.Core/Banshee.IO/Provider.cs
index f43caa5..b1ba734 100644
--- a/src/Core/Banshee.Core/Banshee.IO/Provider.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/Provider.cs
@@ -41,13 +41,13 @@ namespace Banshee.IO
         private static IProvider provider;
         private static IDirectory directory;
         private static IFile file;
-        
+
         static Provider () {
             lock (typeof (Provider)) {
                 if (provider != null) {
                     return;
                 }
-                
+
                 foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/Platform/IOProvider")) {
                     try {
                         if (node.HasId && node.Id == ProviderSchema.Get ()) {
@@ -57,13 +57,13 @@ namespace Banshee.IO
                         Log.Warning ("IO provider extension failed to load", e.Message);
                     }
                 }
-                
+
                 if (provider == null) {
                     provider = new Banshee.IO.SystemIO.Provider ();
                 }
-                
+
                 Log.DebugFormat ("IO provider extension loaded ({0})", provider.GetType ().FullName);
-                
+
                 directory = (IDirectory)Activator.CreateInstance (provider.DirectoryProvider);
                 file = (IFile)Activator.CreateInstance (provider.FileProvider);
             }
@@ -73,25 +73,30 @@ namespace Banshee.IO
         {
             provider = customProvider;
         }
-        
+
         internal static IDirectory Directory {
             get { return directory; }
         }
-        
+
         internal static IFile File {
             get { return file; }
         }
-        
+
+        public static bool LocalOnly {
+            get { return provider == null ? true : provider.LocalOnly; }
+        }
+
         internal static IDemuxVfs CreateDemuxVfs (string file)
         {
             return (IDemuxVfs)Activator.CreateInstance (provider.DemuxVfsProvider, new object [] { file });
         }
-        
+
         internal static readonly SchemaEntry<string> ProviderSchema = new SchemaEntry<string> (
             "core", "io_provider",
             "Banshee.IO.Unix.Provider",
             "Set the IO provider backend in Banshee",
-            "Can be either \"Banshee.IO.SystemIO.Provider\" (.NET System.IO), " + 
+            "Can be either \"Banshee.IO.SystemIO.Provider\" (.NET System.IO), " +
+                "\"Banshee.IO.Gio.Provider\" (GIO), or " +
                 "\"Banshee.IO.Unix.Provider\" (Native Unix/POSIX), or " +
                 "\"Banshee.IO.GnomeVfs.Provider\" (GNOME VFS); " +
                 "takes effect on Banshee start (restart necessary)"
diff --git a/src/Core/Banshee.Core/Banshee.IO/StreamAssist.cs b/src/Core/Banshee.Core/Banshee.IO/StreamAssist.cs
index 7eabb86..42d765b 100644
--- a/src/Core/Banshee.Core/Banshee.IO/StreamAssist.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/StreamAssist.cs
@@ -37,7 +37,7 @@ namespace Banshee.IO
         {
             Save (from, to, 8192, true);
         }
-        
+
         public static void Save (Stream from, Stream to, bool close)
         {
             Save (from, to, 8192, close);
@@ -49,7 +49,7 @@ namespace Banshee.IO
                 long bytes_read = 0;
                 byte [] buffer = new byte[bufferSize];
                 int chunk_bytes_read = 0;
-                
+
                 while ((chunk_bytes_read = from.Read (buffer, 0, buffer.Length)) > 0) {
                     to.Write (buffer, 0, chunk_bytes_read);
                     bytes_read += chunk_bytes_read;
diff --git a/src/Core/Banshee.Core/Banshee.IO/Utilities.cs b/src/Core/Banshee.Core/Banshee.IO/Utilities.cs
index b0ebbcd..2f73520 100644
--- a/src/Core/Banshee.Core/Banshee.IO/Utilities.cs
+++ b/src/Core/Banshee.Core/Banshee.IO/Utilities.cs
@@ -5,24 +5,24 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/DelegateJob.cs b/src/Core/Banshee.Core/Banshee.Kernel/DelegateJob.cs
index 703f5fd..90956f1 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/DelegateJob.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/DelegateJob.cs
@@ -34,12 +34,12 @@ namespace Banshee.Kernel
     {
         public delegate void JobDelegate ();
         private JobDelegate method;
-        
+
         public DelegateJob (JobDelegate method)
         {
             this.method = method;
         }
-        
+
         protected override void RunJob ()
         {
             method ();
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/IInstanceCriticalJob.cs b/src/Core/Banshee.Core/Banshee.Kernel/IInstanceCriticalJob.cs
index de1b046..a4c2e88 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/IInstanceCriticalJob.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/IInstanceCriticalJob.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Banshee.Kernel
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/IJob.cs b/src/Core/Banshee.Core/Banshee.Kernel/IJob.cs
index 3d364a7..636df8a 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/IJob.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/IJob.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Banshee.Kernel
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/Job.cs b/src/Core/Banshee.Core/Banshee.Kernel/Job.cs
index 1ad13b4..7dcf147 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/Job.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/Job.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Banshee.Kernel
@@ -33,13 +33,13 @@ namespace Banshee.Kernel
     public abstract class Job : IJob
     {
         public event EventHandler Finished;
-        
+
         public void Run()
         {
             RunJob();
             OnFinished();
         }
-        
+
         protected virtual void OnFinished()
         {
             EventHandler handler = Finished;
@@ -47,7 +47,7 @@ namespace Banshee.Kernel
                 handler(this, new EventArgs());
             }
         }
-        
+
         protected abstract void RunJob();
     }
 }
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/JobPriority.cs b/src/Core/Banshee.Core/Banshee.Kernel/JobPriority.cs
index f53f3c5..ea32259 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/JobPriority.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/JobPriority.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Banshee.Kernel
diff --git a/src/Core/Banshee.Core/Banshee.Kernel/Scheduler.cs b/src/Core/Banshee.Core/Banshee.Kernel/Scheduler.cs
index 957b487..619e737 100644
--- a/src/Core/Banshee.Core/Banshee.Kernel/Scheduler.cs
+++ b/src/Core/Banshee.Core/Banshee.Kernel/Scheduler.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Threading;
 using System.Collections.Generic;
@@ -45,24 +45,24 @@ namespace Banshee.Kernel
         private static bool disposed;
         private static IJob current_running_job;
         private static int suspend_count;
-        
+
         public static event JobEventHandler JobStarted;
         public static event JobEventHandler JobFinished;
         public static event JobEventHandler JobScheduled;
         public static event JobEventHandler JobUnscheduled;
-        
+
         public static void Schedule(IJob job)
         {
             Schedule(job, JobPriority.Normal);
         }
-        
+
         public static void Schedule(IJob job, JobPriority priority)
         {
             lock(this_mutex) {
                 if(IsDisposed()) {
                     return;
                 }
-                
+
                 heap.Push(job, (int)priority);
                 //Log.DebugFormat("Job scheduled ({0}, {1})", job, priority);
                 OnJobScheduled(job);
@@ -76,7 +76,7 @@ namespace Banshee.Kernel
                 if(IsDisposed()) {
                     return;
                 }
-                
+
                 if(heap.Remove(job)) {
                     Log.DebugFormat("Job unscheduled ({0}), job", job);
                     OnJobUnscheduled(job);
@@ -85,112 +85,112 @@ namespace Banshee.Kernel
                 }
             }
         }
-        
+
         public static void Unschedule(Type type)
         {
             lock(this_mutex) {
                 Queue<IJob> to_remove = new Queue<IJob>();
-                
+
                 foreach(IJob job in ScheduledJobs) {
                     Type job_type = job.GetType();
-                    
+
                     if((type.IsInterface && job_type.GetInterface(type.Name) != null) ||
                         job_type == type || job_type.IsSubclassOf(job_type)) {
                         to_remove.Enqueue(job);
                     }
                 }
-                
+
                 while(to_remove.Count > 0) {
                     Unschedule(to_remove.Dequeue());
                 }
             }
         }
-        
+
         public static void Suspend()
         {
             lock(this_mutex) {
                 Interlocked.Increment(ref suspend_count);
             }
         }
-        
+
         public static void Resume()
         {
             lock(this_mutex) {
                 Interlocked.Decrement(ref suspend_count);
             }
         }
-        
+
         public static bool IsScheduled(IJob job)
         {
             lock(this_mutex) {
                 if(IsDisposed()) {
                     return false;
                 }
-                
+
                 return heap.Contains(job);
             }
         }
-        
+
         public static bool IsScheduled(Type type)
         {
             lock(this_mutex) {
                 if(IsDisposed()) {
                     return false;
                 }
-                
+
                 foreach(IJob job in heap) {
                     if(job.GetType() == type) {
                         return true;
                     }
                 }
-                
+
                 return false;
             }
         }
-        
+
         public static bool IsInstanceCriticalJobScheduled {
             get {
                 lock(this_mutex) {
                     if(IsDisposed()) {
                         return false;
                     }
-                    
+
                     foreach(IJob job in heap) {
                         if(job is IInstanceCriticalJob) {
                             return true;
                         }
                     }
-                    
+
                     return false;
                 }
             }
         }
-        
+
         public static IEnumerable<IJob> ScheduledJobs {
             get { lock(this_mutex) { return heap; } }
         }
-       
+
         public static int ScheduledJobsCount {
             get { lock(this_mutex) { return heap.Count; } }
         }
-        
+
         public static void Dispose()
         {
             lock(this_mutex) {
                 disposed = true;
             }
         }
-        
+
         private static bool IsDisposed()
         {
             if(disposed) {
                 //Log.Debug("Job not unscheduled; disposing scheduler");
                 return true;
             }
-            
+
             return false;
         }
-        
+
         private static void CheckRun()
         {
             if(heap.Count <= 0) {
@@ -201,25 +201,25 @@ namespace Banshee.Kernel
                 job_thread.Priority = ThreadPriority.BelowNormal;
                 job_thread.IsBackground = true;
                 job_thread.Start();
-            }   
+            }
         }
-        
+
         private static void ProcessJobThread()
         {
             while(true) {
                 current_running_job = null;
-                
+
                 if(suspend_count > 0) {
                     Thread.Sleep(10);
                     continue;
                 }
-                    
+
                 lock(this_mutex) {
                     if(disposed) {
                         job_thread = null;
                         return;
                     }
-                
+
                     try {
                         current_running_job = heap.Pop();
                     } catch(InvalidOperationException) {
@@ -227,7 +227,7 @@ namespace Banshee.Kernel
                         return;
                     }
                 }
-                
+
                 try {
                     OnJobStarted(current_running_job);
                     current_running_job.Run();
@@ -237,11 +237,11 @@ namespace Banshee.Kernel
                 }
             }
         }
-        
+
         public static IJob CurrentJob {
             get { return current_running_job; }
         }
-        
+
         private static void OnJobStarted(IJob job)
         {
             JobEventHandler handler = JobStarted;
@@ -249,7 +249,7 @@ namespace Banshee.Kernel
                 handler(job);
             }
         }
-        
+
         private static void OnJobFinished(IJob job)
         {
             JobEventHandler handler = JobFinished;
@@ -257,7 +257,7 @@ namespace Banshee.Kernel
                 handler(job);
             }
         }
-        
+
         private static void OnJobScheduled(IJob job)
         {
             JobEventHandler handler = JobScheduled;
@@ -265,7 +265,7 @@ namespace Banshee.Kernel
                 handler(job);
             }
         }
-        
+
         private static void OnJobUnscheduled(IJob job)
         {
             JobEventHandler handler = JobUnscheduled;
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs b/src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs
index 27525db..d896849 100644
--- a/src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs
+++ b/src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs
@@ -30,7 +30,7 @@ using System;
 
 namespace Banshee.Streaming
 {
-    public sealed class CommonTags 
+    public sealed class CommonTags
     {
         public const string Title             = "title";
         public const string TitleSortName     = "title-sortname";
@@ -74,13 +74,13 @@ namespace Banshee.Streaming
         public const string AlbumGain         = "replaygain-album-gain";
         public const string AlbumPeak         = "replaygain-album-peak";
         public const string StreamType        = "stream-type";
-        public const string AlbumCoverId      = "album-cover-id"; 
+        public const string AlbumCoverId      = "album-cover-id";
         public const string MoreInfoUri       = "more-info-uri";
         public const string MusicBrainzTrackId = "musicbrainz-trackid";
         public const string MusicBrainzArtistId = "musicbrainz-artistid";
         public const string MusicBrainzAlbumId = "musicbrainz-albumid";
         public const string MusicBrainzDiscId = "musicbrainz-discid";
-        
+
         // Deprecated by MB, replaced by ArtistSortName. Kept for compatibility only.
         public const string MusicBrainzSortName = "musicbrainz-sortname";
     }
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/StreamPlaybackError.cs b/src/Core/Banshee.Core/Banshee.Streaming/StreamPlaybackError.cs
index 38a7696..dc43fad 100644
--- a/src/Core/Banshee.Core/Banshee.Streaming/StreamPlaybackError.cs
+++ b/src/Core/Banshee.Core/Banshee.Streaming/StreamPlaybackError.cs
@@ -1,4 +1,4 @@
-// 
+//
 // StreamPlaybackError.cs
 //
 // Author:
@@ -28,7 +28,7 @@
 
 namespace Banshee.Streaming
 {
-    public enum StreamPlaybackError 
+    public enum StreamPlaybackError
     {
         None,
         ResourceNotFound,
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/StreamRatingTagger.cs b/src/Core/Banshee.Core/Banshee.Streaming/StreamRatingTagger.cs
new file mode 100644
index 0000000..0551c28
--- /dev/null
+++ b/src/Core/Banshee.Core/Banshee.Streaming/StreamRatingTagger.cs
@@ -0,0 +1,380 @@
+//
+// StreamRatingTagger.cs
+//
+// Author:
+//   Nicholas Parker <nickbp at gmail.com>
+//
+// Copyright (C) 2008-2009 Nicholas Parker
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using Banshee.Collection;
+using System.Collections;
+
+namespace Banshee.Streaming
+{
+    internal static class ID3v2RatingTagger
+    {
+        // What we call ourselves in POPM tags.
+        private static string POPM_our_creator_name = "Banshee";
+
+        // Ordered list of ID3v2 POPM authors to attempt when importing.
+        // Banshee must be listed first, to ensure that we give priority to our own ratings.
+        // If new entries are added to this list, also make sure that
+        // PopmToBanshee and BansheeToPopm are still accurate.
+        private static string[] POPM_known_creator_list = {
+            POPM_our_creator_name,// This item must be first
+            "quodlibet at lists.sacredchao.net",// Quod Libet (their default)
+            "Windows Media Player 9 Series",// WMP/Vista
+            "no at email",// MediaMonkey
+            "mcored at gmail.com" // iTSfv
+        };
+
+        // Converts ID3v2 POPM rating to Banshee rating
+        private static int PopmToBanshee (byte popm_rating)
+        {
+            // The following schemes are used by the other POPM-compatible players:
+            // WMP/Vista: "Windows Media Player 9 Series" ratings:
+            //   1 = 1, 2 = 64, 3=128, 4=196 (not 192), 5=255
+            // MediaMonkey: "no at email" ratings:
+            //   0.5=26, 1=51, 1.5=76, 2=102, 2.5=128,
+            //   3=153, 3.5=178, 4=204, 4.5=230, 5=255
+            // Quod Libet: "quodlibet at lists.sacredchao.net" ratings
+            //   (but that email can be changed):
+            //   arbitrary scale from 0-255
+            // Compatible with all these rating scales (what we'll use):
+            //   unrated=0, 1=1-63, 2=64-127, 3=128-191, 4=192-254, 5=255
+            if (popm_rating == 0x0)// unrated
+                return 0;
+            if (popm_rating < 0x40)// 1-63
+                return 1;
+            if (popm_rating < 0x80)// 64-127
+                return 2;
+            if (popm_rating < 0xC0)// 128-191
+                return 3;
+            if (popm_rating < 0xFF)// 192-254
+                return 4;
+            return 5;// 255
+        }
+
+        // Converts Banshee rating to ID3v2 POPM rating
+        private static byte BansheeToPopm (int banshee_rating)
+        {
+            switch (banshee_rating) {
+            case 1:
+                return 0x1;
+            case 2:
+                return 0x40;// 64
+            case 3:
+                return 0x80;// 128
+            case 4:
+                return 0xC0;// 192
+            case 5:
+                return 0xFF;// 255
+            default:
+                return 0x0;// unrated/unknown
+            }
+        }
+
+        private static TagLib.Id3v2.Tag GetTag (TagLib.File file)
+        {
+            try {
+                return file.GetTag (TagLib.TagTypes.Id3v2) as TagLib.Id3v2.Tag;
+            } catch (System.NullReferenceException e) {
+                // TagLib# can crash here on unusual files (Ex: FLAC files with ID3v2 metadata)
+                // Perhaps FLAC+ID3v2 is an unsupported combination for TagLib#?
+                Hyena.Log.WarningFormat ("Got exception when accessing ID3v2 Metadata in {0}:",
+                                         file.Name);
+                Hyena.Log.Warning (e.Message);
+                Hyena.Log.Warning (e.StackTrace);
+                return null;
+            }
+        }
+
+        // Overwrites all POPM frames with the new rating and playcount.
+        // If no *known-compatible* frames are found, a new "Banshee"-authored
+        // frame is also created to store this information.
+        public static void StoreRatingAndPlayCount (int rating, int playcount,
+                                                    TagLib.File to_file)
+        {
+            TagLib.Id3v2.Tag id3v2tag = GetTag (to_file);
+            if (id3v2tag == null) {
+                return;
+            }
+
+            bool known_frames_found = false;
+            foreach (TagLib.Id3v2.PopularimeterFrame popm in
+                     id3v2tag.GetFrames<TagLib.Id3v2.PopularimeterFrame> ()) {
+                if (System.Array.IndexOf (POPM_known_creator_list, popm.User) >= 0) {
+                    // Found a known-good POPM frame, don't need to create a "Banshee" frame.
+                    known_frames_found = true;
+                }
+
+                popm.Rating = BansheeToPopm (rating);
+                popm.PlayCount = (ulong)playcount;
+                Hyena.Log.DebugFormat ("Exporting ID3v2 Rating={0}({1}) and Playcount={2}({3}) to File \"{4}\" as Creator \"{5}\"",
+                                       rating, popm.Rating,
+                                       playcount, popm.PlayCount,
+                                       to_file.Name, popm.User);
+            }
+
+            if (!known_frames_found) {
+                // No known-good frames found, create a new POPM frame (with creator string "Banshee")
+                TagLib.Id3v2.PopularimeterFrame popm = TagLib.Id3v2.PopularimeterFrame.Get (id3v2tag,
+                                                                                            POPM_our_creator_name,
+                                                                                            true);
+                popm.Rating = BansheeToPopm (rating);
+                popm.PlayCount = (ulong)playcount;
+                Hyena.Log.DebugFormat ("Exporting ID3v2 Rating={0}({1}) and Playcount={2}({3}) to File \"{4}\" as Creator \"{5}\"",
+                                       rating, popm.Rating,
+                                       playcount, popm.PlayCount,
+                                       to_file.Name, POPM_our_creator_name);
+            }
+        }
+
+        // Scans the file for *known-compatible* POPM frames, with priority given to
+        // frames at the top of the known creator list.
+        public static void GetRatingAndPlayCount (TagLib.File from_file,
+                                                  ref int rating, ref int playcount)
+        {
+            TagLib.Id3v2.Tag id3v2tag = GetTag (from_file);
+            if (id3v2tag == null) {
+                return;
+            }
+
+            TagLib.Id3v2.PopularimeterFrame popm = null;
+            for (int i = 0; i < POPM_known_creator_list.Length; i++) {
+                popm = TagLib.Id3v2.PopularimeterFrame.Get (id3v2tag,
+                                                            POPM_known_creator_list[i],
+                                                            false);
+                if (popm != null) {
+                    break;
+                }
+            }
+
+            if (popm != null) {
+                rating = PopmToBanshee (popm.Rating);
+                playcount = (int)popm.PlayCount;
+                Hyena.Log.DebugFormat ("Importing ID3v2 Rating={0}({1}) and Playcount={2}({3}) from File \"{4}\" as Creator \"{5}\"",
+                                       rating, popm.Rating,
+                                       playcount, popm.PlayCount,
+                                       from_file.Name, popm.User);
+            }
+        }
+    }
+
+    // Applicable for Vorbis, Speex, and many (most?) FLAC files
+    // Follows the naming standard established by the Quod Libet team
+    // See: http://code.google.com/p/quodlibet/wiki/Specs_VorbisComments
+    internal static class OggRatingTagger
+    {
+        // What we call ourselves in rating/playcount tags.
+        private static string ogg_our_creator_name = "BANSHEE";
+
+        // Prefix to rating field names (lowercase)
+        private static string rating_prefix = "RATING:";
+
+        // Prefix to playcount field names (lowercase)
+        private static string playcount_prefix = "PLAYCOUNT:";
+
+        // Converts Ogg rating to Banshee rating
+        private static int OggToBanshee (string ogg_rating_str)
+        {
+            double ogg_rating = double.Parse (ogg_rating_str);
+            // Quod Libet Ogg ratings are stored as a value
+            // between 0.0 and 1.0 inclusive, where unrated = 0.5.
+            if (ogg_rating == 0.5)// unrated
+                return 0;
+            if (ogg_rating > 0.8)// (0.8,1.0]
+                return 5;
+            if (ogg_rating > 0.6)// (0.6,0.8]
+                return 4;
+            if (ogg_rating > 0.4)// (0.4,0.5),(0.5,0.6]
+                return 3;
+            if (ogg_rating > 0.2)// (0.2,0.4]
+                return 2;
+            else // [0.0,0.2]
+                return 1;
+        }
+
+        // Converts Banshee rating to Ogg rating
+        private static string BansheeToOgg (int banshee_rating)
+        {
+            // I went with this scaling so that if we switch to fractional stars
+            // in the future (such as "0.25 stars"), we'll have room for that.
+            switch (banshee_rating) {
+            case 1:
+                return "0.2";
+            case 2:
+                return "0.4";
+            case 3:
+                return "0.6";
+            case 4:
+                return "0.8";
+            case 5:
+                return "1.0";
+            default:
+                return "0.5";// unrated/unknown
+            }
+        }
+
+        private static TagLib.Ogg.XiphComment GetTag (TagLib.File file)
+        {
+            try {
+                return file.GetTag (TagLib.TagTypes.Xiph) as TagLib.Ogg.XiphComment;
+            } catch (System.NullReferenceException e) {
+                // Haven't seen crashes when getting Ogg tags, but just in case..
+                // (See commentary for ID3v2 version)
+                Hyena.Log.WarningFormat ("Got exception when accessing Ogg Metadata in {0}:",
+                                         file.Name);
+                Hyena.Log.Warning (e.Message);
+                Hyena.Log.Warning (e.StackTrace);
+                return null;
+            }
+        }
+
+        // Scans the file for ogg rating/playcount tags as defined by the Quod Libet standard
+        // If a Banshee tag is found, it is given priority.
+        // If a Banshee tag is not found, the last rating/playcount tags found are used
+        public static void GetRatingAndPlayCount (TagLib.File from_file,
+                                                  ref int rating, ref int playcount)
+        {
+            TagLib.Ogg.XiphComment xiphtag = GetTag (from_file);
+            if (xiphtag == null) {
+                return;
+            }
+
+            bool banshee_rating_done = false, banshee_playcount_done = false;
+            string rating_raw = "", playcount_raw = "";
+
+            foreach (string fieldname in xiphtag) {
+
+                if (!banshee_rating_done &&
+                    fieldname.ToUpper ().StartsWith (rating_prefix)) {
+
+                    rating_raw = xiphtag.GetFirstField (fieldname);
+                    string rating_creator = fieldname.Substring (rating_prefix.Length);
+                    if (rating_creator.ToUpper () == ogg_our_creator_name) {
+                        // We made this rating, consider it authoritative.
+                        banshee_rating_done = true;
+                        // Don't return -- we might not have seen a playcount yet.
+                    }
+
+                } else if (!banshee_playcount_done &&
+                           fieldname.ToUpper ().StartsWith (playcount_prefix)) {
+
+                    playcount_raw = xiphtag.GetFirstField (fieldname);
+                    string playcount_creator = fieldname.Substring (playcount_prefix.Length);
+                    if (playcount_creator.ToUpper () == ogg_our_creator_name) {
+                        // We made this playcount, consider it authoritative.
+                        banshee_playcount_done = true;
+                        // Don't return -- we might not have seen a rating yet.
+                    }
+                }
+            }
+            if (rating_raw != "") {
+                rating = OggToBanshee (rating_raw);
+            }
+            if (playcount_raw != "") {
+                playcount = int.Parse (playcount_raw);
+            }
+            Hyena.Log.DebugFormat ("Importing Ogg Rating={0}({1}) and Playcount={2}({3}) from File \"{4}\"",
+                                   rating, rating_raw,
+                                   playcount, playcount_raw, from_file.Name);
+        }
+
+        // Scans the file for ogg rating/playcount tags as defined by the Quod Libet standard
+        // All applicable tags are overwritten with the new values, regardless of tag author
+        public static void StoreRatingAndPlayCount (int rating, int playcount,
+                                                    TagLib.File to_file)
+        {
+            TagLib.Ogg.XiphComment xiphtag = GetTag (to_file);
+            if (xiphtag == null) {
+                return;
+            }
+
+            ArrayList rating_fieldnames = new ArrayList ();
+            ArrayList playcount_fieldnames = new ArrayList ();
+
+            // Collect list of rating and playcount tags to be updated:
+            foreach (string fieldname in xiphtag) {
+                if (fieldname.ToUpper ().StartsWith (rating_prefix)) {
+                    rating_fieldnames.Add (fieldname);
+                } else if (fieldname.ToUpper ().StartsWith (playcount_prefix)) {
+                    playcount_fieldnames.Add (fieldname);
+                }
+            }
+            // Add "BANSHEE" tags if no rating/playcount tags were found:
+            if (rating_fieldnames.Count == 0) {
+                rating_fieldnames.Add (rating_prefix+ogg_our_creator_name);
+            }
+            if (playcount_fieldnames.Count == 0) {
+                playcount_fieldnames.Add (playcount_prefix+ogg_our_creator_name);
+            }
+
+            string ogg_rating = BansheeToOgg (rating);
+            foreach (string ratingname in rating_fieldnames) {
+                xiphtag.SetField (ratingname, ogg_rating);
+                Hyena.Log.DebugFormat ("Exporting Ogg Rating={0}({1}) to File \"{2}\" as Creator \"{3}\"",
+                                       rating, ogg_rating,
+                                       to_file.Name,
+                                       ratingname.Substring (rating_prefix.Length));
+            }
+            string ogg_playcount = playcount.ToString ();
+            foreach (string playcountname in playcount_fieldnames) {
+                xiphtag.SetField (playcountname, ogg_playcount);
+                Hyena.Log.DebugFormat ("Exporting Ogg Playcount={0}({1}) to File \"{2}\" as Creator \"{3}\"",
+                                       playcount, ogg_playcount,
+                                       to_file.Name,
+                                       playcountname.Substring (playcount_prefix.Length));
+            }
+        }
+    }
+
+    public static class StreamRatingTagger
+    {
+        public static void GetRatingAndPlayCount (TagLib.File from_file,
+                                                  ref int rating, ref int playcount)
+        {
+            if ((from_file.Tag.TagTypes & TagLib.TagTypes.Id3v2) != 0) {
+                ID3v2RatingTagger.GetRatingAndPlayCount (from_file,
+                                                         ref rating, ref playcount);
+            }
+            if ((from_file.Tag.TagTypes & TagLib.TagTypes.Xiph) != 0) {
+                OggRatingTagger.GetRatingAndPlayCount (from_file,
+                                                       ref rating, ref playcount);
+            }
+        }
+
+        public static void StoreRatingAndPlayCount (int rating, int playcount,
+                                                    TagLib.File to_file)
+        {
+            if ((to_file.Tag.TagTypes & TagLib.TagTypes.Id3v2) != 0) {
+                ID3v2RatingTagger.StoreRatingAndPlayCount (rating, playcount,
+                                                           to_file);
+            }
+            if ((to_file.Tag.TagTypes & TagLib.TagTypes.Xiph) != 0) {
+                OggRatingTagger.StoreRatingAndPlayCount (rating, playcount,
+                                                         to_file);
+            }
+        }
+    }
+}
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/StreamTag.cs b/src/Core/Banshee.Core/Banshee.Streaming/StreamTag.cs
index 682e3da..e6befb7 100644
--- a/src/Core/Banshee.Core/Banshee.Streaming/StreamTag.cs
+++ b/src/Core/Banshee.Core/Banshee.Streaming/StreamTag.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 
 namespace Banshee.Streaming
@@ -33,10 +33,10 @@ namespace Banshee.Streaming
     public struct StreamTag
     {
         public static readonly StreamTag Zero;
-  
+
         public string Name;
         public object Value;
-        
+
         public override string ToString()
         {
             return String.Format("{0} = {1}", Name, Value);
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs b/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
index ab7baf2..589dfaa 100644
--- a/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
+++ b/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
@@ -40,15 +40,15 @@ namespace Banshee.Streaming
         // This is a short list of video types that TagLib# might not support but that
         // we want to make sure are recognized as videos
         private static readonly ExtensionSet VideoExtensions = new ExtensionSet (
-            "avi", "divx", "dv", "f4p", "f4v", "flv", "m4v", "mkv", "mov", "ogv", "qt");
-        
+            "avi", "divx", "dv", "f4p", "f4v", "flv", "m4v", "mkv", "mov", "ogv", "qt", "ts");
+
         public static TagLib.File ProcessUri (SafeUri uri)
         {
             try {
-                TagLib.File file = Banshee.IO.DemuxVfs.OpenFile (uri.IsLocalPath ? uri.LocalPath : uri.AbsoluteUri, 
+                TagLib.File file = Banshee.IO.DemuxVfs.OpenFile (uri.IsLocalPath ? uri.LocalPath : uri.AbsoluteUri,
                     null, TagLib.ReadStyle.Average);
-    
-                if ((file.Properties.MediaTypes & TagLib.MediaTypes.Audio) == 0 && 
+
+                if ((file.Properties.MediaTypes & TagLib.MediaTypes.Audio) == 0 &&
                     (file.Properties.MediaTypes & TagLib.MediaTypes.Video) == 0) {
                     throw new TagLib.UnsupportedFormatException ("File does not contain video or audio");
                 }
@@ -63,40 +63,45 @@ namespace Banshee.Streaming
         {
             return Choose (priority, fallback, false);
         }
-    
+
         private static string Choose (string priority, string fallback, bool flip)
         {
-            return flip 
-                ? String.IsNullOrEmpty (fallback) ? priority : fallback
-                : String.IsNullOrEmpty (priority) ? fallback : priority;
+            return flip
+                ? IsNullOrEmpty (fallback) ? priority : fallback
+                : IsNullOrEmpty (priority) ? fallback : priority;
+        }
+
+        private static bool IsNullOrEmpty (string s)
+        {
+            return String.IsNullOrEmpty (s) || s.IndexOf ('\0') >= 0 && s.Trim ('\0').Length == 0;
         }
 
         #pragma warning disable 0169
-        
+
         private static int Choose (int priority, int fallback)
         {
             return Choose (priority, fallback, false);
         }
-        
+
         #pragma warning restore 0169
-        
+
         private static int Choose (int priority, int fallback, bool flip)
         {
-            return flip 
+            return flip
                 ? (fallback <= 0 ? priority : fallback)
                 : (priority <= 0 ? fallback : priority);
         }
-        
+
         private static void FindTrackMediaAttributes (TrackInfo track, TagLib.File file)
         {
             if ((file.Properties.MediaTypes & TagLib.MediaTypes.Audio) != 0) {
                 track.MediaAttributes |= TrackMediaAttributes.AudioStream;
             }
-            
+
             if ((file.Properties.MediaTypes & TagLib.MediaTypes.Video) != 0) {
                 track.MediaAttributes |= TrackMediaAttributes.VideoStream;
             }
-            
+
             if (file.Tag.FirstGenre == "Podcast" || file.Tag.Album == "Podcast") {
                 track.MediaAttributes |= TrackMediaAttributes.Podcast;
             }
@@ -121,7 +126,7 @@ namespace Banshee.Streaming
                 track.TrackTitle = uri.AbsoluteUri;
             }
         }
-        
+
         public static void TrackInfoMerge (TrackInfo track, TagLib.File file)
         {
             TrackInfoMerge (track, file, false);
@@ -129,6 +134,11 @@ namespace Banshee.Streaming
 
         public static void TrackInfoMerge (TrackInfo track, TagLib.File file, bool preferTrackInfo)
         {
+            TrackInfoMerge (track, file, preferTrackInfo, false);
+        }
+
+        public static void TrackInfoMerge (TrackInfo track, TagLib.File file, bool preferTrackInfo, bool import_rating_and_play_count)
+        {
             // TODO support these as arrays:
             // Performers[] (track artists), AlbumArtists[], Composers[], Genres[]
 
@@ -139,9 +149,9 @@ namespace Banshee.Streaming
                 track.MimeType = file.MimeType;
                 track.Duration = file.Properties.Duration;
                 track.BitRate  = file.Properties.AudioBitrate;
-                
+
                 FindTrackMediaAttributes (track, file);
-    
+
                 track.ArtistName = Choose (file.Tag.JoinedPerformers, track.ArtistName, preferTrackInfo);
                 track.ArtistNameSort = Choose (file.Tag.JoinedPerformersSort, track.ArtistNameSort, preferTrackInfo);
                 track.AlbumTitle = Choose (file.Tag.Album, track.AlbumTitle, preferTrackInfo);
@@ -149,7 +159,7 @@ namespace Banshee.Streaming
                 track.AlbumArtist = Choose (file.Tag.FirstAlbumArtist, track.AlbumArtist, preferTrackInfo);
                 track.AlbumArtistSort = Choose (file.Tag.FirstAlbumArtistSort, track.AlbumArtistSort, preferTrackInfo);
                 track.IsCompilation = IsCompilation (file);
-                
+
                 track.TrackTitle = Choose (file.Tag.Title, track.TrackTitle, preferTrackInfo);
                 track.TrackTitleSort = Choose (file.Tag.TitleSort, track.TrackTitleSort, preferTrackInfo);
                 track.Genre = Choose (file.Tag.FirstGenre, track.Genre, preferTrackInfo);
@@ -158,13 +168,20 @@ namespace Banshee.Streaming
                 track.Grouping = Choose (file.Tag.Grouping, track.Grouping, preferTrackInfo);
                 track.Copyright = Choose (file.Tag.Copyright, track.Copyright, preferTrackInfo);
                 track.Comment = Choose (file.Tag.Comment, track.Comment, preferTrackInfo);
-    
+
                 track.TrackNumber = Choose ((int)file.Tag.Track, track.TrackNumber, preferTrackInfo);
                 track.TrackCount = Choose ((int)file.Tag.TrackCount, track.TrackCount, preferTrackInfo);
                 track.DiscNumber = Choose ((int)file.Tag.Disc, track.DiscNumber, preferTrackInfo);
                 track.DiscCount = Choose ((int)file.Tag.DiscCount, track.DiscCount, preferTrackInfo);
                 track.Year = Choose ((int)file.Tag.Year, track.Year, preferTrackInfo);
                 track.Bpm = Choose ((int)file.Tag.BeatsPerMinute, track.Bpm, preferTrackInfo);
+
+                if (import_rating_and_play_count) {
+                    int file_rating = 0, file_playcount = 0;
+                    StreamRatingTagger.GetRatingAndPlayCount (file, ref file_rating, ref file_playcount);
+                    track.Rating = Choose (file_rating, track.Rating, preferTrackInfo);
+                    track.PlayCount = Choose (file_playcount, track.PlayCount, preferTrackInfo);
+                }
             } else {
                 track.MediaAttributes = TrackMediaAttributes.AudioStream;
                 if (track.Uri != null && VideoExtensions.IsMatchingFile (track.Uri.LocalPath)) {
@@ -184,12 +201,12 @@ namespace Banshee.Streaming
                     }
                 } catch {}
             }
-            
+
             // TODO look for track number in the file name if not set?
             // TODO could also pull artist/album from folders _iff_ files two levels deep in the MusicLibrary folder
             // TODO these ideas could also be done in an extension that collects such hacks
         }
-            
+
         private static bool IsCompilation (TagLib.File file)
         {
             try {
@@ -203,7 +220,7 @@ namespace Banshee.Streaming
                 if (apple_tag != null && apple_tag.IsCompilation)
                     return true;
             } catch {}
-            
+
             // FIXME the FirstAlbumArtist != FirstPerformer check might return true for half the
             // tracks on a compilation album, but false for some
             // TODO checked for 'Soundtrack' (and translated) in the title?
@@ -234,7 +251,7 @@ namespace Banshee.Streaming
             } catch {}
         }
 
-        public static bool SaveToFile (TrackInfo track)
+        public static bool SaveToFile (TrackInfo track, bool write_metadata, bool write_rating_and_play_count)
         {
             // FIXME taglib# does not seem to handle writing metadata to video files well at all atm
             // so not allowing
@@ -242,38 +259,46 @@ namespace Banshee.Streaming
                 Hyena.Log.DebugFormat ("Avoiding 100% cpu bug with taglib# by not writing metadata to video file {0}", track);
                 return false;
             }
-        
+
             // Note: this should be kept in sync with the metadata read in StreamTagger.cs
             TagLib.File file = ProcessUri (track.Uri);
             if (file == null) {
                 return false;
             }
-            
-            file.Tag.Performers = new string [] { track.ArtistName };
-            file.Tag.PerformersSort = new string [] { track.ArtistNameSort };
-            file.Tag.Album = track.AlbumTitle;
-            file.Tag.AlbumSort = track.AlbumTitleSort;
-            file.Tag.AlbumArtists = track.AlbumArtist == null ? new string [0] : new string [] {track.AlbumArtist};
-            file.Tag.AlbumArtistsSort = (track.AlbumArtistSort == null ? new string [0] : new string [] {track.AlbumArtistSort});
-            // Bug in taglib-sharp-2.0.3.0: Crash if you send it a genre of "{ null }"
-            // on a song with both ID3v1 and ID3v2 metadata. It's happy with "{}", though.
-            // (see http://forum.taglib-sharp.com/viewtopic.php?f=5&t=239 )
-            file.Tag.Genres = (track.Genre == null) ? new string[] {} : new string [] { track.Genre };
-            file.Tag.Title = track.TrackTitle;
-            file.Tag.TitleSort = track.TrackTitleSort;
-            file.Tag.Track = (uint)track.TrackNumber;
-            file.Tag.TrackCount = (uint)track.TrackCount;
-            file.Tag.Composers = new string [] { track.Composer };
-            file.Tag.Conductor = track.Conductor;
-            file.Tag.Grouping = track.Grouping;
-            file.Tag.Copyright = track.Copyright;
-            file.Tag.Comment = track.Comment;
-            file.Tag.Disc = (uint)track.DiscNumber;
-            file.Tag.DiscCount = (uint)track.DiscCount;
-            file.Tag.Year = (uint)track.Year;
-            file.Tag.BeatsPerMinute = (uint)track.Bpm;
-            
-            SaveIsCompilation (file, track.IsCompilation);
+
+            if (write_metadata) {
+                file.Tag.Performers = new string [] { track.ArtistName };
+                file.Tag.PerformersSort = new string [] { track.ArtistNameSort };
+                file.Tag.Album = track.AlbumTitle;
+                file.Tag.AlbumSort = track.AlbumTitleSort;
+                file.Tag.AlbumArtists = track.AlbumArtist == null ? new string [0] : new string [] {track.AlbumArtist};
+                file.Tag.AlbumArtistsSort = (track.AlbumArtistSort == null ? new string [0] : new string [] {track.AlbumArtistSort});
+                // Bug in taglib-sharp-2.0.3.0: Crash if you send it a genre of "{ null }"
+                // on a song with both ID3v1 and ID3v2 metadata. It's happy with "{}", though.
+                // (see http://forum.taglib-sharp.com/viewtopic.php?f=5&t=239 )
+                file.Tag.Genres = (track.Genre == null) ? new string[] {} : new string [] { track.Genre };
+                file.Tag.Title = track.TrackTitle;
+                file.Tag.TitleSort = track.TrackTitleSort;
+                file.Tag.Track = (uint)track.TrackNumber;
+                file.Tag.TrackCount = (uint)track.TrackCount;
+                file.Tag.Composers = new string [] { track.Composer };
+                file.Tag.Conductor = track.Conductor;
+                file.Tag.Grouping = track.Grouping;
+                file.Tag.Copyright = track.Copyright;
+                file.Tag.Comment = track.Comment;
+                file.Tag.Disc = (uint)track.DiscNumber;
+                file.Tag.DiscCount = (uint)track.DiscCount;
+                file.Tag.Year = (uint)track.Year;
+                file.Tag.BeatsPerMinute = (uint)track.Bpm;
+
+                SaveIsCompilation (file, track.IsCompilation);
+            }
+
+            if (write_rating_and_play_count) {
+                // FIXME move StreamRatingTagger to taglib#
+                StreamRatingTagger.StoreRatingAndPlayCount (track.Rating, track.PlayCount, file);
+            }
+
             file.Save ();
 
             track.FileSize = Banshee.IO.File.GetSize (track.Uri);
@@ -281,7 +306,7 @@ namespace Banshee.Streaming
             track.LastSyncedStamp = DateTime.Now;
             return true;
         }
-    
+
         public static void TrackInfoMerge (TrackInfo track, StreamTag tag)
         {
             try {
@@ -298,7 +323,7 @@ namespace Banshee.Streaming
                         string title = Choose ((string)tag.Value, track.TrackTitle);
 
                         // Try our best to figure out common patterns in poor radio metadata.
-                        // Often only one tag is sent on track changes inside the stream, 
+                        // Often only one tag is sent on track changes inside the stream,
                         // which is title, and usually contains artist and track title, separated
                         // with a " - " string.
                         if (track.IsLive && title.Contains (" - ")) {
@@ -370,7 +395,7 @@ namespace Banshee.Streaming
                     case CommonTags.MoreInfoUri:
                         track.MoreInfoUri = (SafeUri)tag.Value;
                         break;
-                    /* No year tag in GST it seems 
+                    /* No year tag in GST it seems
                     case CommonTags.Year:
                         track.Year = (uint)tag.Value;
                         break;*/
diff --git a/src/Core/Banshee.Core/Makefile.am b/src/Core/Banshee.Core/Makefile.am
index 219235b..ccf03e9 100644
--- a/src/Core/Banshee.Core/Makefile.am
+++ b/src/Core/Banshee.Core/Makefile.am
@@ -22,6 +22,7 @@ SOURCES =  \
 	Banshee.Collection/CacheableItem.cs \
 	Banshee.Collection/FileTrackInfo.cs \
 	Banshee.Collection/IBasicTrackInfo.cs \
+	Banshee.Collection/IPodcastInfo.cs \
 	Banshee.Collection/ITrackInfo.cs \
 	Banshee.Collection/SampleTrackInfo.cs \
 	Banshee.Collection/TrackAttributes.cs \
@@ -62,6 +63,7 @@ SOURCES =  \
 	Banshee.Kernel/Scheduler.cs \
 	Banshee.Streaming/CommonTags.cs \
 	Banshee.Streaming/StreamPlaybackError.cs \
+	Banshee.Streaming/StreamRatingTagger.cs \
 	Banshee.Streaming/StreamTag.cs \
 	Banshee.Streaming/StreamTagger.cs
 
diff --git a/src/Core/Banshee.Core/Makefile.in b/src/Core/Banshee.Core/Makefile.in
index 762d9b5..4fb2b5d 100644
--- a/src/Core/Banshee.Core/Makefile.in
+++ b/src/Core/Banshee.Core/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -365,6 +374,7 @@ SOURCES = \
 	Banshee.Collection/CacheableItem.cs \
 	Banshee.Collection/FileTrackInfo.cs \
 	Banshee.Collection/IBasicTrackInfo.cs \
+	Banshee.Collection/IPodcastInfo.cs \
 	Banshee.Collection/ITrackInfo.cs \
 	Banshee.Collection/SampleTrackInfo.cs \
 	Banshee.Collection/TrackAttributes.cs \
@@ -405,6 +415,7 @@ SOURCES = \
 	Banshee.Kernel/Scheduler.cs \
 	Banshee.Streaming/CommonTags.cs \
 	Banshee.Streaming/StreamPlaybackError.cs \
+	Banshee.Streaming/StreamRatingTagger.cs \
 	Banshee.Streaming/StreamTag.cs \
 	Banshee.Streaming/StreamTagger.cs
 
@@ -435,6 +446,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -538,11 +550,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -560,6 +573,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -589,6 +603,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -609,14 +624,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Banshee.Core/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Banshee.Core/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Banshee.Core/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Banshee.Core/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -634,25 +649,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -682,13 +713,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -720,6 +755,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -740,6 +776,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -748,18 +786,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -820,7 +868,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -837,6 +885,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Core/Banshee.Core/Resources/contributors.xml b/src/Core/Banshee.Core/Resources/contributors.xml
index 91e8a0e..8fd8c69 100644
--- a/src/Core/Banshee.Core/Resources/contributors.xml
+++ b/src/Core/Banshee.Core/Resources/contributors.xml
@@ -57,6 +57,7 @@
   <contributor>Florent Thoumie</contributor>
   <contributor>Fredrik Hedberg</contributor>
   <contributor>Félix Velasco</contributor>
+  <contributor>Götz Waschk</contributor>
   <contributor>Haitao Feng</contributor>
   <contributor>Hans Petter Jansson</contributor>
   <contributor>Iain Lane</contributor>
@@ -67,9 +68,11 @@
   <contributor>James Willcox</contributor>
   <contributor>Jan Arne Petersen</contributor>
   <contributor>Jason Conti</contributor>
+  <contributor>Jason Taylor</contributor>
   <contributor>Jeff Tickle</contributor>
   <contributor>Jeff Wheeler</contributor>
   <contributor>Jensen Somers</contributor>
+  <contributor>Jérémie Laval</contributor>
   <contributor>Jo Shields</contributor>
   <contributor>Johannes Kuhn</contributor>
   <contributor>Jorge Castro</contributor>
diff --git a/src/Core/Banshee.Core/Resources/translators.xml b/src/Core/Banshee.Core/Resources/translators.xml
index 83cbe82..3afc662 100644
--- a/src/Core/Banshee.Core/Resources/translators.xml
+++ b/src/Core/Banshee.Core/Resources/translators.xml
@@ -177,6 +177,7 @@
   </language>
   <language code="zh_CN" name="Simplified Chinese">
     <person>Aron Xu</person>
+    <person>Tao Wei</person>
     <person>甘露(Gan Lu)</person>
   </language>
   <language code="zh_HK" name="Chinese">
diff --git a/src/Core/Banshee.Services/Banshee.Base/ThreadAssist.cs b/src/Core/Banshee.Services/Banshee.Base/ThreadAssist.cs
index 44220ae..9344230 100644
--- a/src/Core/Banshee.Services/Banshee.Base/ThreadAssist.cs
+++ b/src/Core/Banshee.Services/Banshee.Base/ThreadAssist.cs
@@ -38,20 +38,20 @@ namespace Banshee.Base
         public static Thread MainThread {
             get { return main_thread; }
         }
-        
+
         public static void InitializeMainThread ()
         {
             main_thread = Thread.CurrentThread;
             main_thread.Name = "Main Thread";
         }
-        
+
         public static bool InMainThread {
             get {
                 if (main_thread == null) {
                     throw new ApplicationException ("ThreadAssist.InitializeMainThread must be called first");
                 }
- 
-                return main_thread.Equals (Thread.CurrentThread); 
+
+                return main_thread.Equals (Thread.CurrentThread);
             }
         }
 
@@ -61,14 +61,14 @@ namespace Banshee.Base
                 Hyena.Log.Warning ("In GUI thread, will probably block it", System.Environment.StackTrace);
             }
         }
-        
+
         public static void AssertInMainThread ()
         {
             if (ApplicationContext.Debugging && !InMainThread) {
                 Hyena.Log.Warning ("Not in main thread!", System.Environment.StackTrace);
             }
         }
-        
+
         public static void ProxyToMain (InvokeHandler handler)
         {
             if (!InMainThread) {
@@ -86,7 +86,7 @@ namespace Banshee.Base
                 threadedMethod ();
             }
         }
-        
+
         public static Thread Spawn (ThreadStart threadedMethod, bool autoStart)
         {
             Thread thread = new Thread (threadedMethod);
@@ -97,7 +97,7 @@ namespace Banshee.Base
             }
             return thread;
         }
-        
+
         public static Thread Spawn (ThreadStart threadedMethod)
         {
             return Spawn (threadedMethod, true);
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/CachedList.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/CachedList.cs
index cb6351f..e63b02e 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/CachedList.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/CachedList.cs
@@ -54,7 +54,7 @@ namespace Banshee.Collection.Database
         }
 
         private BansheeModelCache<T> cache;
-        
+
         public static CachedList<DatabaseTrackInfo> CreateFromSourceModel (DatabaseTrackListModel model)
         {
             CachedList<DatabaseTrackInfo> list = new CachedList<DatabaseTrackInfo> (DatabaseTrackInfo.Provider);
@@ -63,16 +63,16 @@ namespace Banshee.Collection.Database
                 INSERT INTO CoreCache (ModelID, ItemID)
                     SELECT ?, CoreTracks.TrackID {0}", model.UnfilteredQuery
             ));
-            
+
             lock (model) {
                 ServiceManager.DbConnection.Execute (model_cache_command, list.CacheId);
             }
 
             list.cache.UpdateAggregates ();
 
-            return list;  
+            return list;
         }
-        
+
         public static CachedList<DatabaseTrackInfo> CreateFromModel (DatabaseTrackListModel model)
         {
             Selection selection = new Selection ();
@@ -80,7 +80,7 @@ namespace Banshee.Collection.Database
             selection.SelectAll ();
             return CreateFromModelAndSelection (model, selection);
         }
-        
+
         public static CachedList<DatabaseTrackInfo> CreateFromModelSelection (DatabaseTrackListModel model)
         {
             return CreateFromModelAndSelection (model, model.Selection);
@@ -116,7 +116,7 @@ namespace Banshee.Collection.Database
         {
             ServiceManager.DbConnection.Execute ("DELETE FROM CoreCache WHERE ModelId = ?", CacheId);
         }
-        
+
         public void Remove (IEnumerable<T> items)
         {
             lock (cache) {
@@ -126,19 +126,19 @@ namespace Banshee.Collection.Database
                     if (!first) {
                         builder.Append (',');
                     }
-                    
+
                     builder.Append (item.CacheEntryId);
                     first = false;
                 }
-                
+
                 ServiceManager.DbConnection.Execute (String.Format (
-                    "DELETE FROM CoreCache WHERE ModelId = {0} AND ItemId IN ({1})", 
+                    "DELETE FROM CoreCache WHERE ModelId = {0} AND ItemId IN ({1})",
                     CacheId, builder));
-                    
+
                 cache.UpdateAggregates ();
             }
         }
-        
+
         public T this[int index] {
             get { return cache.GetValue (index); }
         }
@@ -157,7 +157,7 @@ namespace Banshee.Collection.Database
                 yield return cache.GetValue (i);
             }
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
index 1cfe0ea..d6db36d 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
@@ -64,7 +64,7 @@ namespace Banshee.Collection.Database
         private static int last_artist_id;
         private static string last_title;
         private static DatabaseAlbumInfo last_album;
-        
+
         public static void Reset ()
         {
             last_artist_id = -1;
@@ -89,7 +89,7 @@ namespace Banshee.Collection.Database
             }
             return db.Query (default_select_command, artist_id, title);
         }
-        
+
         public static DatabaseAlbumInfo FindOrCreate (DatabaseArtistInfo artist, DatabaseAlbumInfo album)
         {
             if (album.Title == last_title && artist.DbId == last_artist_id && last_album != null) {
@@ -110,7 +110,7 @@ namespace Banshee.Collection.Database
                         last_album.ArtistName = artist.Name;
                         save = true;
                     }
-                    
+
                     // Ditto artist sort name
                     if (last_album.ArtistNameSort != artist.NameSort) {
                         last_album.ArtistNameSort = artist.NameSort;
@@ -140,7 +140,7 @@ namespace Banshee.Collection.Database
                     last_album = album;
                 }
             }
-            
+
             last_title = album.Title;
             last_artist_id = artist.DbId;
             return last_album;
@@ -184,19 +184,19 @@ namespace Banshee.Collection.Database
             get { return artist_id; }
             set { artist_id = value; }
         }
-        
+
         [DatabaseColumn("MusicBrainzID")]
         public override string MusicBrainzId {
             get { return base.MusicBrainzId; }
             set { base.MusicBrainzId = value; }
         }
-        
+
         [DatabaseColumn]
         public override DateTime ReleaseDate {
             get { return base.ReleaseDate; }
             set { base.ReleaseDate = value; }
         }
-        
+
         [DatabaseColumn]
         public override bool IsCompilation {
             get { return base.IsCompilation; }
@@ -208,13 +208,13 @@ namespace Banshee.Collection.Database
             get { return base.Title; }
             set { base.Title = value; }
         }
-        
+
         [DatabaseColumn]
         public override string TitleSort {
             get { return base.TitleSort; }
             set { base.TitleSort = value; }
         }
-        
+
         [DatabaseColumn(Select = false)]
         internal byte[] TitleSortKey {
             get { return Hyena.StringUtil.SortKey (TitleSort ?? DisplayTitle); }
@@ -241,7 +241,7 @@ namespace Banshee.Collection.Database
         internal byte[] ArtistNameSortKey {
             get { return Hyena.StringUtil.SortKey (ArtistNameSort ?? DisplayArtistName); }
         }
-        
+
         [DatabaseColumn(Select = false)]
         internal string ArtistNameLowered {
             get { return Hyena.StringUtil.SearchKey (DisplayArtistName); }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
index 76c32b9..b409d2d 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
@@ -42,7 +42,7 @@ namespace Banshee.Collection.Database
 {
     public class DatabaseAlbumListModel : DatabaseFilterListModel<DatabaseAlbumInfo, AlbumInfo>
     {
-        public DatabaseAlbumListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
+        public DatabaseAlbumListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid)
             : base (Banshee.Query.BansheeQuery.AlbumField.Name, Banshee.Query.BansheeQuery.AlbumField.Label,
                     source, trackModel, connection, DatabaseAlbumInfo.Provider, new AlbumInfo (null), uuid)
         {
@@ -53,16 +53,16 @@ namespace Banshee.Collection.Database
                                   CoreCache.ItemId = {2} {3})
                     ORDER BY CoreAlbums.TitleSortKey, CoreAlbums.ArtistNameSortKey";
         }
-        
+
         public override string FilterColumn {
             get { return "CoreTracks.AlbumID"; }
         }
-        
+
         protected override string ItemToFilterValue (object item)
         {
             return (item is DatabaseAlbumInfo) ? (item as DatabaseAlbumInfo).DbId.ToString () : null;
         }
-        
+
         public override void UpdateSelectAllItem (long count)
         {
             select_all_item.Title = String.Format (Catalog.GetString ("All Albums ({0})"), count);
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
index 6a63e63..e3887ab 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
@@ -60,7 +60,7 @@ namespace Banshee.Collection.Database
             provider.Select, provider.From,
             (String.IsNullOrEmpty (provider.Where) ? "1=1" : provider.Where)
         ));
-        
+
         private static string last_artist_name = null;
         private static DatabaseArtistInfo last_artist = null;
 
@@ -69,7 +69,7 @@ namespace Banshee.Collection.Database
             last_artist_name = null;
             last_artist = null;
         }
-        
+
         public static DatabaseArtistInfo FindOrCreate (string artistName, string artistNameSort)
         {
             DatabaseArtistInfo artist = new DatabaseArtistInfo ();
@@ -77,7 +77,7 @@ namespace Banshee.Collection.Database
             artist.NameSort = artistNameSort;
             return FindOrCreate (artist);
         }
-        
+
         private static IDataReader FindExistingArtists (string name)
         {
             HyenaSqliteConnection db = ServiceManager.DbConnection;
@@ -86,7 +86,7 @@ namespace Banshee.Collection.Database
             }
             return db.Query (default_select_command, name);
         }
-        
+
         public static DatabaseArtistInfo FindOrCreate (DatabaseArtistInfo artist)
         {
             if (artist.Name == last_artist_name && last_artist != null) {
@@ -96,7 +96,7 @@ namespace Banshee.Collection.Database
             if (String.IsNullOrEmpty (artist.Name) || artist.Name.Trim () == String.Empty) {
                 artist.Name = null;
             }
-            
+
             using (IDataReader reader = FindExistingArtists (artist.Name)) {
                 if (reader.Read ()) {
                     last_artist = provider.Load (reader);
@@ -109,7 +109,7 @@ namespace Banshee.Collection.Database
                     last_artist = artist;
                 }
             }
-            
+
             last_artist_name = artist.Name;
             return last_artist;
         }
@@ -126,7 +126,7 @@ namespace Banshee.Collection.Database
             }
             return artist;
         }
-        
+
         public DatabaseArtistInfo () : base (null, null)
         {
         }
@@ -163,13 +163,13 @@ namespace Banshee.Collection.Database
         internal byte[] NameSortKey {
             get { return Hyena.StringUtil.SortKey (NameSort ?? DisplayName); }
         }
-        
+
         [DatabaseColumn("MusicBrainzID")]
         public override string MusicBrainzId {
             get { return base.MusicBrainzId; }
             set { base.MusicBrainzId = value; }
         }
-        
+
         public override string ToString ()
         {
             return String.Format ("DatabaseArtistInfo<DbId: {0}, Name: {1}>", DbId, Name);
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
index 697f28c..602453a 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
@@ -41,8 +41,8 @@ namespace Banshee.Collection.Database
 {
     public class DatabaseArtistListModel : DatabaseFilterListModel<DatabaseArtistInfo, ArtistInfo>
     {
-        public DatabaseArtistListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
-            : base (Banshee.Query.BansheeQuery.ArtistField.Name, Banshee.Query.BansheeQuery.ArtistField.Label, 
+        public DatabaseArtistListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid)
+            : base (Banshee.Query.BansheeQuery.ArtistField.Name, Banshee.Query.BansheeQuery.ArtistField.Label,
                     source, trackModel, connection, DatabaseArtistInfo.Provider, new ArtistInfo (null, null), uuid)
         {
             ReloadFragmentFormat = @"
@@ -52,16 +52,16 @@ namespace Banshee.Collection.Database
                               CoreCache.ItemID = {2} {3})
                     ORDER BY NameSortKey";
         }
-        
+
         public override string FilterColumn {
             get { return "CoreTracks.ArtistID"; }
         }
-        
+
         protected override string ItemToFilterValue (object item)
         {
             return (item is DatabaseArtistInfo) ? (item as DatabaseArtistInfo).DbId.ToString () : null;
         }
-        
+
         public override void UpdateSelectAllItem (long count)
         {
             select_all_item.Name = String.Format (Catalog.GetString ("All Artists ({0})"), count);
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
index 39342ee..f49658f 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
@@ -40,13 +40,13 @@ using Banshee.Collection;
 using Banshee.Database;
 
 namespace Banshee.Collection.Database
-{   
+{
     public abstract class DatabaseFilterListModel<T, U> : FilterListModel<U>, ICacheableDatabaseModel
         where T : U, new () where U : ICacheableItem, new()
     {
         private readonly BansheeModelCache<T> cache;
         private readonly Banshee.Sources.DatabaseSource source;
-        
+
         private long count;
         private string reload_fragment;
 
@@ -55,28 +55,28 @@ namespace Banshee.Collection.Database
             get { return reload_fragment_format; }
             set { reload_fragment_format = value; }
         }
-        
+
         protected readonly U select_all_item;
         private HyenaSqliteConnection connection;
 
-        public DatabaseFilterListModel (string name, string label, Banshee.Sources.DatabaseSource source, 
-                                        DatabaseTrackListModel trackModel, HyenaSqliteConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid) 
+        public DatabaseFilterListModel (string name, string label, Banshee.Sources.DatabaseSource source,
+                                        DatabaseTrackListModel trackModel, HyenaSqliteConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid)
             : base (trackModel)
         {
             this.source = source;
             FilterName = name;
             FilterLabel = label;
             select_all_item = selectAllItem;
-            
+
             this.connection = connection;
             cache = new BansheeModelCache <T> (connection, uuid, this, provider);
             cache.HasSelectAllItem = true;
         }
-        
+
         public override void Clear ()
         {
         }
-        
+
         protected virtual void GenerateReloadFragment ()
         {
             ReloadFragment = String.Format (
@@ -116,16 +116,16 @@ namespace Banshee.Collection.Database
                 }
             }
         }
-        
+
         public virtual bool CachesValues { get { return false; } }
-        
+
         protected abstract string ItemToFilterValue (object o);
 
         // Ick, duplicated from DatabaseTrackListModel
         public override string GetSqlFilter ()
         {
             string filter = null;
-            
+
             // If the only item is the "All" item, then we shouldn't allow any matches, so insert an always-false condition
             if (Count == 1) {
                 return "0=1";
@@ -140,10 +140,10 @@ namespace Banshee.Collection.Database
                     delegate (string new_filter) { filter = new_filter; }
                 );
             }
-            
+
             return filter;
         }
-        
+
         public abstract void UpdateSelectAllItem (long count);
 
         public override void Reload (bool notify)
@@ -160,13 +160,13 @@ namespace Banshee.Collection.Database
 
                 count = cache.Count + 1;
             }
-            
+
             UpdateSelectAllItem (count - 1);
 
             if (notify)
                 OnReloaded ();
         }
-        
+
         public override U this[int index] {
             get {
                 if (index == 0)
@@ -178,7 +178,7 @@ namespace Banshee.Collection.Database
             }
         }
 
-        public override int Count { 
+        public override int Count {
             get { return (int) count; }
         }
 
@@ -201,7 +201,7 @@ namespace Banshee.Collection.Database
                 }
             }
         }
-        
+
         public IEnumerable<object> GetSelectedObjects ()
         {
             foreach (object o in SelectedItems) {
@@ -218,7 +218,7 @@ namespace Banshee.Collection.Database
                 OnReloaded ();
             }
         }
-        
+
         public abstract string FilterColumn { get; }
 
         public virtual string JoinTable { get { return null; } }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportManager.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportManager.cs
index 31162b8..03afd5d 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportManager.cs
@@ -1,4 +1,4 @@
-// 
+//
 // DatabaseImportManager.cs
 //
 // Authors:
@@ -40,6 +40,7 @@ using Banshee.Base;
 using Banshee.Sources;
 using Banshee.Collection;
 using Banshee.Collection.Database;
+using Banshee.Configuration.Schema;
 using Banshee.ServiceStack;
 using Banshee.Streaming;
 
@@ -51,21 +52,22 @@ namespace Banshee.Collection.Database
         // in this list do not mean they are actually supported - this list is just
         // used to see if we should allow the file to be processed by TagLib. The
         // point is to rule out, at the path level, files that we won't support.
-        
+
         public static readonly Banshee.IO.ExtensionSet WhiteListFileExtensions = new Banshee.IO.ExtensionSet (
-            "3g2",  "3gp",  "3gp2", "3gpp", "aac",  "ac3",  "aif",  "aifc", 
-            "aiff", "al",   "alaw", "ape",  "asf",  "asx",  "au",   "avi", 
-            "cda",  "cdr",  "divx", "dv",   "flac", "flv",  "gvi",  "gvp", 
-            "m1v",  "m21",  "m2p",  "m2v",  "m4a",  "m4b",  "m4e",  "m4p",  
+            "3g2",  "3gp",  "3gp2", "3gpp", "aac",  "ac3",  "aif",  "aifc",
+            "aiff", "al",   "alaw", "ape",  "asf",  "asx",  "au",   "avi",
+            "cda",  "cdr",  "divx", "dv",   "flac", "flv",  "gvi",  "gvp",
+            "m1v",  "m21",  "m2p",  "m2v",  "m4a",  "m4b",  "m4e",  "m4p",
             "m4u",  "m4v",  "mp+",  "mid",  "midi", "mjp",  "mkv",  "moov",
             "mov",  "movie","mp1",  "mp2",  "mp21", "mp3",  "mp4",  "mpa",
-            "mpc",  "mpe",  "mpeg", "mpg",  "mpga", "mpp",  "mpu",  "mpv",  
+            "mpc",  "mpe",  "mpeg", "mpg",  "mpga", "mpp",  "mpu",  "mpv",
             "mpv2", "oga",  "ogg",  "ogv",  "ogm",  "omf",  "qt",   "ra",
-            "ram",  "raw",  "rm",   "rmvb", "rts",  "smil", "swf",  "tivo", 
-            "u",    "vfw",  "vob",  "wav",  "wave", "wax",  "wm",   "wma",  
-            "wmd",  "wmv",  "wmx",  "wv",   "wvc",  "wvx",  "yuv",  "f4v",  
+            "ram",  "raw",  "rm",   "rmvb", "rts",  "smil", "swf",  "tivo",
+            "u",    "vfw",  "vob",  "wav",  "wave", "wax",  "wm",   "wma",
+            "wmd",  "wmv",  "wmx",  "wv",   "wvc",  "wvx",  "yuv",  "f4v",
             "f4a",  "f4b",  "669",  "it",   "med",  "mod",  "mol",  "mtm",
-            "nst",  "s3m",  "stm",  "ult",  "wow",  "xm",   "xnm",  "spx"
+            "nst",  "s3m",  "stm",  "ult",  "wow",  "xm",   "xnm",  "spx",
+            "ts"
         );
 
         public static bool IsWhiteListedFile (string path)
@@ -81,15 +83,15 @@ namespace Banshee.Collection.Database
         private int [] primary_source_ids;
         private string base_directory;
         private bool force_copy;
-        
+
         public event DatabaseImportResultHandler ImportResult;
-    
+
         public DatabaseImportManager (PrimarySource psource) :
             this (psource.ErrorSource, delegate { return psource; }, new int [] {psource.DbId}, psource.BaseDirectory)
         {
         }
 
-        public DatabaseImportManager (ErrorSource error_source, TrackPrimarySourceChooser chooser, 
+        public DatabaseImportManager (ErrorSource error_source, TrackPrimarySourceChooser chooser,
             int [] primarySourceIds, string baseDirectory) : this (chooser)
         {
             this.error_source = error_source;
@@ -116,7 +118,7 @@ namespace Banshee.Collection.Database
             get { return base_directory; }
             set { base_directory = value; }
         }
-        
+
         protected virtual bool ForceCopy {
             get { return force_copy; }
             set { force_copy = value; }
@@ -127,12 +129,12 @@ namespace Banshee.Collection.Database
             try {
                 DatabaseTrackInfo track = ImportTrack (path);
                 if (track != null && track.TrackId > 0) {
-                    UpdateProgress (String.Format ("{0} - {1}", 
+                    UpdateProgress (String.Format ("{0} - {1}",
                         track.DisplayArtistName, track.DisplayTrackTitle));
                 } else {
                     UpdateProgress (null);
                 }
-                
+
                 OnImportResult (track, path, null);
             } catch (Exception e) {
                 LogError (path, e);
@@ -140,7 +142,7 @@ namespace Banshee.Collection.Database
                 OnImportResult (null, path, e);
             }
         }
-        
+
         protected virtual void OnImportResult (DatabaseTrackInfo track, string path, Exception error)
         {
             DatabaseImportResultHandler handler = ImportResult;
@@ -148,7 +150,7 @@ namespace Banshee.Collection.Database
                 handler (this, new DatabaseImportResultArgs (track, path, error));
             }
         }
-        
+
         public DatabaseTrackInfo ImportTrack (string path)
         {
             return ImportTrack (new SafeUri (path));
@@ -174,8 +176,8 @@ namespace Banshee.Collection.Database
             try {
                 track = new DatabaseTrackInfo ();
                 track.Uri = uri;
-                StreamTagger.TrackInfoMerge (track, StreamTagger.ProcessUri (uri));
-                
+                StreamTagger.TrackInfoMerge (track, StreamTagger.ProcessUri (uri), false, true);
+
                 track.PrimarySource = trackPrimarySourceChooser (track);
 
                 bool save_track = true;
@@ -194,7 +196,7 @@ namespace Banshee.Collection.Database
             }
 
             counts[track.PrimarySourceId] = counts.ContainsKey (track.PrimarySourceId) ? counts[track.PrimarySourceId] + 1 : 1;
-            
+
             // Reload every 20% or every 250 tracks, whatever is more (eg at most reload 5 times during an import)
             if (counts[track.PrimarySourceId] >= Math.Max (TotalCount/5, 250)) {
                 counts[track.PrimarySourceId] = 0;
@@ -218,7 +220,7 @@ namespace Banshee.Collection.Database
             ErrorSource.AddMessage (path, msg);
             Log.Error (path, msg, false);
         }
-        
+
         public void NotifyAllSources ()
         {
             foreach (int primary_source_id in counts.Keys) {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportResultHandler.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportResultHandler.cs
index 740ea1c..c3d0a1f 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportResultHandler.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseImportResultHandler.cs
@@ -44,11 +44,11 @@ namespace Banshee.Collection.Database
             this.path = path;
             this.error = error;
         }
-                
+
         public string Path {
             get { return path; }
         }
-        
+
         public DatabaseTrackInfo Track {
             get { return track; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
index b9ee544..d1b62a1 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
@@ -43,21 +43,21 @@ namespace Banshee.Collection.Database
         private QueryField field;
         private string select_all_fmt;
 
-        public DatabaseQueryFilterModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, 
+        public DatabaseQueryFilterModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel,
             HyenaSqliteConnection connection, string select_all_fmt, string uuid, QueryField field, string filter_column)
             : base (field.Name, field.Label, source, trackModel, connection, QueryFilterInfo<T>.CreateProvider (filter_column, field), new QueryFilterInfo<T> (), String.Format ("{0}-{1}", uuid, field.Name))
         {
             this.field = field;
             this.select_all_fmt = select_all_fmt;
-            
+
             ReloadFragmentFormat = @"
                 FROM CoreTracks, CoreCache{0}
                     WHERE CoreCache.ModelID = {1} AND CoreCache.ItemID = {2} {3}
                     ORDER BY Value";
         }
-        
+
         public override bool CachesValues { get { return true; } }
-        
+
         public override string GetSqlFilter ()
         {
             if (Selection.AllSelected)
@@ -87,7 +87,7 @@ namespace Banshee.Collection.Database
                         //sql = field.ToSql (NullQueryValue.IsNullOrEmpty, NullQueryValue.Instance, true);
                         sql = field.ToSql (NullQueryValue.IsNullOrEmpty, NullQueryValue.Instance);
                     }
-                    
+
                     if (sql != null) {
                         if (first) {
                             first = false;
@@ -101,25 +101,25 @@ namespace Banshee.Collection.Database
             sb.Append (")");
             return first ? null : sb.ToString ();
         }
-        
+
         protected override string ItemToFilterValue (object o)
         {
             throw new NotImplementedException ();
         }
-        
+
         public override string FilterColumn {
             get { return String.Empty; }
         }
-        
+
         public override void UpdateSelectAllItem (long count)
         {
             select_all_item.Title = String.Format (select_all_fmt, count);
         }
     }
-    
+
     /*public class DatabaseNumericQueryFilterModel<T> : DatabaseQueryFilterModel<T>
     {
-        public DatabaseNumericQueryFilterModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, 
+        public DatabaseNumericQueryFilterModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel,
             BansheeDbConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid, QueryField field)
             : base (source, trackModel
     }*/
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
index 57abea6..a96c644 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
@@ -39,6 +39,8 @@ using Hyena.Query;
 using Banshee.Base;
 using Banshee.Configuration.Schema;
 using Banshee.Database;
+using Banshee.Metadata;
+using Banshee.Preferences;
 using Banshee.Query;
 using Banshee.Sources;
 using Banshee.ServiceStack;
@@ -62,7 +64,7 @@ namespace Banshee.Collection.Database
         }
 
         private bool artist_changed = false, album_changed = false;
-        
+
         public DatabaseTrackInfo () : base ()
         {
         }
@@ -72,11 +74,38 @@ namespace Banshee.Collection.Database
             Provider.Copy (original, this);
         }
 
+        // Changing these fields shouldn't change DateUpdated (which triggers file save)
+        private static readonly HashSet<QueryField> transient_fields;
+
+        static DatabaseTrackInfo ()
+        {
+            transient_fields = new HashSet<QueryField> () {
+                BansheeQuery.ScoreField,
+                BansheeQuery.SkipCountField,
+                BansheeQuery.LastSkippedField,
+                BansheeQuery.LastPlayedField,
+                BansheeQuery.PlaybackErrorField,
+                BansheeQuery.PlayCountField,
+                BansheeQuery.RatingField
+            };
+            Action<Root> handler = delegate {
+                if (SaveTrackMetadataService.WriteRatingsAndPlayCountsEnabled.Value) {
+                    transient_fields.Remove (BansheeQuery.PlayCountField);
+                    transient_fields.Remove (BansheeQuery.RatingField);
+                } else {
+                    transient_fields.Add (BansheeQuery.PlayCountField);
+                    transient_fields.Add (BansheeQuery.RatingField);
+                }
+            };
+            SaveTrackMetadataService.WriteRatingsAndPlayCountsEnabled.ValueChanged += handler;
+            handler (null);
+        }
+
         public override void OnPlaybackFinished (double percentCompleted)
         {
             if (ProviderRefresh()) {
                 base.OnPlaybackFinished (percentCompleted);
-                Save (true, BansheeQuery.ScoreField, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField, 
+                Save (true, BansheeQuery.ScoreField, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField,
                     BansheeQuery.PlayCountField, BansheeQuery.LastPlayedField);
             }
         }
@@ -86,7 +115,7 @@ namespace Banshee.Collection.Database
             if (PrimarySource != null && PrimarySource.TrackEqualHandler != null) {
                 return PrimarySource.TrackEqualHandler (this, track);
             }
-            
+
             DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
             if (db_track == null) {
                 return base.TrackEqual (track);
@@ -107,7 +136,7 @@ namespace Banshee.Collection.Database
         {
             return a != null && b != null && a.TrackId == b.TrackId;
         }
-        
+
         public DatabaseArtistInfo Artist {
             get { return DatabaseArtistInfo.FindOrCreate (ArtistName, ArtistNameSort); }
         }
@@ -127,29 +156,19 @@ namespace Banshee.Collection.Database
             Save (NotifySaved);
         }
 
-        // Changing these fields shouldn't change DateUpdated (which triggers file save)
-        private static HashSet<QueryField> transient_fields = new HashSet<QueryField> {
-            BansheeQuery.ScoreField,
-            BansheeQuery.SkipCountField,
-            BansheeQuery.LastSkippedField,
-            BansheeQuery.PlayCountField,
-            BansheeQuery.LastPlayedField,
-            BansheeQuery.RatingField
-        };
-
         public void Save (bool notify, params QueryField [] fields_changed)
         {
-            // If either the artist or album changed, 
+            // If either the artist or album changed,
             if (ArtistId == 0 || AlbumId == 0 || artist_changed == true || album_changed == true) {
                 DatabaseArtistInfo artist = Artist;
                 ArtistId = artist.DbId;
-           
+
                 DatabaseAlbumInfo album = Album;
                 AlbumId = album.DbId;
-                
+
                 // TODO get rid of unused artists/albums
             }
-            
+
             if (fields_changed.Length == 0 || !transient_fields.IsSupersetOf (fields_changed)) {
                 DateUpdated = DateTime.Now;
             }
@@ -169,7 +188,7 @@ namespace Banshee.Collection.Database
                 }
             }
         }
-        
+
         protected virtual void ProviderSave ()
         {
             Provider.Save (this);
@@ -179,12 +198,12 @@ namespace Banshee.Collection.Database
         {
             ProviderRefresh ();
         }
-        
+
         protected virtual bool ProviderRefresh ()
         {
             return Provider.Refresh (this);
         }
-        
+
         private int track_id;
         [DatabaseColumn ("TrackID", Constraints = DatabaseColumnConstraints.PrimaryKey)]
         public int TrackId {
@@ -210,7 +229,7 @@ namespace Banshee.Collection.Database
             get { return artist_id; }
             set { artist_id = value; }
         }
-        
+
         private int album_id;
         [DatabaseColumn ("AlbumID")]
         public int AlbumId {
@@ -307,7 +326,7 @@ namespace Banshee.Collection.Database
                 album_changed = true;
             }
         }
-        
+
         [VirtualDatabaseColumn ("ArtistNameSort", "CoreAlbums", "AlbumID", "AlbumID")]
         protected string AlbumArtistSortField {
             get { return AlbumArtistSort; }
@@ -325,7 +344,7 @@ namespace Banshee.Collection.Database
                 album_changed = true;
             }
         }
-        
+
         [VirtualDatabaseColumn ("IsCompilation", "CoreAlbums", "AlbumID", "AlbumID")]
         protected bool IsCompilationField {
             get { return IsCompilation; }
@@ -339,28 +358,28 @@ namespace Banshee.Collection.Database
                 album_changed = true;
             }
         }
-        
+
         private static string CleanseString (string input, string old_val)
         {
             if (input == old_val)
                 return null;
-                    
+
             if (input != null)
                 input = input.Trim ();
-            
+
             if (input == old_val)
                 return null;
-            
+
             return input;
         }
-        
+
         private int tag_set_id;
         [DatabaseColumn]
         public int TagSetID {
             get { return tag_set_id; }
             set { tag_set_id = value; }
         }
-        
+
         [DatabaseColumn ("MusicBrainzID")]
         public override string MusicBrainzId {
             get { return base.MusicBrainzId; }
@@ -369,16 +388,16 @@ namespace Banshee.Collection.Database
 
         [DatabaseColumn ("Uri")]
         protected string UriField {
-            get { return Uri.AbsoluteUri; }
-            set { Uri = new SafeUri (value); }
+            get { return Uri == null ? null : Uri.AbsoluteUri; }
+            set { Uri = value == null ? null : new SafeUri (value); }
         }
-        
+
         [DatabaseColumn]
         public override string MimeType {
             get { return base.MimeType; }
             set { base.MimeType = value; }
         }
-        
+
         [DatabaseColumn]
         public override long FileSize {
             get { return base.FileSize; }
@@ -396,30 +415,30 @@ namespace Banshee.Collection.Database
             get { return base.LastSyncedStamp; }
             set { base.LastSyncedStamp = value; }
         }
-        
+
         [DatabaseColumn ("Attributes")]
         public override TrackMediaAttributes MediaAttributes {
             get { return base.MediaAttributes; }
             set { base.MediaAttributes = value; }
         }
-        
+
         [DatabaseColumn ("Title")]
         public override string TrackTitle {
             get { return base.TrackTitle; }
             set { base.TrackTitle = value; }
         }
-        
+
         [DatabaseColumn ("TitleSort")]
         public override string TrackTitleSort {
             get { return base.TrackTitleSort; }
             set { base.TrackTitleSort = value; }
         }
-        
+
         [DatabaseColumn("TitleSortKey", Select = false)]
         internal byte[] TrackTitleSortKey {
             get { return Hyena.StringUtil.SortKey (TrackTitleSort ?? DisplayTrackTitle); }
         }
-        
+
         [DatabaseColumn(Select = false)]
         internal string TitleLowered {
             get { return Hyena.StringUtil.SearchKey (DisplayTrackTitle); }
@@ -429,19 +448,19 @@ namespace Banshee.Collection.Database
         public override string MetadataHash {
             get { return base.MetadataHash; }
         }
-        
+
         [DatabaseColumn]
         public override int TrackNumber {
             get { return base.TrackNumber; }
             set { base.TrackNumber = value; }
         }
-        
+
         [DatabaseColumn]
         public override int TrackCount {
             get { return base.TrackCount; }
             set { base.TrackCount = value; }
         }
-        
+
         [DatabaseColumn ("Disc")]
         public override int DiscNumber {
             get { return base.DiscNumber; }
@@ -453,13 +472,13 @@ namespace Banshee.Collection.Database
             get { return base.DiscCount; }
             set { base.DiscCount = value; }
         }
-        
+
         [DatabaseColumn]
         public override TimeSpan Duration {
             get { return base.Duration; }
             set { base.Duration = value; }
         }
-        
+
         [DatabaseColumn]
         public override int Year {
             get { return base.Year; }
@@ -507,7 +526,7 @@ namespace Banshee.Collection.Database
             get { return base.Comment; }
             set { base.Comment = value; }
         }
-        
+
         [DatabaseColumn("BPM")]
         public override int Bpm {
             get { return base.Bpm; }
@@ -519,7 +538,7 @@ namespace Banshee.Collection.Database
             get { return base.BitRate; }
             set { base.BitRate = value; }
         }
-        
+
         [DatabaseColumn("Rating")]
         protected int rating;
         public override int Rating {
@@ -542,19 +561,19 @@ namespace Banshee.Collection.Database
                 }
             }
         }
-        
+
         [DatabaseColumn]
         public override int PlayCount {
             get { return base.PlayCount; }
             set { base.PlayCount = value; }
         }
-        
+
         [DatabaseColumn]
         public override int SkipCount {
             get { return base.SkipCount; }
             set { base.SkipCount = value; }
         }
-        
+
         private long external_id;
         [DatabaseColumn ("ExternalID")]
         public long ExternalId {
@@ -571,7 +590,7 @@ namespace Banshee.Collection.Database
                 return external_object;
             }
         }
-        
+
         [DatabaseColumn ("LastPlayedStamp")]
         public override DateTime LastPlayed {
             get { return base.LastPlayed; }
@@ -583,7 +602,7 @@ namespace Banshee.Collection.Database
             get { return base.LastSkipped; }
             set { base.LastSkipped = value; }
         }
-        
+
         [DatabaseColumn ("DateAddedStamp")]
         public override DateTime DateAdded {
             get { return base.DateAdded; }
@@ -596,7 +615,7 @@ namespace Banshee.Collection.Database
             get { return date_updated; }
             set { date_updated = value; }
         }
-        
+
         [DatabaseColumn ("LastStreamError")]
         protected StreamPlaybackError playback_error;
         public override StreamPlaybackError PlaybackError {
@@ -605,8 +624,8 @@ namespace Banshee.Collection.Database
                 if (playback_error == value) {
                     return;
                 }
-                
-                playback_error = value; 
+
+                playback_error = value;
             }
         }
 
@@ -619,7 +638,7 @@ namespace Banshee.Collection.Database
                 // Get out quick, no URI set yet.
                 return copy_success;
             }
-            
+
             bool in_library = old_uri.AbsolutePath.StartsWith (PrimarySource.BaseDirectoryWithSeparator);
 
             if (!in_library && (LibrarySchema.CopyOnImport.Get () || force_copy)) {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
index 384edaf..6ce2013 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
@@ -46,25 +46,25 @@ using Banshee.Database;
 using Banshee.PlaybackController;
 
 namespace Banshee.Collection.Database
-{       
-    public class DatabaseTrackListModel : TrackListModel, IExportableModel, 
+{
+    public class DatabaseTrackListModel : TrackListModel, IExportableModel,
         ICacheableDatabaseModel, IFilterable, ISortable, ICareAboutView
     {
         private readonly BansheeDbConnection connection;
         private IDatabaseTrackModelProvider provider;
         protected IDatabaseTrackModelCache cache;
         private Banshee.Sources.DatabaseSource source;
-        
+
         private long count;
 
         private long filtered_count;
         private TimeSpan filtered_duration;
         private long filtered_filesize, filesize;
-        
+
         private ISortableColumn sort_column;
         private string sort_query;
         private bool forced_sort_query;
-        
+
         private string reload_fragment;
         private string join_table, join_fragment, join_primary_key, join_column, condition, condition_from;
 
@@ -72,14 +72,14 @@ namespace Banshee.Collection.Database
         private string user_query;
 
         private int rows_in_view;
-        
+
         public DatabaseTrackListModel (BansheeDbConnection connection, IDatabaseTrackModelProvider provider, Banshee.Sources.DatabaseSource source)
         {
             this.connection = connection;
             this.provider = provider;
             this.source = source;
         }
-        
+
         protected HyenaSqliteConnection Connection {
             get { return connection; }
         }
@@ -95,7 +95,7 @@ namespace Banshee.Collection.Database
             cache.AggregatesUpdated += HandleCacheAggregatesUpdated;
             GenerateSortQueryPart ();
         }
-        
+
         private bool have_new_user_query = true;
         private void GenerateUserQueryFragment ()
         {
@@ -132,7 +132,7 @@ namespace Banshee.Collection.Database
         {
             SortQuery = (SortColumn == null || SortColumn.SortType == SortType.None)
                 ? (SortColumn != null && source is Banshee.Playlist.PlaylistSource)
-                    ? "CorePlaylistEntries.ViewOrder ASC, CorePlaylistEntries.EntryID ASC" 
+                    ? "CorePlaylistEntries.ViewOrder ASC, CorePlaylistEntries.EntryID ASC"
                     : BansheeQuery.GetSort ("Artist", true)
                 : BansheeQuery.GetSort (SortColumn.SortKey, SortColumn.SortType == SortType.Ascending);
         }
@@ -164,7 +164,7 @@ namespace Banshee.Collection.Database
             filtered_duration = TimeSpan.FromMilliseconds (reader.IsDBNull (1) ? 0 : Convert.ToInt64 (reader[1]));
             filtered_filesize = reader.IsDBNull (2) ? 0 : Convert.ToInt64 (reader[2]);
         }
-        
+
         public override void Clear ()
         {
             cache.Clear ();
@@ -214,7 +214,7 @@ namespace Banshee.Collection.Database
             HyenaSqliteCommand count_command = new HyenaSqliteCommand (String.Format (
                 "SELECT COUNT(*), SUM(CoreTracks.FileSize) {0}", UnfilteredQuery
             ));
-            
+
             using (HyenaDataReader reader = new HyenaDataReader (connection.Query (count_command))) {
                 count = reader.Get<long> (0);
                 filesize = reader.Get<long> (1);
@@ -258,12 +258,12 @@ namespace Banshee.Collection.Database
                     foreach (IFilterListModel model in reload_models) {
                         model.Reload (false);
                     }
-                    
+
                     bool have_filters = false;
                     foreach (IFilterListModel filter in source.CurrentFilters) {
                         have_filters |= !filter.Selection.AllSelected;
                     }
-                    
+
                     // Unless both artist/album selections are "all" (eg unfiltered), reload
                     // the track model again with the artist/album filters now in place.
                     if (have_filters) {
@@ -294,7 +294,7 @@ namespace Banshee.Collection.Database
         {
             StringBuilder qb = new StringBuilder ();
             qb.Append (UnfilteredQuery);
-            
+
             if (with_filters) {
                 foreach (IFilterListModel filter in source.CurrentFilters) {
                     string filter_sql = filter.GetSqlFilter ();
@@ -304,17 +304,17 @@ namespace Banshee.Collection.Database
                     }
                 }
             }
-            
+
             if (query_fragment != null) {
                 qb.Append (" AND ");
                 qb.Append (query_fragment);
             }
-            
+
             if (sort_query != null) {
                 qb.Append (" ORDER BY ");
                 qb.Append (sort_query);
             }
-            
+
             reload_fragment = qb.ToString ();
             cache.Reload ();
         }
@@ -338,65 +338,19 @@ namespace Banshee.Collection.Database
             }
         }
 
-#region Get random methods
-
-        private static RandomBy [] randoms = new RandomBy [] {
-            new RandomByTrack (), new RandomByArtist (), new RandomByAlbum (), new RandomByRating (), new RandomByScore()
-        };
-
-        private DateTime random_began_at = DateTime.MinValue;
-        private DateTime last_random = DateTime.MinValue;
-
-        public override TrackInfo GetRandom (DateTime notPlayedSince, PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
+        public override TrackInfo GetRandom (DateTime notPlayedSince)
         {
-            lock (this) {
-                if (Count == 0) {
-                    return null;
-                }
-
-                if (random_began_at < notPlayedSince) {
-                    random_began_at = last_random = notPlayedSince;
-                }
-
-                TrackInfo track = GetRandomTrack (mode, repeat, lastWasSkipped);
-                if (track == null && (repeat || mode != PlaybackShuffleMode.Linear)) {
-                    random_began_at = (random_began_at == last_random) ? DateTime.Now : last_random;
-                    track = GetRandomTrack (mode, repeat, true);
-                }
-
-                last_random = DateTime.Now;
-                return track;
-            }
+            return GetRandom (notPlayedSince, PlaybackShuffleMode.Song, true, false, Shuffler.Playback);
         }
 
-        private TrackInfo GetRandomTrack (PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
+        public TrackInfo GetRandom (DateTime notPlayedSince, PlaybackShuffleMode mode, bool repeat, bool resetSinceTime, Shuffler shuffler)
         {
-            foreach (var r in randoms) {
-                r.SetModelAndCache (this, cache);
-                if (lastWasSkipped || r.Mode != mode) {
-                    r.Reset ();
-                }
-            }
-            
-            var random = randoms.First (r => r.Mode == mode);
-            if (random != null) {
-                if (!random.IsReady) {
-                    if (!random.Next (random_began_at) && repeat) {
-                        random_began_at = last_random;
-                        random.Next (random_began_at);
-                    }
-                }
-
-                if (random.IsReady) {
-                    return random.GetTrack (random_began_at);
-                }
+            lock (this) {
+                shuffler.SetModelAndCache (this, cache);
+                return shuffler.GetRandom (notPlayedSince, mode, repeat, resetSinceTime);
             }
-
-            return null;
         }
 
-#endregion
-
         public override TrackInfo this[int index] {
             get {
                 lock (this) {
@@ -416,11 +370,11 @@ namespace Banshee.Collection.Database
         public long FileSize {
             get { return filtered_filesize; }
         }
-        
+
         public long UnfilteredFileSize {
             get { return filesize; }
         }
-        
+
         public int UnfilteredCount {
             get { return (int) count; }
             set { count = value; }
@@ -428,17 +382,17 @@ namespace Banshee.Collection.Database
 
         public string UserQuery {
             get { return user_query; }
-            set { 
+            set {
                 lock (this) {
-                    user_query = value; 
+                    user_query = value;
                     have_new_user_query = true;
                 }
             }
         }
-        
+
         public string ForcedSortQuery {
             get { return forced_sort_query ? sort_query : null; }
-            set { 
+            set {
                 forced_sort_query = value != null;
                 sort_query = value;
                 if (cache != null) {
@@ -473,7 +427,7 @@ namespace Banshee.Collection.Database
         {
             AddCondition (null, part);
         }
-        
+
         public void AddCondition (string tables, string part)
         {
             if (!String.IsNullOrEmpty (part)) {
@@ -484,7 +438,7 @@ namespace Banshee.Collection.Database
                 }
             }
         }
-        
+
         public string Condition {
             get { return condition; }
         }
@@ -524,20 +478,20 @@ namespace Banshee.Collection.Database
             get { return (int) cache.CacheId; }
         }
 
-        public ISortableColumn SortColumn { 
+        public ISortableColumn SortColumn {
             get { return sort_column; }
         }
-                
+
         public virtual int RowsInView {
             protected get { return rows_in_view; }
             set { rows_in_view = value; }
         }
 
-        int IExportableModel.GetLength () 
+        int IExportableModel.GetLength ()
         {
             return Count;
         }
-        
+
         IDictionary<string, object> IExportableModel.GetMetadata (int index)
         {
             return this[index].GenerateExportable ();
@@ -579,7 +533,7 @@ namespace Banshee.Collection.Database
         public string ReloadFragment {
             get { return reload_fragment; }
         }
-        
+
         public bool CachesValues { get { return false; } }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/FilterModelProvider.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/FilterModelProvider.cs
index ea8c83f..d663433 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/FilterModelProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/FilterModelProvider.cs
@@ -36,23 +36,23 @@ namespace Banshee.Collection.Database
     public class FilterModelProvider<T> : SqliteModelProvider<T> where T : new()
     {
         private string table_name;
-        
+
         public FilterModelProvider (HyenaSqliteConnection conn, string table_name, string pk_column, PropertyInfo pk_info, string value_column, PropertyInfo value_info) : base (conn)
         {
             this.table_name = table_name;
             PrimaryKey = pk_column;
-            
+
             DatabaseColumnAttribute pk_attr = new DatabaseColumnAttribute ();
             pk_attr.Constraints = DatabaseColumnConstraints.PrimaryKey;
             AddColumn (new DatabaseColumn (pk_info, pk_attr), true);
 
             AddColumn (new DatabaseColumn (value_info, new DatabaseColumnAttribute ()), true);
-            
+
             select = String.Format ("{0} as Value", value_column);
         }
-        
+
         public override string TableName { get { return table_name; } }
-        
+
         private string select;
         public override string Select {
             get { return select; }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/QueryFilterInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/QueryFilterInfo.cs
index eeb2f60..7cac73d 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/QueryFilterInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/QueryFilterInfo.cs
@@ -46,10 +46,10 @@ namespace Banshee.Collection.Database
                 "TrackID", typeof(QueryFilterInfo<T>).GetMember ("DbId")[0] as PropertyInfo,
                 filter_column, typeof(QueryFilterInfo<T>).GetMember ("Value")[0] as PropertyInfo
             );
-                
+
             return provider;
         }
-        
+
         private long dbid;
         public long DbId {
             get { return dbid; }
@@ -61,15 +61,15 @@ namespace Banshee.Collection.Database
             get { return obj; }
             set { obj = value; }
         }
-        
+
         private string title;
         public string Title {
             get { return title ?? ToString (); }
             set { title = value; }
         }
-        
+
         public object ValueObject { get { return Value; } }
-        
+
         public override string ToString ()
         {
             return Value == null ? String.Empty : Value.ToString ();
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBy.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBy.cs
index 6add717..ae01174 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBy.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBy.cs
@@ -44,12 +44,43 @@ namespace Banshee.Collection.Database
         protected DatabaseTrackListModel Model { get; private set; }
         protected IDatabaseTrackModelCache Cache { get; private set; }
 
+        private HyenaSqliteCommand insert_shuffle;
+
+        protected Shuffler Shuffler { get; private set; }
+
         public virtual bool IsReady { get { return true; } }
         public PlaybackShuffleMode Mode { get; private set; }
 
-        public RandomBy (PlaybackShuffleMode mode)
+        protected string Condition { get; set; }
+        protected string OrderBy { get; set; }
+
+        public RandomBy (PlaybackShuffleMode mode, Shuffler shuffler)
         {
+            Shuffler = shuffler;
             Mode = mode;
+            insert_shuffle = new HyenaSqliteCommand ("INSERT OR REPLACE INTO CoreShuffles (ShufflerID, TrackID, LastShuffledAt) VALUES (?, ?, ?)");
+        }
+
+        private HyenaSqliteCommand shuffler_query;
+        protected HyenaSqliteCommand ShufflerQuery {
+            get {
+                if (shuffler_query == null) {
+                    var provider = DatabaseTrackInfo.Provider;
+                    shuffler_query = new HyenaSqliteCommand (String.Format (@"
+                        SELECT {0}
+                            FROM {1} LEFT OUTER JOIN CoreShuffles ON (CoreShuffles.ShufflerId = {2} AND CoreShuffles.TrackID = CoreTracks.TrackID)
+                            WHERE {3} {4} AND {5} AND
+                                LastStreamError = 0 AND (CoreShuffles.LastShuffledAt < ? OR CoreShuffles.LastShuffledAt IS NULL)
+                            ORDER BY {6}",
+                        provider.Select,
+                        Model.FromFragment, Shuffler.DbId,
+                        String.IsNullOrEmpty (provider.Where) ? "1=1" : provider.Where, Model.ConditionFragment ?? "1=1", Condition,
+                        OrderBy
+                    ));
+                }
+
+                return shuffler_query;
+            }
         }
 
         public void SetModelAndCache (DatabaseTrackListModel model, IDatabaseTrackModelCache cache)
@@ -61,6 +92,8 @@ namespace Banshee.Collection.Database
 
                 OnModelAndCacheUpdated ();
             }
+
+            shuffler_query = null;
         }
 
         protected virtual void OnModelAndCacheUpdated ()
@@ -68,7 +101,37 @@ namespace Banshee.Collection.Database
         }
 
         public virtual void Reset () {}
+
         public abstract bool Next (DateTime after);
-        public abstract TrackInfo GetTrack (DateTime after);
+
+        public TrackInfo GetTrack (DateTime after)
+        {
+            if (Shuffler == Shuffler.Playback) {
+                return GetPlaybackTrack (after);
+            } else {
+                var track = GetShufflerTrack (after);
+
+                // Record this shuffle
+                if (track != null) {
+                    ServiceManager.DbConnection.Execute (insert_shuffle, Shuffler.DbId, track.TrackId, DateTime.Now);
+                }
+
+                return track;
+            }
+        }
+
+        public abstract TrackInfo GetPlaybackTrack (DateTime after);
+        public abstract DatabaseTrackInfo GetShufflerTrack (DateTime after);
+
+        protected DatabaseTrackInfo GetTrack (HyenaSqliteCommand cmd, params object [] args)
+        {
+            using (var reader = ServiceManager.DbConnection.Query (cmd, args)) {
+                if (reader.Read ()) {
+                    return DatabaseTrackInfo.Provider.Load (reader);
+                }
+            }
+
+            return null;
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs
index 1b3cd60..185fde8 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByAlbum.cs
@@ -39,12 +39,15 @@ namespace Banshee.Collection.Database
 {
     public class RandomByAlbum : RandomBy
     {
-        private static string track_condition = String.Format ("AND CoreTracks.AlbumID = ? {0} ORDER BY Disc ASC, TrackNumber ASC", RANDOM_CONDITION);
+        private static string last_played_condition = String.Format ("AND CoreTracks.AlbumID = ? {0} ORDER BY Disc ASC, TrackNumber ASC", RANDOM_CONDITION);
+
         private HyenaSqliteCommand album_query;
         private int? album_id;
 
-        public RandomByAlbum () : base (PlaybackShuffleMode.Album)
+        public RandomByAlbum (Shuffler shuffler) : base (PlaybackShuffleMode.Album, shuffler)
         {
+            Condition = "CoreTracks.AlbumID = ?";
+            OrderBy = "Disc ASC, TrackNumber ASC";
         }
 
         protected override void OnModelAndCacheUpdated ()
@@ -72,9 +75,17 @@ namespace Banshee.Collection.Database
             return IsReady;
         }
 
-        public override TrackInfo GetTrack (DateTime after)
+        public override TrackInfo GetPlaybackTrack (DateTime after)
         {
-            return album_id == null ? null : Cache.GetSingle (track_condition, (int)album_id, after, after);
+            return album_id == null ? null : Cache.GetSingle (last_played_condition, (int)album_id, after, after);
+        }
+
+        public override DatabaseTrackInfo GetShufflerTrack (DateTime after)
+        {
+            if (album_id == null)
+                return null;
+
+            return GetTrack (ShufflerQuery, (int)album_id, after);
         }
 
         private HyenaSqliteCommand AlbumQuery {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByArtist.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByArtist.cs
index 3fcb11e..ed20f36 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByArtist.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByArtist.cs
@@ -43,8 +43,10 @@ namespace Banshee.Collection.Database
         private HyenaSqliteCommand query;
         private int? id;
 
-        public RandomByArtist () : base (PlaybackShuffleMode.Artist)
+        public RandomByArtist (Shuffler shuffler) : base (PlaybackShuffleMode.Artist, shuffler)
         {
+            Condition = "CoreAlbums.ArtistID = ?";
+            OrderBy = "CoreTracks.Year, CoreTracks.AlbumID ASC, Disc ASC, TrackNumber ASC";
         }
 
         protected override void OnModelAndCacheUpdated ()
@@ -72,11 +74,19 @@ namespace Banshee.Collection.Database
             return IsReady;
         }
 
-        public override TrackInfo GetTrack (DateTime after)
+        public override TrackInfo GetPlaybackTrack (DateTime after)
         {
             return id == null ? null : Cache.GetSingle (track_condition, (int)id, after, after);
         }
 
+        public override DatabaseTrackInfo GetShufflerTrack (DateTime after)
+        {
+            if (id == null)
+                return null;
+
+            return GetTrack (ShufflerQuery, (int)id, after);
+        }
+
         private HyenaSqliteCommand Query {
             get {
                 if (query == null) {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs
index 35180c2..2f71260 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByRating.cs
@@ -40,22 +40,34 @@ namespace Banshee.Collection.Database
     {
         private static string track_condition = String.Format ("AND (CoreTracks.Rating = ? OR (? = 3 AND CoreTracks.Rating = 0)) {0} ORDER BY RANDOM()", RANDOM_CONDITION);
 
-        public RandomByRating () : base (PlaybackShuffleMode.Rating)
+        public RandomByRating (Shuffler shuffler) : base (PlaybackShuffleMode.Rating, shuffler)
         {
+            Condition = "(CoreTracks.Rating = ? OR (? = 3 AND CoreTracks.Rating = 0))";
+            OrderBy = "RANDOM()";
         }
 
-        public override TrackInfo GetTrack (DateTime after)
+        public override TrackInfo GetPlaybackTrack (DateTime after)
         {
             var track = !IsReady ? null : Cache.GetSingle (track_condition, slot + 1, slot + 1, after, after);
             Reset ();
             return track;
         }
 
+        public override DatabaseTrackInfo GetShufflerTrack (DateTime after)
+        {
+            if (!IsReady)
+                return null;
+
+            var track = GetTrack (ShufflerQuery, slot + 1, slot + 1, after);
+            Reset ();
+            return track;
+        }
+
         protected override int Slots {
             get { return 5; }
         }
 
-        protected override string QuerySql {
+        protected override string PlaybackSlotQuerySql {
             get {
                 return @"
                     SELECT
@@ -72,5 +84,22 @@ namespace Banshee.Collection.Database
                     GROUP BY Slot";
             }
         }
+
+        protected override string ShufflerSlotQuerySql {
+            get {
+                return @"
+                    SELECT
+                        (CoreTracks.Rating - 1) AS Slot, COUNT(*)
+                    FROM
+                        CoreTracks LEFT OUTER JOIN CoreShuffles ON (CoreShuffles.ShufflerId = " + Shuffler.DbId.ToString () +
+                    @" AND CoreShuffles.TrackID = CoreTracks.TrackID)
+                        {0}
+                    WHERE
+                        CoreTracks.LastStreamError = 0 AND
+                        (CoreShuffles.LastShuffledAt < ? OR CoreShuffles.LastShuffledAt IS NULL)
+                        {3}
+                    GROUP BY Slot";
+            }
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByScore.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByScore.cs
index 81f34de..c997773 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByScore.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByScore.cs
@@ -36,11 +36,13 @@ namespace Banshee.Collection.Database
     {
         private static string track_condition = String.Format ("AND (CoreTracks.Score BETWEEN ? AND ? OR (? = 50 AND CoreTracks.Score = 0)) {0} ORDER BY RANDOM()", RANDOM_CONDITION);
 
-        public RandomByScore () : base (PlaybackShuffleMode.Score)
+        public RandomByScore (Shuffler shuffler) : base (PlaybackShuffleMode.Score, shuffler)
         {
+            Condition = "(CoreTracks.Score BETWEEN ? AND ? OR (? = 50 AND CoreTracks.Score = 0))";
+            OrderBy = "RANDOM()";
         }
 
-        public override TrackInfo GetTrack (DateTime after)
+        public override TrackInfo GetPlaybackTrack (DateTime after)
         {
             int min = slot * 100 / Slots + 1;
             int max = (slot + 1) * 100 / Slots;
@@ -50,11 +52,24 @@ namespace Banshee.Collection.Database
             return track;
         }
 
+        public override DatabaseTrackInfo GetShufflerTrack (DateTime after)
+        {
+            if (!IsReady)
+                return null;
+
+            int min = slot * 100 / Slots + 1;
+            int max = (slot + 1) * 100 / Slots;
+
+            var track = GetTrack (ShufflerQuery, min, max, max, after);
+            Reset ();
+            return track;
+        }
+
         protected override int Slots {
             get { return 20; }
         }
 
-        protected override string QuerySql {
+        protected override string PlaybackSlotQuerySql {
             get {
                 // NOTE: SQLite wrongly assumes that (-1)/5 == 0, the CASE WHEN works around this.
                 return @"
@@ -72,5 +87,23 @@ namespace Banshee.Collection.Database
                     GROUP BY Slot";
             }
         }
+
+        protected override string ShufflerSlotQuerySql {
+            get {
+                // NOTE: SQLite wrongly assumes that (-1)/5 == 0, the CASE WHEN works around this.
+                return @"
+                    SELECT
+                        CASE WHEN IFNULL(CoreTracks.Score, 0) = 0 THEN -1 ELSE (CoreTracks.Score - 1) * 20 / 100 END AS Slot, COUNT(*)
+                    FROM
+                        CoreTracks LEFT OUTER JOIN CoreShuffles ON (CoreShuffles.ShufflerId = " + Shuffler.DbId.ToString () +
+                    @" AND CoreShuffles.TrackID = CoreTracks.TrackID)
+                        {0}
+                    WHERE
+                        CoreTracks.LastStreamError = 0 AND
+                        (CoreShuffles.LastShuffledAt < ? OR CoreShuffles.LastShuffledAt IS NULL)
+                        {3}
+                    GROUP BY Slot";
+            }
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBySlot.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBySlot.cs
index 348a726..2a988de 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBySlot.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomBySlot.cs
@@ -49,7 +49,7 @@ namespace Banshee.Collection.Database
         private HyenaSqliteCommand query;
         protected int slot;
 
-        public RandomBySlot (PlaybackShuffleMode mode) : base (mode)
+        public RandomBySlot (PlaybackShuffleMode mode, Shuffler shuffler) : base (mode, shuffler)
         {
         }
 
@@ -74,7 +74,11 @@ namespace Banshee.Collection.Database
             int default_slot = (Slots - 1) / 2;
 
             // Get the distribution for tracks that haven't been played since stamp.
-            using (var reader = ServiceManager.DbConnection.Query (Query, after, after)) {
+            var reader = Shuffler == Shuffler.Playback
+                ? ServiceManager.DbConnection.Query (SlotQuery, after, after)
+                : ServiceManager.DbConnection.Query (SlotQuery, after);
+
+            using (reader) {
                 while (reader.Read ()) {
                     int s = Convert.ToInt32 (reader[0]);
                     int count = Convert.ToInt32 (reader[1]);
@@ -121,10 +125,10 @@ namespace Banshee.Collection.Database
             return IsReady;
         }
 
-        private HyenaSqliteCommand Query {
+        private HyenaSqliteCommand SlotQuery {
             get {
                 if (query == null) {
-                    query = new HyenaSqliteCommand (String.Format (QuerySql,
+                    query = new HyenaSqliteCommand (String.Format (SlotQuerySql,
                         Model.JoinFragment,
                         Model.CachesJoinTableEntries
                             ? String.Format ("CoreCache.ItemID = {0}.{1} AND", Model.JoinTable, Model.JoinPrimaryKey)
@@ -137,7 +141,15 @@ namespace Banshee.Collection.Database
             }
         }
 
+        private string SlotQuerySql {
+            get {
+                return Shuffler == Shuffler.Playback ? PlaybackSlotQuerySql : ShufflerSlotQuerySql;
+            }
+        }
+
         protected abstract int Slots { get; }
-        protected abstract string QuerySql { get; }
+
+        protected abstract string PlaybackSlotQuerySql { get; }
+        protected abstract string ShufflerSlotQuerySql { get; }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs
index 1b91bf5..18c57dc 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/RandomByTrack.cs
@@ -41,8 +41,10 @@ namespace Banshee.Collection.Database
     {
         private static string track_condition = String.Format ("{0} ORDER BY RANDOM()", RANDOM_CONDITION);
 
-        public RandomByTrack () : base (PlaybackShuffleMode.Song)
+        public RandomByTrack (Shuffler shuffler) : base (PlaybackShuffleMode.Song, shuffler)
         {
+            Condition = "1=1";
+            OrderBy = "RANDOM()";
         }
 
         public override bool Next (DateTime after)
@@ -50,9 +52,14 @@ namespace Banshee.Collection.Database
             return true;
         }
 
-        public override TrackInfo GetTrack (DateTime after)
+        public override TrackInfo GetPlaybackTrack (DateTime after)
         {
             return Cache.GetSingle (track_condition, after, after);
         }
+
+        public override DatabaseTrackInfo GetShufflerTrack (DateTime after)
+        {
+            return GetTrack (ShufflerQuery, after);
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/Shuffler.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/Shuffler.cs
new file mode 100644
index 0000000..b9bfab6
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/Shuffler.cs
@@ -0,0 +1,140 @@
+//
+// Shuffler.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+
+using Hyena;
+using Hyena.Data;
+using Hyena.Data.Sqlite;
+
+using Banshee.ServiceStack;
+using Banshee.PlaybackController;
+
+namespace Banshee.Collection.Database
+{
+    public class Shuffler
+    {
+        public static readonly Shuffler Playback = new Shuffler () { Id = "playback", DbId = 0 };
+
+        private DateTime random_began_at = DateTime.MinValue;
+        private DateTime last_random = DateTime.MinValue;
+        private RandomBy [] randoms;
+        private DatabaseTrackListModel model;
+
+        public string Id { get; private set; }
+        public int DbId { get; private set; }
+
+        private Shuffler ()
+        {
+            randoms = new RandomBy [] {
+                new RandomByTrack (this), new RandomByArtist (this), new RandomByAlbum (this), new RandomByRating (this), new RandomByScore (this)
+            };
+        }
+
+        public Shuffler (string id) : this ()
+        {
+            Id = id;
+            LoadOrCreate ();
+        }
+
+        public void SetModelAndCache (DatabaseTrackListModel model, IDatabaseTrackModelCache cache)
+        {
+            this.model = model;
+
+            foreach (var random in randoms) {
+                random.SetModelAndCache (model, cache);
+            }
+        }
+
+        public TrackInfo GetRandom (DateTime notPlayedSince, PlaybackShuffleMode mode, bool repeat, bool resetSinceTime)
+        {
+            lock (this) {
+                if (this == Playback) {
+                    if (model.Count == 0) {
+                        return null;
+                    }
+                } else {
+                    if (model.UnfilteredCount == 0) {
+                        return null;
+                    }
+                }
+
+                if (random_began_at < notPlayedSince) {
+                    random_began_at = last_random = notPlayedSince;
+                }
+
+                TrackInfo track = GetRandomTrack (mode, repeat, resetSinceTime);
+                if (track == null && (repeat || mode != PlaybackShuffleMode.Linear)) {
+                    random_began_at = (random_began_at == last_random) ? DateTime.Now : last_random;
+                    track = GetRandomTrack (mode, repeat, true);
+                }
+
+                last_random = DateTime.Now;
+                return track;
+            }
+        }
+
+        private TrackInfo GetRandomTrack (PlaybackShuffleMode mode, bool repeat, bool resetSinceTime)
+        {
+            foreach (var r in randoms) {
+                if (resetSinceTime || r.Mode != mode) {
+                    r.Reset ();
+                }
+            }
+
+            var random = randoms.First (r => r.Mode == mode);
+            if (random != null) {
+                if (!random.IsReady) {
+                    if (!random.Next (random_began_at) && repeat) {
+                        random_began_at = last_random;
+                        random.Next (random_began_at);
+                    }
+                }
+
+                if (random.IsReady) {
+                    return random.GetTrack (random_began_at);
+                }
+            }
+
+            return null;
+        }
+
+        private void LoadOrCreate ()
+        {
+            var db = ServiceManager.DbConnection;
+
+            int res = db.Query<int> ("SELECT ShufflerID FROM CoreShufflers WHERE ID = ?", Id);
+            if (res > 0) {
+                DbId = res;
+            } else {
+                DbId = db.Execute ("INSERT INTO CoreShufflers (ID) VALUES (?)", Id);
+            }
+        }
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs
index 563fd7f..f22dbcc 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs
@@ -46,14 +46,14 @@ namespace Banshee.Collection.Database.Tests
             info.TitleSort = title_sort;
             Assert.AreEqual (expected, info.TitleSortKey);
         }
-        
+
         protected void AssertTitleLowered (string title, string expected)
         {
             DatabaseAlbumInfo info = new DatabaseAlbumInfo ();
             info.Title = title;
             Assert.AreEqual (expected, info.TitleLowered);
         }
-        
+
         protected void AssertArtistNameSort (string name, string name_sort, byte[] expected)
         {
             DatabaseAlbumInfo info = new DatabaseAlbumInfo ();
@@ -61,14 +61,14 @@ namespace Banshee.Collection.Database.Tests
             info.ArtistNameSort = name_sort;
             Assert.AreEqual (expected, info.ArtistNameSortKey);
         }
-        
+
         protected void AssertArtistNameLowered (string name, string expected)
         {
             DatabaseAlbumInfo info = new DatabaseAlbumInfo ();
             info.ArtistName = name;
             Assert.AreEqual (expected, info.ArtistNameLowered);
         }
-        
+
         [Test]
         public void TestWithoutTitleSortKey ()
         {
@@ -77,14 +77,14 @@ namespace Banshee.Collection.Database.Tests
             AssertTitleSort ("a", "",   new byte[] {14, 2, 1, 1, 1, 1, 0});
             AssertTitleSort ("A", null, new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestTitleSortKey ()
         {
             AssertTitleSort ("Title", "a", new byte[] {14, 2, 1, 1, 1, 1, 0});
             AssertTitleSort ("Title", "A", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestTitleLowered ()
         {
@@ -92,7 +92,7 @@ namespace Banshee.Collection.Database.Tests
             AssertTitleLowered ("A", "a");
             AssertTitleLowered ("\u0104", "a");
         }
-        
+
         [Test]
         public void TestWithoutArtistNameSortKey ()
         {
@@ -102,14 +102,14 @@ namespace Banshee.Collection.Database.Tests
 
             AssertArtistNameSort ("a", "", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestArtistNameSortKey ()
         {
             AssertArtistNameSort ("Title", "a", new byte[] {14, 2, 1, 1, 1, 1, 0});
             AssertArtistNameSort ("Title", "A", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestArtistNameLowered ()
         {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs
index 9a309eb..165003e 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs
@@ -46,14 +46,14 @@ namespace Banshee.Collection.Database.Tests
             info.NameSort = name_sort;
             Assert.AreEqual (expected, info.NameSortKey);
         }
-        
+
         protected void AssertNameLowered (string name, string expected)
         {
             DatabaseArtistInfo info = new DatabaseArtistInfo ();
             info.Name = name;
             Assert.AreEqual (expected, info.NameLowered);
         }
-        
+
         [Test]
         public void TestWithoutNameSortKey ()
         {
@@ -63,14 +63,14 @@ namespace Banshee.Collection.Database.Tests
 
             AssertNameSort ("a", "", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestNameSortKey ()
         {
             AssertNameSort ("Title", "a", new byte[] {14, 2, 1, 1, 1, 1, 0});
             AssertNameSort ("Title", "A", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestNameLowered ()
         {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs
index 5b6074a..225b89b 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs
@@ -46,14 +46,14 @@ namespace Banshee.Collection.Database.Tests
             info.TrackTitleSort = title_sort;
             Assert.AreEqual (expected, info.TrackTitleSortKey);
         }
-        
+
         protected void AssertTitleLowered (string title, string expected)
         {
             DatabaseTrackInfo info = new DatabaseTrackInfo ();
             info.TrackTitle = title;
             Assert.AreEqual (expected, info.TitleLowered);
         }
-        
+
         [Test]
         public void TestWithoutTitleSortKey ()
         {
@@ -63,14 +63,14 @@ namespace Banshee.Collection.Database.Tests
 
             AssertTitleSort ("a", "", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestTitleSortKey ()
         {
             AssertTitleSort ("Title", "a", new byte[] {14, 2, 1, 1, 1, 1, 0});
             AssertTitleSort ("Title", "A", new byte[] {14, 2, 1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestTitleLowered ()
         {
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexer.cs b/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexer.cs
index c735fcf..6c1e59f 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexer.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexer.cs
@@ -46,62 +46,62 @@ namespace Banshee.Collection.Indexer
     public class CollectionIndexer : ICollectionIndexer, IService, IDBusExportable, IDisposable
     {
         private static int instance_count = 0;
-        
+
         private CollectionIndexerService service;
         private List<CachedList<DatabaseTrackInfo>> model_caches = new List<CachedList<DatabaseTrackInfo>> ();
         private string [] export_fields;
-        
+
         private event ActionHandler indexing_finished;
         event ActionHandler ICollectionIndexer.IndexingFinished {
             add { indexing_finished += value; }
             remove { indexing_finished -= value; }
         }
-        
+
         private event SaveToXmlFinishedHandler save_to_xml_finished;
         event SaveToXmlFinishedHandler ICollectionIndexer.SaveToXmlFinished {
             add { save_to_xml_finished += value; }
             remove { save_to_xml_finished -= value; }
         }
-        
+
         public event EventHandler IndexingFinished;
-        
+
         internal CollectionIndexer (CollectionIndexerService service)
         {
             this.service = service;
         }
-        
+
         public void Dispose ()
         {
             lock (this) {
                 DisposeModels ();
-            
+
                 if (service != null) {
                     service.DisposeIndexer (this);
                 }
             }
         }
-        
+
         private void DisposeModels ()
         {
             foreach (CachedList<DatabaseTrackInfo> model in model_caches) {
                 model.Dispose ();
             }
-            
+
             model_caches.Clear ();
         }
-        
+
         public void SetExportFields (string [] fields)
         {
             lock (this) {
                 export_fields = fields;
             }
         }
-        
+
         public void Index ()
         {
             lock (this) {
                 DisposeModels ();
-                
+
                 foreach (Source source in ServiceManager.SourceManager.Sources) {
                     LibrarySource library = source as LibrarySource;
                     if (library != null && library.Indexable) {
@@ -110,44 +110,44 @@ namespace Banshee.Collection.Indexer
                     }
                 }
             }
-            
+
             OnIndexingFinished ();
         }
-        
+
         void ICollectionIndexer.Index ()
         {
             ThreadPool.QueueUserWorkItem (delegate { Index (); });
         }
-        
+
         public void SaveToXml (string path)
         {
             lock (this) {
                 uint timer_id = Hyena.Log.DebugTimerStart ();
                 bool success = false;
-                
+
                 try {
                     XmlTextWriter writer = new XmlTextWriter (path, System.Text.Encoding.UTF8);
                     writer.Formatting = Formatting.Indented;
                     writer.Indentation = 2;
                     writer.IndentChar = ' ';
-                    
+
                     writer.WriteStartDocument (true);
-                    
+
                     writer.WriteStartElement ("banshee-collection");
                     writer.WriteStartAttribute ("version");
                     writer.WriteString (TrackInfo.ExportVersion);
                     writer.WriteEndAttribute ();
-                   
-                    for (int i = 0; i < model_caches.Count; i++) { 
+
+                    for (int i = 0; i < model_caches.Count; i++) {
                         CachedList<DatabaseTrackInfo> model = model_caches[i];
                         if (model.Count <= 0) {
                             continue;
                         }
-                        
+
                         writer.WriteStartElement ("model");
                         for (int j = 0; j < model.Count; j++) {
                             writer.WriteStartElement ("item");
-                            
+
                             foreach (KeyValuePair<string, object> item in model[j].GenerateExportable (export_fields)) {
                                 string type = "string";
                                 if      (item.Value is Boolean) type = "bool";
@@ -162,7 +162,7 @@ namespace Banshee.Collection.Indexer
                                 else if (item.Value is Char)    type = "char";
                                 else if (item.Value is Double)  type = "double";
                                 else if (item.Value is Single)  type = "float";
-                                
+
                                 writer.WriteStartElement (item.Key);
                                 writer.WriteStartAttribute ("type");
                                 writer.WriteString (type);
@@ -170,89 +170,89 @@ namespace Banshee.Collection.Indexer
                                 writer.WriteString (item.Value.ToString ());
                                 writer.WriteEndElement ();
                             }
-                            
+
                             writer.WriteEndElement ();
                         }
-                        
+
                         writer.WriteEndElement ();
                     }
-                    
+
                     writer.WriteEndElement ();
                     writer.WriteEndDocument ();
                     writer.Close ();
-                    
+
                     success = true;
                 } catch (Exception e) {
                     Log.Exception (e);
                 }
-                
+
                 Hyena.Log.DebugTimerPrint (timer_id, "CollectionIndexer.SaveToXml: {0}");
-                
+
                 SaveToXmlFinishedHandler handler = save_to_xml_finished;
                 if (handler != null) {
                     handler (success, path);
                 }
             }
         }
-        
+
         void ICollectionIndexer.SaveToXml (string path)
-        {   
+        {
             ThreadPool.QueueUserWorkItem (delegate { SaveToXml (path); });
         }
-        
+
         public IDictionary<string, object> GetResult (int modelIndex, int itemIndex)
         {
             lock (this) {
                 if (modelIndex < 0 || modelIndex >= model_caches.Count) {
                     throw new IndexOutOfRangeException ("modelIndex");
                 }
-                
+
                 CachedList<DatabaseTrackInfo> model = model_caches[modelIndex];
-                
+
                 if (itemIndex < 0 || itemIndex >= model.Count) {
                     throw new IndexOutOfRangeException ("itemIndex");
                 }
-                
+
                 return model[itemIndex].GenerateExportable (export_fields);
             }
         }
-        
+
         public int GetModelCounts ()
         {
             lock (this) {
                 return model_caches.Count;
             }
         }
-        
+
         public int GetModelResultsCount (int modelIndex)
         {
             lock (this) {
                 if (modelIndex < 0 || modelIndex >= model_caches.Count) {
                     return -1;
                 }
-                
+
                 return model_caches[modelIndex].Count;
             }
         }
-        
+
         protected virtual void OnIndexingFinished ()
         {
             EventHandler handler = IndexingFinished;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
-        
+
             ActionHandler dbus_handler = indexing_finished;
             if (dbus_handler != null) {
                 dbus_handler ();
             }
         }
-        
+
         private string service_name = String.Format ("CollectionIndexer_{0}", instance_count++);
         string IService.ServiceName {
             get { return service_name; }
         }
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return service; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexerService.cs b/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexerService.cs
index b4b4595..041f743 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexerService.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Indexer/CollectionIndexerService.cs
@@ -47,40 +47,40 @@ namespace Banshee.Collection.Indexer
         private List<LibrarySource> libraries = new List<LibrarySource> ();
         private string [] available_export_fields;
         private int open_indexers;
-        
+
         public event ActionHandler CollectionChanged;
         public event ActionHandler CleanupAndShutdown;
-        
+
         private ActionHandler shutdown_handler;
         public ActionHandler ShutdownHandler {
             get { return shutdown_handler; }
             set { shutdown_handler = value; }
         }
-        
+
         public CollectionIndexerService ()
         {
             DBusConnection.Connect ("CollectionIndexer");
-            
+
             ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             ServiceManager.SourceManager.SourceRemoved += OnSourceRemoved;
-        
+
             foreach (Source source in ServiceManager.SourceManager.Sources) {
                 MonitorLibrary (source as LibrarySource);
             }
         }
-        
+
         public void Dispose ()
         {
             while (libraries.Count > 0) {
                 UnmonitorLibrary (libraries[0]);
             }
         }
-        
+
         void ICollectionIndexerService.Hello ()
         {
             Hyena.Log.DebugFormat ("Hello called on {0}", GetType ());
         }
-        
+
         public void Shutdown ()
         {
             lock (this) {
@@ -89,7 +89,7 @@ namespace Banshee.Collection.Indexer
                 }
             }
         }
-        
+
         public void ForceShutdown ()
         {
             Dispose ();
@@ -97,14 +97,14 @@ namespace Banshee.Collection.Indexer
                 shutdown_handler ();
             }
         }
-        
+
         public ICollectionIndexer CreateIndexer ()
         {
             lock (this) {
                 return new CollectionIndexer (null);
             }
         }
-        
+
         internal void DisposeIndexer (CollectionIndexer indexer)
         {
             lock (this) {
@@ -112,7 +112,7 @@ namespace Banshee.Collection.Indexer
                 open_indexers--;
             }
         }
-        
+
         ObjectPath ICollectionIndexerService.CreateIndexer ()
         {
             lock (this) {
@@ -121,21 +121,21 @@ namespace Banshee.Collection.Indexer
                 return path;
             }
         }
-        
-        
+
+
         public bool HasCollectionCountChanged (int count)
         {
             lock (this) {
                 int total_count = 0;
-                
+
                 foreach (LibrarySource library in libraries) {
                     total_count += library.Count;
                 }
-                
+
                 return count != total_count;
             }
         }
-        
+
         public bool HasCollectionLastModifiedChanged (long time)
         {
             lock (this) {
@@ -146,73 +146,73 @@ namespace Banshee.Collection.Indexer
                         String.Format ("SELECT MAX(CoreTracks.DateUpdatedStamp) {0}",
                             library.DatabaseTrackModel.UnfilteredQuery)));
                 }
-                
+
                 return last_updated > time;
             }
         }
-        
+
         public string [] GetAvailableExportFields ()
         {
             lock (this) {
                 if (available_export_fields != null) {
                     return available_export_fields;
                 }
-                
+
                 List<string> fields = new List<string> ();
-                
+
                 foreach (KeyValuePair<string, System.Reflection.PropertyInfo> field in TrackInfo.GetExportableProperties (
                     typeof (Banshee.Collection.Database.DatabaseTrackInfo))) {
                     fields.Add (field.Key);
                 }
-                
+
                 available_export_fields = fields.ToArray ();
                 return available_export_fields;
             }
         }
-        
+
         private void MonitorLibrary (LibrarySource library)
         {
             if (library == null || !library.Indexable || libraries.Contains (library)) {
                 return;
             }
-            
+
             libraries.Add (library);
-            
+
             library.TracksAdded += OnLibraryChanged;
             library.TracksDeleted += OnLibraryChanged;
             library.TracksChanged += OnLibraryChanged;
         }
-        
+
         private void UnmonitorLibrary (LibrarySource library)
         {
             if (library == null || !libraries.Contains (library)) {
                 return;
             }
-            
+
             library.TracksAdded -= OnLibraryChanged;
             library.TracksDeleted -= OnLibraryChanged;
             library.TracksChanged -= OnLibraryChanged;
-            
+
             libraries.Remove (library);
         }
-        
+
         private void OnSourceAdded (SourceAddedArgs args)
         {
             MonitorLibrary (args.Source as LibrarySource);
         }
-        
+
         private void OnSourceRemoved (SourceEventArgs args)
         {
             UnmonitorLibrary (args.Source as LibrarySource);
         }
-        
+
         private void OnLibraryChanged (object o, TrackEventArgs args)
         {
             if (args.ChangedFields == null) {
                 OnCollectionChanged ();
                 return;
             }
-            
+
             foreach (Hyena.Query.QueryField field in args.ChangedFields) {
                 if (field != Banshee.Query.BansheeQuery.LastPlayedField &&
                     field != Banshee.Query.BansheeQuery.LastSkippedField &&
@@ -223,7 +223,7 @@ namespace Banshee.Collection.Indexer
                 }
             }
         }
-        
+
         public void RequestCleanupAndShutdown ()
         {
             ActionHandler handler = CleanupAndShutdown;
@@ -231,7 +231,7 @@ namespace Banshee.Collection.Indexer
                 handler ();
             }
         }
-        
+
         private void OnCollectionChanged ()
         {
             ActionHandler handler = CollectionChanged;
@@ -239,11 +239,11 @@ namespace Banshee.Collection.Indexer
                 handler ();
             }
         }
-        
-        IDBusExportable IDBusExportable.Parent { 
+
+        IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string IService.ServiceName {
             get { return "CollectionIndexerService"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexer.cs b/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexer.cs
index 684bed0..8fd60c5 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexer.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexer.cs
@@ -33,22 +33,22 @@ using NDesk.DBus;
 namespace Banshee.Collection.Indexer
 {
     public delegate void SaveToXmlFinishedHandler (bool success, string path);
-    
+
     [Interface ("org.bansheeproject.CollectionIndexer.Indexer")]
     public interface ICollectionIndexer
     {
         event ActionHandler IndexingFinished;
         event SaveToXmlFinishedHandler SaveToXmlFinished;
-        
+
         void Index ();
         void Dispose ();
-        
+
         void SetExportFields (string [] fields);
-        
+
         int GetModelCounts ();
         int GetModelResultsCount (int modelIndex);
         IDictionary<string, object> GetResult (int modelIndex, int itemIndex);
-        
+
         void SaveToXml (string path);
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexerService.cs b/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexerService.cs
index 6100762..2cce19a 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexerService.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Indexer/ICollectionIndexerService.cs
@@ -38,7 +38,7 @@ namespace Banshee.Collection.Indexer
     {
         event ActionHandler CollectionChanged;
         event ActionHandler CleanupAndShutdown;
-        
+
         void Hello ();
         void Shutdown ();
         ObjectPath CreateIndexer ();
diff --git a/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs
index bf8061a..e99870a 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs
@@ -41,13 +41,13 @@ namespace Banshee.Collection
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
-        
+
         public AlbumListModel(IDBusExportable parent) : base(parent)
         {
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
-        
+
         public override void Clear ()
         {
         }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/ArtistListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/ArtistListModel.cs
index d946d9f..a226268 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/ArtistListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/ArtistListModel.cs
@@ -40,7 +40,7 @@ namespace Banshee.Collection
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
-        
+
         public ArtistListModel(IDBusExportable parent) : base(parent)
         {
             selection = new SelectAllSelection ();
diff --git a/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs
index 4373105..104b4a5 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs
@@ -48,52 +48,52 @@ namespace Banshee.Collection
         public FilterListModel (DatabaseTrackListModel trackModel) : base ()
         {
             browsing_model = trackModel;
-            
+
             selection = new SelectAllSelection ();
             selection.SelectAll ();
-            
+
             Selection.Changed += HandleSelectionChanged;
         }
-        
+
         public FilterListModel (IDBusExportable parent) : base (parent)
         {
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
-        
+
         public override void Reload ()
         {
             Reload (false);
         }
-        
+
         public abstract void Reload (bool notify);
-        
+
         private void HandleSelectionChanged (object sender, EventArgs args)
         {
             Banshee.Base.ThreadAssist.SpawnFromMain (ReloadBrowsingModel);
-        } 
+        }
 
         private void ReloadBrowsingModel ()
         {
             browsing_model.Reload (this);
         }
-        
+
 #region IFilterModel Implementation
 
         public abstract string GetSqlFilter ();
-        
+
         private string filter_name;
         public string FilterName {
             get { return filter_name; }
             protected set { filter_name = value; }
         }
-        
+
         private string filter_label;
         public string FilterLabel {
             get { return filter_label; }
             protected set { filter_label = value; }
         }
-        
+
         public virtual void InvalidateCache (bool notify)
         {
         }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/ImportEventHandler.cs b/src/Core/Banshee.Services/Banshee.Collection/ImportEventHandler.cs
index 132a5d3..22b49a1 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/ImportEventHandler.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/ImportEventHandler.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ImportEventHandler.cs
 //
 // Author:
@@ -31,21 +31,21 @@ using System;
 namespace Banshee.Collection
 {
     public delegate void ImportEventHandler (object o, ImportEventArgs args);
-    
+
     public class ImportEventArgs : EventArgs
     {
         private string filename;
         private string return_message;
-        
+
         public ImportEventArgs (string filename)
         {
             this.filename = filename;
         }
-        
+
         public string FileName {
             get { return filename; }
         }
-        
+
         public string ReturnMessage {
             get { return return_message; }
             set { return_message = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs b/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs
index d759a5a..a321572 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs
@@ -48,7 +48,7 @@ namespace Banshee.Collection
         private class ImportElement : QueuePipelineElement<string>
         {
             private ImportManager manager;
-            
+
             public ImportElement (ImportManager manager)
             {
                 this.manager = manager;
@@ -59,7 +59,7 @@ namespace Banshee.Collection
                 base.Enqueue (item);
                 manager.UpdateScannerProgress ();
             }
-        
+
             protected override string ProcessItem (string item)
             {
                 try {
@@ -67,50 +67,50 @@ namespace Banshee.Collection
                 } catch (Exception e) {
                     Hyena.Log.Exception (e);
                 }
-                return null;   
+                return null;
             }
         }
-        
+
 #endregion
-        
+
         private static NumberFormatInfo number_format = new NumberFormatInfo ();
-        
+
         private DirectoryScannerPipelineElement scanner_element;
         private ImportElement import_element;
-        
+
         private readonly object user_job_mutex = new object ();
         private UserJob user_job;
         private uint timer_id;
-        
+
         public event ImportEventHandler ImportRequested;
-        
+
         public ImportManager ()
         {
             AddElement (scanner_element = new DirectoryScannerPipelineElement ());
             AddElement (import_element = new ImportElement (this));
         }
-        
+
 #region Public API
-                      
+
         public virtual void Enqueue (UriList uris)
         {
             CreateUserJob ();
-            
+
             foreach (string path in uris.LocalPaths) {
                 base.Enqueue (path);
             }
         }
-        
+
         public override void Enqueue (string source)
         {
             Enqueue (new UriList (source));
         }
-        
+
         public void Enqueue (string [] paths)
         {
             Enqueue (new UriList (paths));
         }
-        
+
         public bool IsImportInProgress {
             get { return import_element.Processing; }
         }
@@ -120,20 +120,20 @@ namespace Banshee.Collection
             get { return keep_user_job_hidden; }
             set { keep_user_job_hidden = value; }
         }
-        
+
 #endregion
-        
+
 #region User Job / Interaction
-        
+
         private void CreateUserJob ()
         {
             lock (user_job_mutex) {
                 if (user_job != null || KeepUserJobHidden) {
                     return;
                 }
-                
+
                 timer_id = Log.DebugTimerStart ();
-                
+
                 user_job = new UserJob (Title, Catalog.GetString ("Scanning for media"));
                 user_job.SetResources (Resource.Cpu, Resource.Disk, Resource.Database);
                 user_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
@@ -147,42 +147,42 @@ namespace Banshee.Collection
                 }
             }
         }
-        
+
         private void DestroyUserJob ()
         {
             lock (user_job_mutex) {
                 if (user_job == null) {
                     return;
                 }
-                
+
                 if (!KeepUserJobHidden) {
                     Log.DebugTimerPrint (timer_id, Title + " duration: {0}");
                 }
-                
+
                 user_job.CancelRequested -= OnCancelRequested;
                 user_job.Finish ();
                 user_job = null;
             }
         }
-        
+
         private void OnCancelRequested (object o, EventArgs args)
         {
             scanner_element.Cancel ();
         }
-        
+
         protected void UpdateProgress (string message)
         {
             CreateUserJob ();
             if (user_job != null) {
                 double new_progress = (double)import_element.ProcessedCount / (double)import_element.TotalCount;
                 double old_progress = user_job.Progress;
-                
+
                 if (new_progress >= 0.0 && new_progress <= 1.0 && Math.Abs (new_progress - old_progress) > 0.001) {
                     lock (number_format) {
-                        string disp_progress = String.Format (ProgressMessage, 
-                            import_element.ProcessedCount, 
+                        string disp_progress = String.Format (ProgressMessage,
+                            import_element.ProcessedCount,
                             import_element.TotalCount);
-                        
+
                         user_job.Title = disp_progress;
                         user_job.Status = String.IsNullOrEmpty (message) ? Catalog.GetString ("Scanning...") : message;
                         user_job.Progress = new_progress;
@@ -190,9 +190,9 @@ namespace Banshee.Collection
                 }
             }
         }
-        
+
         private DateTime last_enqueue_display = DateTime.Now;
-        
+
         private void UpdateScannerProgress ()
         {
             CreateUserJob ();
@@ -200,18 +200,18 @@ namespace Banshee.Collection
                 if (DateTime.Now - last_enqueue_display > TimeSpan.FromMilliseconds (400)) {
                     lock (number_format) {
                         number_format.NumberDecimalDigits = 0;
-                        user_job.Status = String.Format (Catalog.GetString ("Scanning ({0} files)..."), 
+                        user_job.Status = String.Format (Catalog.GetString ("Scanning ({0} files)..."),
                             import_element.TotalCount.ToString ("N", number_format));
                         last_enqueue_display = DateTime.Now;
                     }
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region Protected Import Hooks
-        
+
         protected virtual void OnImportRequested (string path)
         {
             ImportEventHandler handler = ImportRequested;
@@ -223,17 +223,17 @@ namespace Banshee.Collection
                 UpdateProgress (null);
             }
         }
-        
+
         protected override void OnFinished ()
         {
             DestroyUserJob ();
             base.OnFinished ();
         }
-        
+
 #endregion
 
 #region Properties
-        
+
         private string title = Catalog.GetString ("Importing Media");
         public string Title {
             get { return title; }
@@ -256,11 +256,11 @@ namespace Banshee.Collection
         public bool Threaded {
             set { import_element.Threaded = scanner_element.Threaded = value; }
         }
-        
+
         protected int TotalCount {
             get { return import_element == null ? 0 : import_element.TotalCount; }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
index dbe12c6..a3a8d9f 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/MemoryTrackListModel.cs
@@ -48,7 +48,7 @@ namespace Banshee.Collection
                 tracks.Clear ();
             }
         }
-        
+
         public override void Reload ()
         {
             lock (this) {
@@ -76,12 +76,12 @@ namespace Banshee.Collection
                 return IndexOf (track) != -1;
             }
         }
-    
+
         public override TrackInfo this[int index] {
             get { lock (this) { return (index >= 0 && index < tracks.Count) ? tracks[index] : null; } }
         }
 
-        public override TrackInfo GetRandom (DateTime since, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped)
+        public override TrackInfo GetRandom (DateTime since)
         {
             if (Count == 0)
                 return null;
@@ -89,10 +89,10 @@ namespace Banshee.Collection
             return this [random.Next (0, Count - 1)];
         }
 
-        public override int Count { 
+        public override int Count {
             get { lock (this) { return tracks.Count; } }
         }
-        
+
         public override int IndexOf (TrackInfo track)
         {
             lock (this) { return tracks.IndexOf (track); }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/ModelHelper.cs b/src/Core/Banshee.Services/Banshee.Collection/ModelHelper.cs
index 7600e42..d7ad603 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/ModelHelper.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/ModelHelper.cs
@@ -35,15 +35,15 @@ namespace Banshee.Collection
     {
         public delegate string SingleIdFilterHandler<T>(T t);
         public delegate void IdFilterChangedHandler(string newFilter);
-        
+
         public static void BuildIdFilter<T>(IEnumerable<T> value, string field, string oldFilter,
             SingleIdFilterHandler<T> singleFilterHandler, IdFilterChangedHandler filterChangedHandler)
         {
             int count = 0;
-            string new_filter = null;    
-            
+            string new_filter = null;
+
             System.Text.StringBuilder builder = new System.Text.StringBuilder();
-                
+
             if(value != null) {
                 foreach(T t in value) {
                     string t_f = singleFilterHandler(t);
@@ -52,16 +52,16 @@ namespace Banshee.Collection
                         count++;
                     }
                 }
-                
+
                 if(count > 0) {
                     builder.Remove(builder.Length - 1, 1);
                     builder.Insert(0, String.Format(" {0} IN (", field));
                     builder.Append(") ");
-                
+
                     new_filter = builder.ToString();
-                } 
+                }
             }
-            
+
             if(new_filter != oldFilter) {
                 filterChangedHandler(new_filter);
             }
diff --git a/src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs b/src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs
index 6cc1b87..25f2f58 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/RescanPipeline.cs
@@ -50,7 +50,7 @@ namespace Banshee.Collection
     // 4. Remove tracks that aren't on disk and weren't found to have moved
     //
     // Approach:
-    // 1. For each file in the source's directory, find orphaned db track if any, or add if new 
+    // 1. For each file in the source's directory, find orphaned db track if any, or add if new
     //    and update if modified; update the LastScannedAt stamp
     // 2. Remove all db tracks from the database that weren't scanned (LastScannedAt < scan_started)
     public class RescanPipeline : QueuePipeline<string>
@@ -68,7 +68,7 @@ namespace Banshee.Collection
             AddElement (new Banshee.IO.DirectoryScannerPipelineElement ());
             AddElement (track_sync = new TrackSyncPipelineElement (psource, scan_started));
             Finished += OnFinished;
-            
+
             BuildJob ();
             Enqueue (psource.BaseDirectory);
         }
@@ -159,14 +159,14 @@ namespace Banshee.Collection
             //Hyena.Log.DebugFormat ("Rescanning item {0}", file_path);
             try {
                 SafeUri uri = new SafeUri (file_path);
-                
+
                 IDataReader reader = ServiceManager.DbConnection.Query (fetch_command, psource.DbId, uri.AbsoluteUri);
                 if (reader.Read () ) {
                     //Hyena.Log.DebugFormat ("Found it in the db!");
                     DatabaseTrackInfo track = DatabaseTrackInfo.Provider.Load (reader);
-                    
+
                     MergeIfModified (track);
-    
+
                     // Either way, update the LastSyncStamp
                     track.LastSyncedStamp = DateTime.Now;
                     track.Save (false);
@@ -175,7 +175,7 @@ namespace Banshee.Collection
                     // This URI is not in the database - try to find it based on MetadataHash in case it was simply moved
                     DatabaseTrackInfo track = new DatabaseTrackInfo ();
                     Banshee.Streaming.StreamTagger.TrackInfoMerge (track, uri);
-    
+
                     IDataReader similar_reader = ServiceManager.DbConnection.Query (fetch_similar_command, psource.DbId, scan_started, track.MetadataHash);
                     DatabaseTrackInfo similar_track = null;
                     while (similar_reader.Read ()) {
@@ -191,7 +191,7 @@ namespace Banshee.Collection
                         }
                         similar_track = null;
                     }
-    
+
                     // If we still couldn't find it, try to import it
                     if (similar_track == null) {
                         //Hyena.Log.DebugFormat ("Couldn't find it, so queueing to import it");
diff --git a/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
index e3c6f02..41d12f9 100644
--- a/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection/TrackListModel.cs
@@ -43,14 +43,14 @@ namespace Banshee.Collection
         {
             selection = new Selection ();
         }
-        
+
         public TrackListModel(IDBusExportable parent) : base(parent)
         {
             selection = new Selection ();
         }
-        
+
         public abstract int IndexOf (TrackInfo track);
 
-        public abstract TrackInfo GetRandom (DateTime notPlayedSince, Banshee.PlaybackController.PlaybackShuffleMode mode, bool repeat, bool lastWasSkipped);
+        public abstract TrackInfo GetRandom (DateTime since);
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs b/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
index 325fbae..6b53454 100644
--- a/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
+++ b/src/Core/Banshee.Services/Banshee.Configuration/DatabaseConfigurationClient.cs
@@ -4,24 +4,24 @@
  *  Written by Scott Peterson <lunchtimemama at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -40,7 +40,7 @@ namespace Banshee.Configuration
         public static DatabaseConfigurationClient Client {
             get { return ServiceManager.DbConnection.Configuration; }
         }
-        
+
         private readonly BansheeDbConnection connection;
         private readonly HyenaSqliteCommand select_value_command;
         private readonly HyenaSqliteCommand select_id_command;
@@ -50,16 +50,16 @@ namespace Banshee.Configuration
         public DatabaseConfigurationClient(BansheeDbConnection connection)
         {
             this.connection = connection;
-            
+
             select_value_command = new HyenaSqliteCommand (String.Format (
                 "SELECT Value FROM {0} WHERE Key=?", TableName));
-            
+
             select_id_command = new HyenaSqliteCommand (String.Format (
                 "SELECT EntryID FROM {0} WHERE Key=?", TableName));
-            
+
             insert_command = new HyenaSqliteCommand (String.Format (
                 "INSERT INTO {0} (EntryID, Key, Value) VALUES (NULL, ?, ?)", TableName));
-            
+
             update_command = new HyenaSqliteCommand (String.Format (
                 "UPDATE {0} SET Value=? WHERE Key=?", TableName));
         }
@@ -89,10 +89,10 @@ namespace Banshee.Configuration
                 }
             }
         }
-        
+
         private IDataReader Get (string namespce, string key)
         {
-            return connection.Query (select_value_command, 
+            return connection.Query (select_value_command,
                 Banshee.Configuration.MemoryConfigurationClient.MakeKey (namespce, key));
         }
 
diff --git a/src/Core/Banshee.Services/Banshee.Configuration/DefaultApplicationHelper.cs b/src/Core/Banshee.Services/Banshee.Configuration/DefaultApplicationHelper.cs
index cad68e5..94ff0ce 100644
--- a/src/Core/Banshee.Services/Banshee.Configuration/DefaultApplicationHelper.cs
+++ b/src/Core/Banshee.Services/Banshee.Configuration/DefaultApplicationHelper.cs
@@ -39,16 +39,16 @@ namespace Banshee.Configuration
         bool IsDefault { get; }
         void MakeDefault ();
     }
-    
+
     public static class DefaultApplicationHelper
     {
         public static SchemaEntry<bool> MakeDefaultSchema = new SchemaEntry<bool> ("core", "make_default", true,
             "Whether to ensure Banshee is the default media player every time it starts", null);
-        
-        public static SchemaEntry<bool> RememberChoiceSchema = new SchemaEntry<bool> ("core", "remember_make_default", false, 
+
+        public static SchemaEntry<bool> RememberChoiceSchema = new SchemaEntry<bool> ("core", "remember_make_default", false,
             "Whether to remember whether to ensure Banshee is the default media player every time it starts", null);
 
-        public static SchemaEntry<bool> EverAskedSchema = new SchemaEntry<bool> ("core", "ever_asked_make_default", false, 
+        public static SchemaEntry<bool> EverAskedSchema = new SchemaEntry<bool> ("core", "ever_asked_make_default", false,
             "Whether the user has ever responded to whether they'd like to make Banshee the default player", null);
 
         private static IDefaultHelper helper;
@@ -61,7 +61,7 @@ namespace Banshee.Configuration
                             Log.DebugFormat ("Loaded Default Application Helper: {0}", helper.GetType ().FullName);
                             break;
                         } catch (Exception e) {
-                            Log.Exception ("Default Application Helper backend failed to load", e);    
+                            Log.Exception ("Default Application Helper backend failed to load", e);
                         }
                     }
                 }
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
index a51d17f..e8267ac 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
@@ -65,7 +65,7 @@ namespace Banshee.Database
 
             migrator = new BansheeDbFormatMigrator (this);
             configuration = new DatabaseConfigurationClient (this);
-            
+
             if (Banshee.Base.ApplicationContext.CommandLine.Contains ("debug-sql")) {
                 Hyena.Data.Sqlite.HyenaSqliteCommand.LogAll = true;
                 WarnIfCalledFromThread = Banshee.Base.ThreadAssist.MainThread;
@@ -83,7 +83,7 @@ namespace Banshee.Database
                 } catch (Exception e) {
                     Log.Exception ("Error determining if ANALYZE is necessary", e);
                 }
-                
+
                 // Update cached sorting keys
                 SortKeyUpdater.Update ();
             }
@@ -96,7 +96,7 @@ namespace Banshee.Database
             string [] tables_with_indexes = {"CoreTracks", "CoreArtists", "CoreAlbums",
                 "CorePlaylistEntries", "PodcastItems", "PodcastEnclosures",
                 "PodcastSyndications", "CoverArtDownloads"};
-            
+
             if (TableExists ("sqlite_stat1")) {
                 foreach (string table_name in tables_with_indexes) {
                     if (TableExists (table_name)) {
@@ -115,13 +115,13 @@ namespace Banshee.Database
             } else {
                 needs_analyze = true;
             }
-            
+
             if (needs_analyze) {
                 Log.DebugFormat ("Running ANALYZE against database to improve performance");
                 Execute ("ANALYZE");
             }
         }
- 
+
         public BansheeDbFormatMigrator Migrator {
             get { lock (this) { return migrator; } }
         }
@@ -131,16 +131,16 @@ namespace Banshee.Database
                 if (ApplicationContext.CommandLine.Contains ("db")) {
                     return ApplicationContext.CommandLine["db"];
                 }
-                
+
                 string proper_dbfile = Path.Combine (Paths.ApplicationData, "banshee.db");
                 if (File.Exists (proper_dbfile)) {
                     return proper_dbfile;
                 }
 
                 string dbfile = Path.Combine (Path.Combine (Environment.GetFolderPath (
-                    Environment.SpecialFolder.ApplicationData), 
-                    "banshee"), 
-                    "banshee.db"); 
+                    Environment.SpecialFolder.ApplicationData),
+                    "banshee"),
+                    "banshee.db");
 
                 if (!File.Exists (dbfile)) {
                     string tdbfile = Path.Combine (Path.Combine (Path.Combine (Environment.GetFolderPath (
@@ -151,12 +151,12 @@ namespace Banshee.Database
 
                     dbfile = tdbfile;
                 }
-                
+
                 if (File.Exists (dbfile)) {
                     Log.InformationFormat ("Copying your old Banshee Database to {0}", proper_dbfile);
                     File.Copy (dbfile, proper_dbfile);
                 }
-                
+
                 return proper_dbfile;
             }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
index 36dd90e..fbce6df 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
@@ -56,41 +56,41 @@ namespace Banshee.Database
         // NOTE: Whenever there is a change in ANY of the database schema,
         //       this version MUST be incremented and a migration method
         //       MUST be supplied to match the new version number
-        protected const int CURRENT_VERSION = 35;
+        protected const int CURRENT_VERSION = 36;
         protected const int CURRENT_METADATA_VERSION = 6;
-        
+
 #region Migration Driver
-        
+
         public delegate void SlowStartedHandler(string title, string message);
-        
+
         public event SlowStartedHandler SlowStarted;
         public event EventHandler SlowPulse;
         public event EventHandler SlowFinished;
 
         public event EventHandler Started;
         public event EventHandler Finished;
-                
-        protected class DatabaseVersionAttribute : Attribute 
+
+        protected class DatabaseVersionAttribute : Attribute
         {
             private int version;
-            
+
             public DatabaseVersionAttribute(int version)
             {
                 this.version = version;
             }
-            
+
             public int Version {
                 get { return version; }
             }
         }
-        
+
         private HyenaSqliteConnection connection;
-        
+
         public BansheeDbFormatMigrator (HyenaSqliteConnection connection)
         {
             this.connection = connection;
         }
-        
+
         protected virtual void OnSlowStarted(string title, string message)
         {
             SlowStartedHandler handler = SlowStarted;
@@ -98,7 +98,7 @@ namespace Banshee.Database
                 handler(title, message);
             }
         }
-        
+
         protected virtual void OnSlowPulse()
         {
             EventHandler handler = SlowPulse;
@@ -106,7 +106,7 @@ namespace Banshee.Database
                 handler(this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnSlowFinished()
         {
             EventHandler handler = SlowFinished;
@@ -130,11 +130,11 @@ namespace Banshee.Database
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void Migrate ()
         {
             try {
-                
+
                 if (DatabaseVersion < CURRENT_VERSION) {
                     Execute ("BEGIN");
                     InnerMigrate ();
@@ -142,7 +142,7 @@ namespace Banshee.Database
                 } else {
                     Log.DebugFormat ("Database version {0} is up to date", DatabaseVersion);
                 }
-                
+
                 // Trigger metadata refreshes if necessary
                 int metadata_version = connection.Query<int> ("SELECT Value FROM CoreConfiguration WHERE Key = 'MetadataVersion'");
                 if (DatabaseVersion == CURRENT_VERSION && metadata_version < CURRENT_METADATA_VERSION) {
@@ -156,13 +156,13 @@ namespace Banshee.Database
 
             OnFinished ();
         }
-        
+
         private void InnerMigrate ()
         {
             MethodInfo [] methods = GetType ().GetMethods (BindingFlags.Instance | BindingFlags.NonPublic);
             bool terminate = false;
             bool ran_migration_step = false;
-            
+
             Log.DebugFormat ("Migrating from database version {0} to {1}", DatabaseVersion, CURRENT_VERSION);
             for (int i = DatabaseVersion + 1; i <= CURRENT_VERSION; i++) {
                 foreach (MethodInfo method in methods) {
@@ -171,7 +171,7 @@ namespace Banshee.Database
                         if (attr.Version != i) {
                             continue;
                         }
-                        
+
                         if (!ran_migration_step) {
                             ran_migration_step = true;
                             OnStarted ();
@@ -180,80 +180,80 @@ namespace Banshee.Database
                         if (!(bool)method.Invoke (this, null)) {
                             terminate = true;
                         }
-                        
+
                         break;
                     }
                 }
-                
+
                 if (terminate) {
                     break;
                 }
             }
-            
+
             Execute (String.Format ("UPDATE CoreConfiguration SET Value = {0} WHERE Key = 'DatabaseVersion'", CURRENT_VERSION));
         }
-        
+
         protected bool TableExists(string tableName)
         {
             return connection.TableExists (tableName);
         }
-        
+
         protected void Execute(string query)
         {
             connection.Execute (query);
         }
-            
+
         protected int DatabaseVersion {
             get {
                 if (!TableExists("CoreConfiguration")) {
                     return 0;
                 }
-                
+
                 return connection.Query<int> ("SELECT Value FROM CoreConfiguration WHERE Key = 'DatabaseVersion'");
             }
         }
-        
+
 #endregion
-        
+
 #pragma warning disable 0169
 
 #region Version 1
-                                
+
         [DatabaseVersion (1)]
         private bool Migrate_1 ()
         {
             if (TableExists("Tracks")) {
                 InitializeFreshDatabase (true);
-                
+
                 uint timer_id = Log.DebugTimerStart ("Database Schema Migration");
 
-                OnSlowStarted (Catalog.GetString ("Upgrading your Banshee Database"), 
+                OnSlowStarted (Catalog.GetString ("Upgrading your Banshee Database"),
                     Catalog.GetString ("Please wait while your old Banshee database is migrated to the new format."));
-            
+
                 Thread thread = new Thread (MigrateFromLegacyBanshee);
                 thread.Name = "Database Migrator";
                 thread.Start ();
-            
+
                 while (thread.IsAlive) {
                     OnSlowPulse ();
                     Thread.Sleep (100);
                 }
 
                 Log.DebugTimerPrint (timer_id);
-            
+
                 OnSlowFinished ();
-                
+
                 return false;
             } else {
                 InitializeFreshDatabase (false);
                 return false;
             }
         }
-        
+
 #endregion
 
 #region Version 2
-        
+
         [DatabaseVersion (2)]
         private bool Migrate_2 ()
         {
@@ -291,7 +291,7 @@ namespace Banshee.Database
 #endregion
 
 #region Version 5
-        
+
         [DatabaseVersion (5)]
         private bool Migrate_5 ()
         {
@@ -327,7 +327,7 @@ namespace Banshee.Database
             Execute ("CREATE INDEX IF NOT EXISTS CoreAlbumsIndex       ON CoreAlbums(ArtistID, TitleLowered)");
             Execute ("CREATE INDEX IF NOT EXISTS CoreSmartPlaylistEntriesIndex ON CoreSmartPlaylistEntries(SmartPlaylistID, TrackID)");
             Execute ("CREATE INDEX IF NOT EXISTS CorePlaylistEntriesIndex ON CorePlaylistEntries(PlaylistID, TrackID)");
-            
+
             return true;
         }
 
@@ -341,7 +341,7 @@ namespace Banshee.Database
             Execute ("INSERT INTO CoreConfiguration (EntryID, Key, Value) VALUES (null, 'MetadataVersion', 0)");
             return true;
         }
-        
+
 #endregion
 
 #region Version 7
@@ -355,7 +355,7 @@ namespace Banshee.Database
             try { Execute ("DELETE FROM CoreCache; DELETE FROM CoreCacheModels"); } catch {}
             return true;
         }
-        
+
 #endregion
 
 #region Version 8
@@ -371,7 +371,7 @@ namespace Banshee.Database
             Application.ClientStarted += ReloadAllSources;
             return true;
         }
-        
+
 #endregion
 
 #region Version 9
@@ -398,18 +398,18 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CoreTracks ADD COLUMN ExternalID INTEGER");
             return true;
         }
-        
+
 #endregion
 
 #region Version 11
-        
+
         [DatabaseVersion (11)]
         private bool Migrate_11 ()
         {
             Execute("CREATE INDEX CoreTracksExternalIDIndex ON CoreTracks(PrimarySourceID, ExternalID)");
             return true;
         }
-        
+
 #endregion
 
 #region Version 12
@@ -421,7 +421,7 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CoreAlbums ADD COLUMN ArtistNameLowered STRING");
             return true;
         }
-        
+
 #endregion
 
 #region Version 13
@@ -433,7 +433,7 @@ namespace Banshee.Database
             Execute("CREATE INDEX CoreTracksUriIndex ON CoreTracks(PrimarySourceID, Uri)");
             return true;
         }
-        
+
 #endregion
 
 #region Version 14
@@ -444,7 +444,7 @@ namespace Banshee.Database
             InitializeOrderedTracks ();
             return true;
         }
-        
+
 #endregion
 
 #region Version 15
@@ -458,7 +458,7 @@ namespace Banshee.Database
             }
             return true;
         }
-        
+
 #endregion
 
 #region Version 16
@@ -472,9 +472,9 @@ namespace Banshee.Database
             Execute ("ANALYZE");
             return true;
         }
-        
+
 #endregion
-        
+
 #region Version 17
 
         [DatabaseVersion (17)]
@@ -484,7 +484,7 @@ namespace Banshee.Database
             Execute ("ANALYZE");
             return true;
         }
-        
+
 #endregion
 
 #region Version 18
@@ -495,9 +495,9 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CoreTracks ADD COLUMN MetadataHash TEXT");
             return true;
         }
-        
+
 #endregion
-        
+
 #region Version 19
 
         [DatabaseVersion (19)]
@@ -511,7 +511,7 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CoreTracks ADD COLUMN BitRate INTEGER DEFAULT 0");
             return true;
         }
-        
+
 #endregion
 
 #region Version 20
@@ -524,7 +524,7 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CorePrimarySources ADD COLUMN IsTemporary INTEGER DEFAULT 0");
             return true;
         }
-        
+
 #endregion
 
 #region Version 21
@@ -539,7 +539,7 @@ namespace Banshee.Database
             }
             return true;
         }
-        
+
 #endregion
 
 #region Version 22
@@ -552,7 +552,7 @@ namespace Banshee.Database
             Execute ("UPDATE CoreTracks SET LastSyncedStamp = DateAddedStamp;");
             return true;
         }
-        
+
 #endregion
 
 #region Version 23
@@ -567,7 +567,7 @@ namespace Banshee.Database
 
             return true;
         }
-        
+
 #endregion
 
 #region Version 24
@@ -593,7 +593,7 @@ namespace Banshee.Database
             Execute ("ALTER TABLE CoreTracks ADD COLUMN TitleSortKey BLOB");
             return true;
         }
-        
+
 #endregion
 
 #region Version 26
@@ -606,7 +606,7 @@ namespace Banshee.Database
             string unknown_title = "Unknown Title";
 
             connection.Execute ("UPDATE CoreArtists SET Name = NULL, NameLowered = HYENA_SEARCH_KEY(?)" +
-                                " WHERE Name  IN ('', ?, ?) OR Name IS NULL", 
+                                " WHERE Name  IN ('', ?, ?) OR Name IS NULL",
                                 ArtistInfo.UnknownArtistName, unknown_artist, ArtistInfo.UnknownArtistName);
 
             connection.Execute ("UPDATE CoreAlbums SET ArtistName = NULL, ArtistNameLowered = HYENA_SEARCH_KEY(?)" +
@@ -623,7 +623,7 @@ namespace Banshee.Database
 
             return true;
         }
-        
+
 #endregion
 
 #region Version 27
@@ -758,7 +758,7 @@ namespace Banshee.Database
             Execute ("ANALYZE");
             return true;
         }
-        
+
 #endregion
 
 #region Version 33
@@ -802,10 +802,37 @@ namespace Banshee.Database
 
 #endregion
 
+#region Version 36
+
+        [DatabaseVersion (36)]
+        private bool Migrate_36 ()
+        {
+            Execute(@"
+                CREATE TABLE CoreShuffles (
+                    ShufflerId           INTEGER,
+                    TrackID             INTEGER,
+                    LastShuffledAt      INTEGER,
+                    CONSTRAINT one_entry_per_track UNIQUE (ShufflerID, TrackID)
+                )
+            ");
+            Execute("CREATE INDEX CoreShufflesIndex ON CoreShuffles (ShufflerId, TrackID, LastShuffledAt)");
+
+            Execute(@"
+                CREATE TABLE CoreShufflers (
+                    ShufflerId      INTEGER PRIMARY KEY,
+                    Id              TEXT UNIQUE
+                )
+            ");
+
+            return true;
+        }
+
+#endregion
+
 #pragma warning restore 0169
-        
+
 #region Fresh database setup
-        
+
         private void InitializeFreshDatabase (bool refresh_metadata)
         {
             Execute("DROP TABLE IF EXISTS CoreConfiguration");
@@ -819,7 +846,7 @@ namespace Banshee.Database
             Execute("DROP TABLE IF EXISTS CoreRemovedTracks");
             Execute("DROP TABLE IF EXISTS CoreTracksCache");
             Execute("DROP TABLE IF EXISTS CoreCache");
-            
+
             Execute(@"
                 CREATE TABLE CoreConfiguration (
                     EntryID             INTEGER PRIMARY KEY,
@@ -831,7 +858,7 @@ namespace Banshee.Database
             if (!refresh_metadata) {
                 Execute (String.Format ("INSERT INTO CoreConfiguration (EntryID, Key, Value) VALUES (null, 'MetadataVersion', {0})", CURRENT_METADATA_VERSION));
             }
-            
+
             Execute(@"
                 CREATE TABLE CorePrimarySources (
                     PrimarySourceID     INTEGER PRIMARY KEY,
@@ -853,7 +880,7 @@ namespace Banshee.Database
                     AlbumID             INTEGER,
                     TagSetID            INTEGER,
                     ExternalID          INTEGER,
-                    
+
                     MusicBrainzID       TEXT,
 
                     Uri                 TEXT,
@@ -862,7 +889,7 @@ namespace Banshee.Database
                     BitRate             INTEGER,
                     Attributes          INTEGER DEFAULT {0},
                     LastStreamError     INTEGER DEFAULT {1},
-                    
+
                     Title               TEXT,
                     TitleLowered        TEXT,
                     TitleSort           TEXT,
@@ -901,13 +928,13 @@ namespace Banshee.Database
             Execute("CREATE INDEX CoreTracksExternalIDIndex ON CoreTracks(PrimarySourceID, ExternalID)");
             Execute("CREATE INDEX CoreTracksUriIndex ON CoreTracks(PrimarySourceID, Uri)");
             Execute("CREATE INDEX CoreTracksCoverArtIndex ON CoreTracks (PrimarySourceID, AlbumID, DateUpdatedStamp)");
-            
+
             Execute(@"
                 CREATE TABLE CoreAlbums (
                     AlbumID             INTEGER PRIMARY KEY,
                     ArtistID            INTEGER,
                     TagSetID            INTEGER,
-                    
+
                     MusicBrainzID       TEXT,
 
                     Title               TEXT,
@@ -919,12 +946,12 @@ namespace Banshee.Database
                     Duration            INTEGER,
                     Year                INTEGER,
                     IsCompilation       INTEGER DEFAULT 0,
-                    
+
                     ArtistName          TEXT,
                     ArtistNameLowered   TEXT,
                     ArtistNameSort      TEXT,
                     ArtistNameSortKey   BLOB,
-                    
+
                     Rating              INTEGER
                 )
             ");
@@ -944,7 +971,7 @@ namespace Banshee.Database
                 )
             ");
             Execute ("CREATE INDEX CoreArtistsIndex ON CoreArtists(NameSortKey)");
-            
+
             Execute(@"
                 CREATE TABLE CorePlaylists (
                     PrimarySourceID     INTEGER,
@@ -957,7 +984,7 @@ namespace Banshee.Database
                     IsTemporary         INTEGER DEFAULT 0
                 )
             ");
-            
+
             Execute(@"
                 CREATE TABLE CorePlaylistEntries (
                     EntryID             INTEGER PRIMARY KEY,
@@ -968,7 +995,7 @@ namespace Banshee.Database
                 )
             ");
             Execute("CREATE INDEX CorePlaylistEntriesIndex ON CorePlaylistEntries(PlaylistID, TrackID)");
-            
+
             Execute(@"
                 CREATE TABLE CoreSmartPlaylists (
                     PrimarySourceID     INTEGER,
@@ -982,7 +1009,7 @@ namespace Banshee.Database
                     IsTemporary         INTEGER DEFAULT 0
                 )
             ");
-                
+
             Execute(@"
                 CREATE TABLE CoreSmartPlaylistEntries (
                     EntryID             INTEGER PRIMARY KEY,
@@ -1010,36 +1037,53 @@ namespace Banshee.Database
             // This index slows down queries were we shove data into the CoreCache.
             // Since we do that frequently, not using it.
             //Execute("CREATE INDEX CoreCacheModelId      ON CoreCache(ModelID)");
+
+            Execute(@"
+                CREATE TABLE CoreShuffles (
+                    ShufflerId           INTEGER,
+                    TrackID             INTEGER,
+                    LastShuffledAt      INTEGER,
+                    CONSTRAINT one_entry_per_track UNIQUE (ShufflerID, TrackID)
+                )
+            ");
+            Execute("CREATE INDEX CoreShufflesIndex ON CoreShuffles (ShufflerId, TrackID, LastShuffledAt)");
+
+            Execute(@"
+                CREATE TABLE CoreShufflers (
+                    ShufflerId      INTEGER PRIMARY KEY,
+                    Id              TEXT UNIQUE
+                )
+            ");
         }
-        
+
 #endregion
 
 #region Legacy database migration
-        
+
         private void MigrateFromLegacyBanshee()
         {
             Execute(@"
                 INSERT INTO CoreArtists
                     (ArtistID, TagSetID, MusicBrainzID, Name, NameLowered, NameSort, Rating)
                     SELECT DISTINCT null, 0, null, Artist, NULL, NULL, 0
-                        FROM Tracks 
+                        FROM Tracks
                         ORDER BY Artist
             ");
-            
+
             Execute(@"
                 INSERT INTO CoreAlbums
                     (AlbumID, ArtistID, TagSetID, MusicBrainzID, Title, TitleLowered, TitleSort, ReleaseDate,
                     Duration, Year, IsCompilation, ArtistName, ArtistNameLowered, ArtistNameSort, Rating)
                     SELECT DISTINCT null,
-                        (SELECT ArtistID 
-                            FROM CoreArtists 
+                        (SELECT ArtistID
+                            FROM CoreArtists
                             WHERE Name = Tracks.Artist
                             LIMIT 1),
                         0, null, AlbumTitle, NULL, NULL, ReleaseDate, 0, 0, 0, Artist, NULL, NULL, 0
                         FROM Tracks
                         ORDER BY AlbumTitle
             ");
-            
+
             Execute (String.Format (@"
                 INSERT INTO CoreTracks
                     (PrimarySourceID, TrackID, ArtistID, AlbumID, TagSetID, ExternalID, MusicBrainzID, Uri, MimeType,
@@ -1047,15 +1091,15 @@ namespace Banshee.Database
                     Disc, DiscCount, Duration, Year, Genre, Composer, Conductor, Grouping, Copyright, LicenseUri,
                     Comment, Rating, Score, PlayCount, SkipCount, LastPlayedStamp, LastSkippedStamp, DateAddedStamp,
                     DateUpdatedStamp, MetadataHash, BPM, LastSyncedStamp, FileModifiedStamp)
-                    SELECT 
+                    SELECT
                         1,
-                        TrackID, 
-                        (SELECT ArtistID 
-                            FROM CoreArtists 
+                        TrackID,
+                        (SELECT ArtistID
+                            FROM CoreArtists
                             WHERE Name = Artist),
-                        (SELECT a.AlbumID 
+                        (SELECT a.AlbumID
                             FROM CoreAlbums a, CoreArtists b
-                            WHERE a.Title = AlbumTitle 
+                            WHERE a.Title = AlbumTitle
                                 AND a.ArtistID = b.ArtistID
                                 AND b.Name = Artist),
                         0,
@@ -1123,7 +1167,7 @@ namespace Banshee.Database
 
             Execute ("UPDATE CoreSmartPlaylists SET PrimarySourceID = 1");
             Execute ("UPDATE CorePlaylists SET PrimarySourceID = 1");
-            
+
             InitializeOrderedTracks ();
             Migrate_15 ();
         }
@@ -1135,9 +1179,9 @@ namespace Banshee.Database
         private void InitializeOrderedTracks ()
         {
             foreach (long playlist_id in connection.QueryEnumerable<long> ("SELECT PlaylistID FROM CorePlaylists ORDER BY PlaylistID")) {
-                if (connection.Query<long> (@"SELECT COUNT(*) FROM CorePlaylistEntries 
+                if (connection.Query<long> (@"SELECT COUNT(*) FROM CorePlaylistEntries
                     WHERE PlaylistID = ? AND ViewOrder > 0", playlist_id) <= 0) {
-                
+
                     long first_id = connection.Query<long> ("SELECT COUNT(*) FROM CorePlaylistEntries WHERE PlaylistID < ?", playlist_id);
                     connection.Execute (
                         @"UPDATE CorePlaylistEntries SET ViewOrder = (ROWID - ?) WHERE PlaylistID = ?",
@@ -1166,7 +1210,7 @@ namespace Banshee.Database
                 RefreshMetadataDelayed ();
             }
         }
-        
+
         private void ReloadAllSources (Client client)
         {
             Application.ClientStarted -= ReloadAllSources;
@@ -1176,9 +1220,9 @@ namespace Banshee.Database
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region Metadata Refresh Driver
 
         private void RefreshMetadataDelayed ()
@@ -1231,7 +1275,7 @@ namespace Banshee.Database
                                 Log.Warning (String.Format ("Failed to update metadata for {0}", track),
                                     e.GetType ().ToString (), false);
                             }
-                            
+
                             track.Save (false);
                             track.Artist.Save ();
                             track.Album.Save ();
@@ -1255,7 +1299,7 @@ namespace Banshee.Database
             job.Finish ();
             ServiceManager.SourceManager.MusicLibrary.NotifyTracksChanged ();
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs
index e0633eb..83a66da 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs
@@ -44,11 +44,11 @@ namespace Banshee.Database
             : base (connection, uuid, model, provider)
         {
         }
-        
+
         protected override string CacheModelsTableName {
             get { return "CoreCacheModels"; }
         }
-        
+
         protected override string CacheTableName {
             get { return "CoreCache"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeModelProvider.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeModelProvider.cs
index d92cec4..033c69e 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeModelProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeModelProvider.cs
@@ -48,15 +48,15 @@ namespace Banshee.Database
             : base (connection, table_name, BansheeDatabaseSettings.CheckTables)
         {
         }
-        
+
         protected override sealed void CheckVersion ()
         {
             CheckVersion (TableName, "ModelVersion", ModelVersion, MigrateTable);
             CheckVersion ("Database", "Version", DatabaseVersion, MigrateDatabase);
         }
-        
+
         private delegate void MigrateDel (int version);
-        
+
         private static void CheckVersion (string namespce, string key, int new_version, MigrateDel func)
         {
             int old_version = DatabaseConfigurationClient.Client.Get <int> (
diff --git a/src/Core/Banshee.Services/Banshee.Database/SortKeyUpdater.cs b/src/Core/Banshee.Services/Banshee.Database/SortKeyUpdater.cs
index 09a4358..5ca91f1 100644
--- a/src/Core/Banshee.Services/Banshee.Database/SortKeyUpdater.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/SortKeyUpdater.cs
@@ -43,12 +43,12 @@ namespace Banshee.Database
                 ForceUpdate (locale);
             }
         }
-        
+
         public static void ForceUpdate ()
         {
             ForceUpdate (CultureInfo.CurrentCulture.Name);
         }
-        
+
         protected static void ForceUpdate (string new_locale)
         {
             ServiceManager.DbConnection.Execute (@"
@@ -75,7 +75,7 @@ namespace Banshee.Database
 
             DatabaseConfigurationClient.Client.Set<string> ("SortKeyLocale", new_locale);
         }
-        
+
         protected static string PreviousLocale {
             get {
                 return DatabaseConfigurationClient.Client.Get<string> ("SortKeyLocale", "");
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
index 31d792b..d7fd5f7 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
@@ -33,6 +33,7 @@ using System.Xml;
 using System.Collections;
 using System.Collections.Generic;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.MediaEngine;
 using Banshee.ServiceStack;
@@ -43,11 +44,12 @@ namespace Banshee.Equalizer
     {
         private List<EqualizerSetting> equalizers = new List<EqualizerSetting> ();
         private string path;
-        
+
+        public delegate void EqualizerSettingEventHandler (object o, Hyena.EventArgs<EqualizerSetting> args);
         public event EqualizerSettingEventHandler EqualizerAdded;
         public event EqualizerSettingEventHandler EqualizerRemoved;
         public event EqualizerSettingEventHandler EqualizerChanged;
-        
+
         private static EqualizerManager instance;
         public static EqualizerManager Instance {
             get {
@@ -55,25 +57,25 @@ namespace Banshee.Equalizer
                     instance = new EqualizerManager (System.IO.Path.Combine (
                         Paths.ApplicationData, "equalizers.xml"));
                 }
-                
+
                 return instance;
             }
         }
-        
+
         public EqualizerManager ()
         {
         }
-        
+
         public EqualizerManager (string path)
         {
             this.path = path;
-            
+
             try {
                 Load ();
             } catch {
             }
         }
-    
+
         public void Add (EqualizerSetting eq)
         {
             eq.Changed += OnEqualizerSettingChanged;
@@ -81,98 +83,98 @@ namespace Banshee.Equalizer
             QueueSave ();
             OnEqualizerAdded (eq);
         }
-        
+
         public void Remove (EqualizerSetting eq)
         {
             Remove (eq, true);
         }
-        
+
         private void Remove (EqualizerSetting eq, bool shouldQueueSave)
         {
             if (eq == null) {
                 return;
             }
-            
+
             eq.Changed -= OnEqualizerSettingChanged;
             equalizers.Remove (eq);
             OnEqualizerRemoved (eq);
-            
+
             if (shouldQueueSave) {
                 QueueSave ();
             }
         }
-        
+
         public void Clear ()
         {
             while (equalizers.Count > 0) {
                 Remove (equalizers[0], false);
             }
-            
+
             QueueSave ();
         }
-        
+
         public void Enable (EqualizerSetting eq)
         {
             if (eq != null) {
                 eq.Enabled = true;
-                
+
                 // Make a copy of the Dictionary first, otherwise it'll become out of sync
                 // when we begin to change the gain on the bands.
                 Dictionary<uint, double> bands = new Dictionary<uint, double> (eq.Bands);
-                
+
                 foreach(KeyValuePair<uint, double> band in bands)
                 {
                     eq.SetGain (band.Key, band.Value);
                 }
-                
+
                 // Reset preamp.
                 eq.AmplifierLevel = eq.AmplifierLevel;
             }
         }
-        
+
         public void Disable (EqualizerSetting eq)
         {
             if (eq != null) {
                 eq.Enabled = false;
-            
+
                 // Set the actual equalizer gain on all bands to 0 dB,
                 // but don't change the gain in the dictionary (we can use/change those values
                 // later, but not affect the actual audio stream until we're enabled again).
                 for (uint i = 0; i < eq.BandCount; i++) {
                     ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).SetEqualizerGain (i, 0);
                 }
-                
+
                 ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).AmplifierLevel = 0;
             }
         }
-        
+
         public void Load ()
         {
             Load (path);
         }
-        
+
         public void Load (string path)
         {
             XmlDocument doc = new XmlDocument ();
-            
+
             try {
                 doc.Load (path);
             } catch {
             }
-            
+
             Clear ();
-            
+
             if (doc.DocumentElement == null || doc.DocumentElement.ChildNodes == null) {
                 return;
             }
-            
+
             foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
                 if(node.Name != "equalizer") {
                     throw new XmlException ("equalizer node was expected");
                 }
-                
+
                 EqualizerSetting eq = new EqualizerSetting (node.Attributes["name"].Value);
-                
+
                 foreach (XmlNode child in node) {
                     if (child.Name == "preamp") {
                         eq.AmplifierLevel = Convert.ToDouble (child.InnerText);
@@ -183,32 +185,32 @@ namespace Banshee.Equalizer
                         throw new XmlException ("Invalid node, expected one of preamp or band");
                     }
                 }
-                
+
                 Add (eq);
             }
         }
-        
+
         public void Save ()
         {
             Save (path);
         }
-        
+
         public void Save (string path)
         {
             XmlDocument doc = new XmlDocument ();
             XmlNode root = doc.CreateNode (XmlNodeType.Element, "equalizers", null);
             doc.AppendChild (root);
-            
+
             foreach (EqualizerSetting eq in this) {
                 XmlNode root_node = doc.CreateNode (XmlNodeType.Element, "equalizer", null);
-            
+
                 XmlAttribute name_node = doc.CreateAttribute ("name");
                 name_node.Value = eq.Name;
                 XmlNode preamp_node = doc.CreateNode (XmlNodeType.Element, "preamp", null);
                 XmlNode preamp_node_value = doc.CreateNode (XmlNodeType.Text, "value", null);
                 preamp_node_value.Value = Convert.ToString (eq.AmplifierLevel);
                 preamp_node.AppendChild (preamp_node_value);
-                
+
                 root_node.Attributes.Append (name_node);
                 root_node.AppendChild (preamp_node);
 
@@ -217,74 +219,74 @@ namespace Banshee.Equalizer
                     XmlNode band_node_value = doc.CreateNode (XmlNodeType.Text, "value", null);
                     band_node_value.Value = Convert.ToString (band.Value);
                     band_node.AppendChild (band_node_value);
-                    
+
                     XmlAttribute frequency_node = doc.CreateAttribute ("num");
                     frequency_node.Value = Convert.ToString (band.Key);
                     band_node.Attributes.Append (frequency_node);
-                    
+
                     root_node.AppendChild (band_node);
                 }
-                
+
                 root.AppendChild (root_node);
             }
-            
+
             doc.Save (path);
         }
-        
+
         protected virtual void OnEqualizerAdded (EqualizerSetting eq)
         {
             EqualizerSettingEventHandler handler = EqualizerAdded;
             if (handler != null) {
-                handler (this, new EqualizerSettingEventArgs (eq));
+                handler (this, new EventArgs<EqualizerSetting> (eq));
             }
         }
-        
+
         protected virtual void OnEqualizerRemoved (EqualizerSetting eq)
         {
             EqualizerSettingEventHandler handler = EqualizerRemoved;
             if (handler != null) {
-                handler (this, new EqualizerSettingEventArgs (eq));
+                handler (this, new EventArgs<EqualizerSetting> (eq));
             }
         }
-        
+
         protected virtual void OnEqualizerChanged (EqualizerSetting eq)
         {
             EqualizerSettingEventHandler handler = EqualizerChanged;
             if (handler != null) {
-                handler (this, new EqualizerSettingEventArgs (eq));
+                handler (this, new EventArgs<EqualizerSetting> (eq));
             }
         }
-        
+
         private void OnEqualizerSettingChanged (object o, EventArgs args)
         {
             OnEqualizerChanged (o as EqualizerSetting);
             QueueSave ();
         }
-        
+
         private uint queue_save_id = 0;
         private void QueueSave ()
         {
             if (queue_save_id > 0) {
                 return;
             }
-            
+
             queue_save_id = GLib.Timeout.Add (2500, delegate {
                 Save ();
                 queue_save_id = 0;
                 return false;
             });
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return equalizers.GetEnumerator ();
         }
-        
+
         public IEnumerator<EqualizerSetting> GetEnumerator ()
         {
             return equalizers.GetEnumerator ();
         }
-        
+
         public string Path {
             get { return path; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
index ed9cd21..a12fce9 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
@@ -42,19 +42,19 @@ namespace Banshee.Equalizer
         private double amp = 0;    // amplifier dB (0 dB == passthrough)
         private bool enabled = true;
         private const uint bandcount = 10;
-        
+
         public event EventHandler Changed;
-        
+
         public EqualizerSetting (string name)
         {
             this.name = name;
-            
+
             // Fill in 0 dB for all bands at init.
             for (uint i = 0; i < bandcount; i++) {
                 bands.Add(i, 0);
             }
         }
-        
+
         /// <summary>
         /// Human-readable name of this equalizer instance.
         /// </summary>
@@ -67,27 +67,27 @@ namespace Banshee.Equalizer
                 OnChanged ();
             }
         }
-        
+
         public bool Enabled {
             get { return enabled; }
             set
             {
                 enabled = value;
                 EnabledSchema.Set (value);
-                
+
                 // Make this the new default preset (last changed).
                 PresetSchema.Set (this.name);
             }
         }
-        
+
         public Dictionary<uint, double> Bands {
             get { return bands; }
         }
-        
+
         public uint BandCount {
             get { return bandcount; }
         }
-        
+
         /// <summary>
         /// Sets/gets the preamp gain.
         /// </summary>
@@ -115,20 +115,20 @@ namespace Banshee.Equalizer
             } else {
                 bands.Add (band, val);
             }
-            
+
             // Tell engine that we've changed.
             if (enabled) {
                 ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).SetEqualizerGain (band, val);
             }
-            
+
             OnChanged ();
         }
-        
+
         public double this[uint band] {
             get { return bands[band]; }
             set { SetGain (band, value); }
         }
-        
+
         protected virtual void OnChanged ()
         {
             EventHandler handler = Changed;
@@ -136,14 +136,14 @@ namespace Banshee.Equalizer
                 handler (this, new EventArgs ());
             }
         }
-        
+
         public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
             "player_engine", "equalizer_enabled",
             false,
             "Equalizer status",
             "Whether or not the equalizer is set to be enabled."
         );
-        
+
         public static readonly SchemaEntry<string> PresetSchema = new SchemaEntry<string> (
             "player_engine", "equalizer_preset",
             "",
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSettingEvent.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSettingEvent.cs
deleted file mode 100644
index 2ec1a54..0000000
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSettingEvent.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// EqualizerSettingEvent.cs
-//
-// Author:
-//   Aaron Bockover <abockover at novell.com>
-//
-// Copyright (C) 2006-2007 Novell, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-
-namespace Banshee.Equalizer
-{
-    public delegate void EqualizerSettingEventHandler (object o, EqualizerSettingEventArgs args);
-    
-    public class EqualizerSettingEventArgs : EventArgs
-    {
-        private EqualizerSetting eq;
-        
-        public EqualizerSettingEventArgs (EqualizerSetting eq)
-        {
-            this.eq = eq;
-        }
-        
-        public EqualizerSetting EqualizerSetting {
-            get { return eq; }
-        }
-    }
-}
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/DeviceCommand.cs b/src/Core/Banshee.Services/Banshee.Hardware/DeviceCommand.cs
index cd65c12..7b13a41 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/DeviceCommand.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/DeviceCommand.cs
@@ -66,7 +66,7 @@ namespace Banshee.Hardware
             }
 
             DeviceCommand d_command = null;
-            
+
             switch (command) {
                 case "device-activate-play":
                     d_command = new DeviceCommand (DeviceCommandAction.Activate | DeviceCommandAction.Play);
@@ -84,7 +84,7 @@ namespace Banshee.Hardware
                     return null;
             }
 
-            // FIXME: Should use GIO here to resolve UNIX device nodes or 
+            // FIXME: Should use GIO here to resolve UNIX device nodes or
             // HAL UDIs from the GIO URI that we were likely given by Nautilus
 
             try {
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/HardwareManager.cs b/src/Core/Banshee.Services/Banshee.Hardware/HardwareManager.cs
index 6feb20b..656aa7c 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/HardwareManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/HardwareManager.cs
@@ -40,38 +40,38 @@ namespace Banshee.Hardware
     {
         private IHardwareManager manager;
         private Dictionary<string, ICustomDeviceProvider> custom_device_providers = new Dictionary<string, ICustomDeviceProvider> ();
-        
+
         public event DeviceAddedHandler DeviceAdded;
         public event DeviceRemovedHandler DeviceRemoved;
-        
+
         public HardwareManager ()
         {
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/Platform/HardwareManager")) {
                 try {
                     if (manager != null) {
                         throw new Exception (String.Format (
-                            "A HardwareManager has already been loaded ({0}). Only one can be loaded.", 
+                            "A HardwareManager has already been loaded ({0}). Only one can be loaded.",
                             manager.GetType ().FullName));
                     }
-                    
+
                     manager = (IHardwareManager)node.CreateInstance (typeof (IHardwareManager));
                 } catch (Exception e) {
                     Log.Warning ("Hardware manager extension failed to load", e.Message);
                 }
             }
-            
+
             if (manager == null) {
                 throw new Exception ("No HardwareManager extensions could be loaded. Hardware support will be disabled.");
             }
-            
+
             manager.DeviceAdded += OnDeviceAdded;
             manager.DeviceRemoved += OnDeviceRemoved;
-            
+
             ServiceManager.Get<DBusCommandService> ().ArgumentPushed += OnCommandLineArgument;
 
             AddinManager.AddExtensionNodeHandler ("/Banshee/Platform/HardwareDeviceProvider", OnExtensionChanged);
         }
-        
+
         public void Dispose ()
         {
             lock (this) {
@@ -83,25 +83,25 @@ namespace Banshee.Hardware
                 }
 
                 ServiceManager.Get<DBusCommandService> ().ArgumentPushed -= OnCommandLineArgument;
-                
+
                 if (custom_device_providers != null) {
                     foreach (ICustomDeviceProvider provider in custom_device_providers.Values) {
                         provider.Dispose ();
                     }
-                    
+
                     custom_device_providers.Clear ();
                     custom_device_providers = null;
                 }
-                
+
                 AddinManager.RemoveExtensionNodeHandler ("/Banshee/Platform/HardwareDeviceProvider", OnExtensionChanged);
             }
         }
-        
-        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+
+        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             lock (this) {
                 TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-                
+
                 if (args.Change == ExtensionChange.Add && !custom_device_providers.ContainsKey (node.Id)) {
                     custom_device_providers.Add (node.Id, (ICustomDeviceProvider)node.CreateInstance ());
                 } else if (args.Change == ExtensionChange.Remove && custom_device_providers.ContainsKey (node.Id)) {
@@ -125,9 +125,9 @@ namespace Banshee.Hardware
                     }
                 }
             }
-            
+
             remove { device_command -= value; }
-        }           
+        }
 
         private Banshee.Hardware.DeviceCommand startup_device_command;
         private bool startup_device_command_checked = false;
@@ -167,7 +167,7 @@ namespace Banshee.Hardware
         }
 
 #endregion
-        
+
         private void OnDeviceAdded (object o, DeviceAddedArgs args)
         {
             lock (this) {
@@ -175,16 +175,16 @@ namespace Banshee.Hardware
                 if (handler != null) {
                     DeviceAddedArgs raise_args = args;
                     IDevice cast_device = CastToCustomDevice<IDevice> (args.Device);
-                    
+
                     if (cast_device != args.Device) {
                         raise_args = new DeviceAddedArgs (cast_device);
                     }
-                    
+
                     handler (this, raise_args);
                 }
             }
         }
-        
+
         private void OnDeviceRemoved (object o, DeviceRemovedArgs args)
         {
             lock (this) {
@@ -194,7 +194,7 @@ namespace Banshee.Hardware
                 }
             }
         }
-        
+
         private T CastToCustomDevice<T> (T device) where T : class, IDevice
         {
             foreach (ICustomDeviceProvider provider in custom_device_providers.Values) {
@@ -203,10 +203,10 @@ namespace Banshee.Hardware
                     return new_device;
                 }
             }
-            
+
             return device;
         }
-        
+
         private IEnumerable<T> CastToCustomDevice<T> (IEnumerable<T> devices) where T : class, IDevice
         {
             foreach (T device in devices) {
@@ -218,34 +218,34 @@ namespace Banshee.Hardware
         {
             return CastToCustomDevice<IDevice> (manager.GetAllDevices ());
         }
-        
+
         public IEnumerable<IBlockDevice> GetAllBlockDevices ()
         {
             return CastToCustomDevice<IBlockDevice> (manager.GetAllBlockDevices ());
         }
-        
+
         public IEnumerable<ICdromDevice> GetAllCdromDevices ()
         {
             return CastToCustomDevice<ICdromDevice> (manager.GetAllCdromDevices ());
         }
-        
+
         public IEnumerable<IDiskDevice> GetAllDiskDevices ()
         {
             return CastToCustomDevice<IDiskDevice> (manager.GetAllDiskDevices ());
         }
-        
+
         public void Test ()
         {
             Console.WriteLine ("All Block Devices:");
             PrintBlockDeviceList (GetAllBlockDevices ());
-            
+
             Console.WriteLine ("All CD-ROM Devices:");
             PrintBlockDeviceList (GetAllCdromDevices ());
-            
+
             Console.WriteLine ("All Disk Devices:");
             PrintBlockDeviceList (GetAllDiskDevices ());
         }
-        
+
         private void PrintBlockDeviceList (System.Collections.IEnumerable devices)
         {
             foreach (IBlockDevice device in devices) {
@@ -255,9 +255,9 @@ namespace Banshee.Hardware
                 }
             }
         }
-             
+
         string IService.ServiceName {
             get { return "HardwareManager"; }
-        } 
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/IDevice.cs b/src/Core/Banshee.Services/Banshee.Hardware/IDevice.cs
index 0fb4cc1..4c76bf5 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/IDevice.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/IDevice.cs
@@ -40,16 +40,16 @@ namespace Banshee.Hardware
         string Vendor { get; }
 
         IDeviceMediaCapabilities MediaCapabilities { get; }
-        
+
         bool PropertyExists (string key);
-        
+
         string GetPropertyString (string key);
         double GetPropertyDouble (string key);
         bool GetPropertyBoolean (string key);
         int GetPropertyInteger (string key);
         ulong GetPropertyUInt64 (string key);
         string [] GetPropertyStringList (string key);
-        
+
         IUsbDevice ResolveRootUsbDevice ();
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/IHardwareManager.cs b/src/Core/Banshee.Services/Banshee.Hardware/IHardwareManager.cs
index bf01ed4..e1c512c 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/IHardwareManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/IHardwareManager.cs
@@ -35,7 +35,7 @@ namespace Banshee.Hardware
     {
         event DeviceAddedHandler DeviceAdded;
         event DeviceRemovedHandler DeviceRemoved;
-    
+
         IEnumerable<IDevice> GetAllDevices ();
         IEnumerable<IBlockDevice> GetAllBlockDevices ();
         IEnumerable<ICdromDevice> GetAllCdromDevices ();
@@ -44,30 +44,30 @@ namespace Banshee.Hardware
 
     public delegate void DeviceAddedHandler (object o, DeviceAddedArgs args);
     public delegate void DeviceRemovedHandler (object o, DeviceRemovedArgs args);
-    
+
     public sealed class DeviceAddedArgs : EventArgs
     {
         private IDevice device;
-        
+
         public DeviceAddedArgs (IDevice device)
         {
             this.device = device;
         }
-        
+
         public IDevice Device {
             get { return device; }
         }
     }
-    
+
     public sealed class DeviceRemovedArgs : EventArgs
     {
         private string device_uuid;
-        
+
         public DeviceRemovedArgs (string deviceUuid)
         {
             this.device_uuid = deviceUuid;
         }
-        
+
         public string DeviceUuid {
             get { return device_uuid; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs b/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs
index c46f404..4020a49 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/IVolume.cs
@@ -41,10 +41,10 @@ namespace Banshee.Hardware
 
         bool ShouldIgnore { get; }
         string FileSystem { get; }
-        
+
         bool CanEject { get; }
         void Eject ();
-        
+
         bool CanUnmount { get; }
         void Unmount ();
     }
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/VendorProductDeviceNode.cs b/src/Core/Banshee.Services/Banshee.Hardware/VendorProductDeviceNode.cs
index 15afb8d..180d614 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/VendorProductDeviceNode.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/VendorProductDeviceNode.cs
@@ -41,32 +41,32 @@ namespace Banshee.Hardware
     {
         private short [] vendor_ids;
         private short [] product_ids;
-        
+
         private string vendor_name;
         public string VendorName {
             get { return vendor_name; }
         }
-        
+
         private string product_name;
         public string ProductName {
             get { return product_name; }
         }
-        
+
         public bool Matches (short vendorId, short productId)
         {
             return Match (vendor_ids, vendorId) && Match (product_ids, productId);
         }
-        
+
         protected override void Read (NodeElement elem)
         {
             base.Read (elem);
-            
+
             vendor_name = elem.GetAttribute ("vendor-name");
             product_name = elem.GetAttribute ("product-name");
             vendor_ids = ParseIds (elem.GetAttribute ("vendor-id"));
             product_ids = ParseIds (elem.GetAttribute ("product-id"));
-        }        
-        
+        }
+
         private static bool Match (short [] ids, short match)
         {
             for (int i = 0; i < ids.Length; i++) {
@@ -76,7 +76,7 @@ namespace Banshee.Hardware
             }
             return false;
         }
-        
+
         private static short [] ParseIds (string value)
         {
             string [] split = value.Split (',');
@@ -86,13 +86,13 @@ namespace Banshee.Hardware
             }
             return ids;
         }
-        
+
         private static short ParseId (string value)
         {
             // Parse as an integer, then typecast, to avoid overflow issues
             // with regards to the sign bit.
             int result = 0;
-            
+
             if (value.StartsWith ("0x")) {
                 Int32.TryParse (value.Substring (2), NumberStyles.HexNumber,
                     CultureInfo.InvariantCulture, out result);
@@ -100,7 +100,7 @@ namespace Banshee.Hardware
                 Int32.TryParse (value, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite,
                     CultureInfo.InvariantCulture, out result);
             }
-            
+
             return (short)result;
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.Hardware/VendorProductInfo.cs b/src/Core/Banshee.Services/Banshee.Hardware/VendorProductInfo.cs
index eb8e7e8..06e9e12 100644
--- a/src/Core/Banshee.Services/Banshee.Hardware/VendorProductInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Hardware/VendorProductInfo.cs
@@ -33,7 +33,7 @@ namespace Banshee.Hardware
     public struct VendorProductInfo
     {
         public static VendorProductInfo Zero;
-    
+
         public VendorProductInfo (string vendorName, string productName, int vendorProductId)
         {
             vendor_name = vendorName;
@@ -41,8 +41,8 @@ namespace Banshee.Hardware
             vendor_id = (short)(vendorProductId >> 16);
             product_id = (short)(vendorProductId & 0xffff);
         }
-    
-        public VendorProductInfo (string vendorName, string productName, 
+
+        public VendorProductInfo (string vendorName, string productName,
             short vendorId, short productId)
         {
             vendor_name = vendorName;
@@ -50,42 +50,42 @@ namespace Banshee.Hardware
             vendor_id = vendorId;
             product_id = productId;
         }
-        
+
         public override int GetHashCode()
         {
             return VendorProductId;
         }
-        
+
         public override string ToString()
         {
-            return String.Format ("{0}, {1}; Vendor ID = {2}, Product ID = {3} ({4})", 
+            return String.Format ("{0}, {1}; Vendor ID = {2}, Product ID = {3} ({4})",
                 VendorName, ProductName, VendorId, ProductId, VendorProductId);
         }
-        
+
         private string vendor_name;
         public string VendorName {
             get { return vendor_name; }
             set { vendor_name = value; }
         }
-        
+
         private string product_name;
         public string ProductName {
             get { return product_name; }
             set { product_name = value; }
         }
-    
+
         private short vendor_id;
         public short VendorId {
             get { return vendor_id; }
             set { vendor_id = value; }
         }
-        
+
         private short product_id;
         public short ProductId {
             get { return product_id; }
             set { product_id = value; }
-        }   
-        
+        }
+
         public int VendorProductId {
             get { return (int)(vendor_id << 16) | product_id; }
             set {
diff --git a/src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs b/src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs
index c0a89e0..c93ba97 100644
--- a/src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/HomeDirectoryImportSource.cs
@@ -43,19 +43,21 @@ namespace Banshee.Library
                 Environment.GetFolderPath (Environment.SpecialFolder.Personal)
             );
         }
-        
+
         public string Name {
-            get { return Catalog.GetString ("Home Directory"); }
+            get { return Catalog.GetString ("Home Folder"); }
         }
-        
+
+        public string ImportLabel { get { return null; } }
+
         public string [] IconNames {
             get { return new string [] { "user-home", "gtk-home" }; }
         }
-        
+
         public bool CanImport {
             get { return true; }
         }
-        
+
         public int SortOrder {
             get { return 10; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/IImportSource.cs b/src/Core/Banshee.Services/Banshee.Library/IImportSource.cs
index bef7eaa..dfec9f4 100644
--- a/src/Core/Banshee.Services/Banshee.Library/IImportSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/IImportSource.cs
@@ -34,6 +34,7 @@ namespace Banshee.Library
     {
         void Import ();
         string Name { get; }
+        string ImportLabel { get; }
         string [] IconNames { get; }
         bool CanImport { get; }
         int SortOrder { get; }
diff --git a/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs b/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs
index 8761f6d..029d086 100644
--- a/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ImportSourceManager.cs
 //
 // Author:
@@ -42,7 +42,7 @@ namespace Banshee.Library
         public ImportSourceManager ()
         {
         }
-        
+
         public IEnumerator<IImportSource> GetEnumerator ()
         {
             List<IImportSource> import_sources = new List<IImportSource> ();
@@ -53,15 +53,15 @@ namespace Banshee.Library
                     import_sources.Add (source);
                 }
             }
-            
+
             return import_sources.GetEnumerator ();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         string IService.ServiceName {
             get { return "ImportSourceManager"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs b/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
index 89d6878..d308982 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
@@ -1,4 +1,4 @@
-// 
+//
 // LibraryImportManager.cs
 //
 // Authors:
@@ -64,11 +64,11 @@ namespace Banshee.Library
             get {
                 if (base.PrimarySourceIds == null) {
                     base.PrimarySourceIds = new int [] {
-                        ServiceManager.SourceManager.VideoLibrary.DbId, 
+                        ServiceManager.SourceManager.VideoLibrary.DbId,
                         ServiceManager.SourceManager.MusicLibrary.DbId
                     };
                 }
-                
+
                 return base.PrimarySourceIds;
             }
         }
@@ -85,7 +85,7 @@ namespace Banshee.Library
                 return ServiceManager.SourceManager.MusicLibrary;
             }
         }
-        
+
         string IService.ServiceName {
             get { return "LibraryImportManager"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
index 31d41b1..ad713e1 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
@@ -59,8 +59,8 @@ namespace Banshee.Library
             IsLocal = true;
             base_dir_schema = CreateSchema<string> ("library-location", null, "The base directory under which files for this library are stored", null);
             AfterInitialized ();
-            
-            Section library_section = PreferencesPage.Add (new Section ("library-location", 
+
+            Section library_section = PreferencesPage.Add (new Section ("library-location",
                 // Translators: {0} is the library name, eg 'Music Library' or 'Podcasts'
                 String.Format (Catalog.GetString ("{0} Folder"), Name), 2));
 
@@ -106,9 +106,9 @@ namespace Banshee.Library
                 base.BaseDirectory = value;
             }
         }
-        
+
         public abstract string DefaultBaseDirectory { get; }
-        
+
         public override bool Indexable {
             get { return true; }
         }
@@ -125,7 +125,7 @@ namespace Banshee.Library
             } catch (System.IO.FileNotFoundException) {
             } catch (System.IO.DirectoryNotFoundException) {
             }
-            
+
             return true;
         }
 
diff --git a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
index 35ce580..7eb8f3c 100644
--- a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
@@ -48,7 +48,7 @@ namespace Banshee.Library
             MediaTypes = TrackMediaAttributes.Music | TrackMediaAttributes.AudioStream;
             NotMediaTypes = TrackMediaAttributes.Podcast | TrackMediaAttributes.VideoStream | TrackMediaAttributes.AudioBook;
             Properties.SetStringList ("Icon.Name", "audio-x-generic", "source-library");
-            
+
             // Migrate the old library-location schema, if necessary
             if (DatabaseConfigurationClient.Client.Get<int> ("MusicLibraryLocationMigrated", 0) != 1) {
                 string old_location = OldLocationSchema.Get ();
@@ -58,13 +58,13 @@ namespace Banshee.Library
                 DatabaseConfigurationClient.Client.Set<int> ("MusicLibraryLocationMigrated", 1);
             }
 
-            Section file_system = PreferencesPage.Add (new Section ("file-system", 
+            Section file_system = PreferencesPage.Add (new Section ("file-system",
                 Catalog.GetString ("File System Organization"), 5));
 
-            file_system.Add (new SchemaPreference<string> (LibrarySchema.FolderPattern, 
+            file_system.Add (new SchemaPreference<string> (LibrarySchema.FolderPattern,
                 Catalog.GetString ("Folder hie_rarchy")));
-            
-            file_system.Add (new SchemaPreference<string> (LibrarySchema.FilePattern,     
+
+            file_system.Add (new SchemaPreference<string> (LibrarySchema.FilePattern,
                 Catalog.GetString ("File _name")));
 
             PreferencesPage.Add (new Section ("misc", Catalog.GetString ("Miscellaneous"), 10));
@@ -74,7 +74,7 @@ namespace Banshee.Library
         {
             return Banshee.Base.Paths.GetXdgDirectoryUnderHome ("XDG_MUSIC_DIR", "Music");
         }
-        
+
         public override string DefaultBaseDirectory {
             get { return GetDefaultBaseDirectory (); }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs b/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs
index bc085f1..8047be7 100644
--- a/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs
@@ -45,14 +45,14 @@ namespace Banshee.Library
         private bool importing;
         private UserJob user_job;
         private readonly object user_job_mutex = new object ();
-        
+
         private void CreateUserJob ()
         {
             lock (user_job_mutex) {
                 if(user_job != null) {
                     return;
                 }
-                
+
                 user_job = new UserJob (UserJobTitle, UserJobTitle, Catalog.GetString ("Importing Songs"));
                 user_job.SetResources (Resource.Cpu, Resource.Disk, Resource.Database);
                 user_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
@@ -62,19 +62,19 @@ namespace Banshee.Library
                 user_job.Register ();
             }
         }
-        
+
         private void DestroyUserJob ()
         {
             lock(user_job_mutex) {
                 if(user_job == null) {
                     return;
                 }
-                
+
                 user_job.Finish ();
                 user_job = null;
             }
         }
-        
+
         protected void UpdateUserJob (int processed, int count, string artist, string title)
         {
             user_job.Title = String.Format(
@@ -83,7 +83,7 @@ namespace Banshee.Library
             user_job.Status = String.Format("{0} - {1}", artist, title);
             user_job.Progress = processed / (double)count;
         }
-        
+
         protected void LogError (string path, Exception e)
         {
             LogError (path, e.Message);
@@ -94,18 +94,18 @@ namespace Banshee.Library
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 ErrorSource error_source = ServiceManager.SourceManager.MusicLibrary.ErrorSource;
                 error_source.AddMessage (path, msg);
-    
+
                 Log.Error (path, msg, false);
             });
         }
-        
+
         protected bool CheckForCanceled ()
         {
             lock(user_job_mutex) {
                 return user_job != null && user_job.IsCancelRequested;
             }
         }
-        
+
         private string user_job_title;
         protected virtual string UserJobTitle {
             get {
@@ -115,22 +115,24 @@ namespace Banshee.Library
                 return user_job_title;
             }
         }
-        
+
         private string cancel_message = Catalog.GetString ("The import process is currently running. Would you like to stop it?");
         protected virtual string CancelMessage {
             get { return cancel_message; }
         }
-    
+
         protected virtual bool CanCancel {
             get { return true; }
         }
-        
+
 #region IImportSource
-        
+
         public abstract string Name { get; }
 
+        public virtual string ImportLabel { get { return null; } }
+
         public abstract string[] IconNames { get; }
-        
+
         public abstract int SortOrder { get; }
 
         public virtual bool CanImport {
@@ -139,25 +141,30 @@ namespace Banshee.Library
 
         public void Import ()
         {
-            if (importing) {
+            if (importing || !ConfirmImport ()) {
                 return;
             }
-            
+
             importing = true;
             CreateUserJob ();
             ThreadPool.QueueUserWorkItem (ImportCore);
             importing = false;
         }
-        
+
 #endregion
-        
+
         private void ImportCore (object o)
         {
             ImportCore ();
             DestroyUserJob ();
         }
-        
+
+        protected virtual bool ConfirmImport ()
+        {
+            return true;
+        }
+
         protected abstract void ImportCore ();
-        
+
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
index 467b40e..7a6ebdd 100644
--- a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
@@ -67,11 +67,11 @@ namespace Banshee.Library
         public override bool ShowBrowser {
             get { return false; }
         }
-        
+
         protected override bool HasArtistAlbum {
             get { return false; }
         }
-        
+
         public override string DefaultBaseDirectory {
             get { return Banshee.Base.Paths.GetXdgDirectoryUnderHome ("XDG_VIDEOS_DIR", "Videos"); }
         }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IAudioCdRipper.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IAudioCdRipper.cs
index e317616..8feb756 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IAudioCdRipper.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IAudioCdRipper.cs
@@ -36,20 +36,20 @@ namespace Banshee.MediaEngine
     public delegate void AudioCdRipperProgressHandler (object o, AudioCdRipperProgressArgs args);
     public delegate void AudioCdRipperTrackFinishedHandler (object o, AudioCdRipperTrackFinishedArgs args);
     public delegate void AudioCdRipperErrorHandler (object o, AudioCdRipperErrorArgs args);
- 
+
     public interface IAudioCdRipper
     {
         event AudioCdRipperProgressHandler Progress;
         event AudioCdRipperTrackFinishedHandler TrackFinished;
         event AudioCdRipperErrorHandler Error;
-        
+
         void Begin (string device, bool enableErrorCorrection);
         void Finish ();
         void Cancel ();
-        
+
         void RipTrack (int trackIndex, TrackInfo track, SafeUri outputUri, out bool taggingSupported);
     }
-                             
+
     public sealed class AudioCdRipperProgressArgs : EventArgs
     {
         public AudioCdRipperProgressArgs (TrackInfo track, TimeSpan encodedTime, TimeSpan totalTime)
@@ -58,7 +58,7 @@ namespace Banshee.MediaEngine
             this.encoded_time = encodedTime;
             this.total_time = totalTime;
         }
-        
+
         private TimeSpan encoded_time;
         public TimeSpan EncodedTime {
             get { return encoded_time; }
@@ -87,13 +87,13 @@ namespace Banshee.MediaEngine
         public TrackInfo Track {
             get { return track; }
         }
-        
+
         private SafeUri uri;
         public SafeUri Uri {
             get { return uri; }
         }
     }
-    
+
     public sealed class AudioCdRipperErrorArgs : EventArgs
     {
         public AudioCdRipperErrorArgs (TrackInfo track, string message)
@@ -101,12 +101,12 @@ namespace Banshee.MediaEngine
             this.track = track;
             this.message = message;
         }
-        
+
         private TrackInfo track;
         public TrackInfo Track {
             get { return track; }
         }
-        
+
         private string message;
         public string Message {
             get { return message; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IBpmDetector.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IBpmDetector.cs
index 888a4ab..a5aabfc 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IBpmDetector.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IBpmDetector.cs
@@ -35,7 +35,7 @@ using Banshee.Collection;
 namespace Banshee.MediaEngine
 {
     public delegate void BpmEventHandler (object o, BpmEventArgs args);
-    
+
     public class BpmEventArgs : EventArgs
     {
         public SafeUri Uri { get; private set; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IEqualizer.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IEqualizer.cs
index 4d01bc4..3ca8ca8 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IEqualizer.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IEqualizer.cs
@@ -37,25 +37,25 @@ namespace Banshee.MediaEngine
         /// Sets the gain of an equalizer band.
         /// </summary>
         void SetEqualizerGain (uint band, double value);
-        
+
         /// <summary>
         /// Whether or not the engine supports the equalizer.
         /// </summary>
         bool SupportsEqualizer {
             get;
         }
-        
+
         double AmplifierLevel {
             set;
         }
-        
+
         /// <summary>
         /// Minimum and maximum dB values for equalizer bands.
         /// </summary>
         int [] BandRange {
             get;
         }
-        
+
         uint [] EqualizerFrequencies {
             get;
         }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
index f0feccc..62dab5e 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IPlayerEngineService.cs
 //
 // Author:
@@ -39,20 +39,20 @@ namespace Banshee.MediaEngine
     {
         event DBusPlayerEventHandler EventChanged;
         event DBusPlayerStateHandler StateChanged;
-    
+
         void Open (string uri);
-        
+
         void Close ();
         void Pause ();
         void Play ();
         void TogglePlaying ();
-        
+
         IDictionary<string, object> CurrentTrack { get; }
         string CurrentUri { get; }
-        
+
         string CurrentState { get; }
         string LastState { get; }
-    
+
         ushort Volume { get; set; }
         uint Position { get; set; }
         bool CanSeek { get; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/ITranscoder.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/ITranscoder.cs
index b108de9..17f19de 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/ITranscoder.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/ITranscoder.cs
@@ -37,18 +37,18 @@ namespace Banshee.MediaEngine
     public delegate void TranscoderProgressHandler (object o, TranscoderProgressArgs args);
     public delegate void TranscoderTrackFinishedHandler (object o, TranscoderTrackFinishedArgs args);
     public delegate void TranscoderErrorHandler (object o, TranscoderErrorArgs args);
- 
+
     public interface ITranscoder
     {
         event TranscoderProgressHandler Progress;
         event TranscoderTrackFinishedHandler TrackFinished;
         event TranscoderErrorHandler Error;
-        
+
         void TranscodeTrack (TrackInfo track, SafeUri outputUri, ProfileConfiguration config);
         void Finish ();
         void Cancel ();
     }
-                             
+
     public sealed class TranscoderProgressArgs : EventArgs
     {
         public TranscoderProgressArgs (TrackInfo track, double fraction, TimeSpan totalTime)
@@ -57,7 +57,7 @@ namespace Banshee.MediaEngine
             this.fraction = fraction;
             this.total_time = totalTime;
         }
-        
+
         private double fraction;
         public double Fraction {
             get { return fraction; }
@@ -86,13 +86,13 @@ namespace Banshee.MediaEngine
         public TrackInfo Track {
             get { return track; }
         }
-        
+
         private SafeUri uri;
         public SafeUri Uri {
             get { return uri; }
         }
     }
-    
+
     public sealed class TranscoderErrorArgs : EventArgs
     {
         public TranscoderErrorArgs (TrackInfo track, string message)
@@ -100,12 +100,12 @@ namespace Banshee.MediaEngine
             this.track = track;
             this.message = message;
         }
-        
+
         private TrackInfo track;
         public TrackInfo Track {
             get { return track; }
         }
-        
+
         private string message;
         public string Message {
             get { return message; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs
index 0a40f9d..5f9f4c3 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs
@@ -30,7 +30,7 @@ using System;
 namespace Banshee.MediaEngine
 {
     public delegate void VisualizationDataHandler (float [][] pcm, float [][] spectrum);
-    
+
     public interface IVisualizationDataSource
     {
         event VisualizationDataHandler DataAvailable;
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
index d8c04fd..a437ade 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/NullPlayerEngine.cs
@@ -38,7 +38,7 @@ namespace Banshee.MediaEngine
         protected override void OpenUri (SafeUri uri)
         {
         }
-        
+
         public override void Play ()
         {
             OnStateChanged (PlayerState.Playing);
@@ -48,50 +48,50 @@ namespace Banshee.MediaEngine
         {
             OnStateChanged (PlayerState.Paused);
         }
-        
+
         private ushort volume;
         public override ushort Volume {
             get { return volume; }
             set { volume = value; }
         }
-        
+
         public override uint Position {
             get { return 0; }
             set { return; }
         }
-        
+
         public override bool CanSeek {
             get { return false; }
         }
-        
+
         public override uint Length {
             get { return 0; }
         }
-        
+
         public override bool SupportsEqualizer {
             get { return false; }
         }
-        
+
         public override VideoDisplayContextType VideoDisplayContextType {
             get { return VideoDisplayContextType.Unsupported; }
         }
-        
+
         private static string [] source_capabilities = { "file", "http", "cdda" };
         public override IEnumerable SourceCapabilities {
             get { return source_capabilities; }
         }
-        
+
         public override IEnumerable ExplicitDecoderCapabilities {
             get { return new string[0]; }
         }
-        
+
         public override string Id {
             get { return "nullplayerengine"; }
         }
-        
+
         public override string Name {
             get { return "Null Player Engine"; }
         }
-        
+
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index 1f7a1ec..b074d2b 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -42,17 +42,17 @@ namespace Banshee.MediaEngine
     {
         public const int VolumeDelta = 10;
         public const int SkipDelta = 10;
-    
+
         public event PlayerEventHandler EventChanged;
-        
+
         private TrackInfo current_track;
         private SafeUri current_uri;
         private PlayerState current_state = PlayerState.NotReady;
         private PlayerState last_state = PlayerState.NotReady;
-        
+
         // will be changed to PlayerState.Idle after going to PlayerState.Ready
-        private PlayerState idle_state = PlayerState.NotReady; 
-        
+        private PlayerState idle_state = PlayerState.NotReady;
+
         protected abstract void OpenUri (SafeUri uri);
 
         internal protected virtual bool DelayedInitialize {
@@ -71,30 +71,30 @@ namespace Banshee.MediaEngine
             current_uri = null;
             OnStateChanged (idle_state);
         }
-        
+
         public virtual void Close (bool fullShutdown)
         {
             OnStateChanged (idle_state);
         }
-        
+
         public virtual void Dispose ()
         {
             Close (true);
         }
-        
+
         public void Open (TrackInfo track)
         {
             current_uri = track.Uri;
             current_track = track;
-            
+
             HandleOpen (track.Uri);
         }
-        
+
         public void Open (SafeUri uri)
         {
             current_uri = uri;
             current_track = new UnknownTrackInfo (uri);
-            
+
             HandleOpen (uri);
         }
 
@@ -103,7 +103,7 @@ namespace Banshee.MediaEngine
             if (current_state != PlayerState.Idle && current_state != PlayerState.NotReady && current_state != PlayerState.Contacting) {
                 Close (false);
             }
-        
+
             try {
                 OnStateChanged (PlayerState.Loading);
                 OpenUri (uri);
@@ -112,7 +112,7 @@ namespace Banshee.MediaEngine
                 OnEventChanged (new PlayerEventErrorArgs (e.Message));
             }
         }
-        
+
         public abstract void Play ();
 
         public abstract void Pause ();
@@ -121,46 +121,46 @@ namespace Banshee.MediaEngine
         {
             throw new NotImplementedException ("Engine must implement VideoExpose since this method only gets called when SupportsVideo is true");
         }
-        
+
         public virtual IntPtr [] GetBaseElements ()
         {
             return null;
         }
-        
+
         protected virtual void OnStateChanged (PlayerState state)
         {
             if (current_state == state) {
                 return;
             }
-            
+
             if (idle_state == PlayerState.NotReady && state != PlayerState.Ready) {
                 Hyena.Log.Warning ("Engine must transition to the ready state before other states can be entered", false);
                 return;
             } else if (idle_state == PlayerState.NotReady && state == PlayerState.Ready) {
                 idle_state = PlayerState.Idle;
             }
-            
+
             last_state = current_state;
             current_state = state;
-            
+
             Log.DebugFormat ("Player state change: {0} -> {1}", last_state, current_state);
-            
+
             OnEventChanged (new PlayerEventStateChangeArgs (last_state, current_state));
-            
+
             // Going to the Ready state automatically transitions to the Idle state
             // The Ready state is advertised so one-time startup processes can easily
             // happen outside of the engine itself
-            
+
             if (state == PlayerState.Ready) {
                 OnStateChanged (PlayerState.Idle);
             }
         }
-        
+
         protected void OnEventChanged (PlayerEvent evnt)
         {
             OnEventChanged (new PlayerEventArgs (evnt));
         }
-        
+
         protected virtual void OnEventChanged (PlayerEventArgs args)
         {
             if (ThreadAssist.InMainThread) {
@@ -171,7 +171,7 @@ namespace Banshee.MediaEngine
                 });
             }
         }
-        
+
         private void RaiseEventChanged (PlayerEventArgs args)
         {
             PlayerEventHandler handler = EventChanged;
@@ -179,9 +179,9 @@ namespace Banshee.MediaEngine
                 handler (args);
             }
         }
-        
+
         private uint track_info_updated_timeout = 0;
-        
+
         protected void OnTagFound (StreamTag tag)
         {
             if (tag.Equals (StreamTag.Zero) || current_track == null || current_track.Uri.IsFile) {
@@ -189,82 +189,82 @@ namespace Banshee.MediaEngine
             }
 
             StreamTagger.TrackInfoMerge (current_track, tag);
-            
+
             if (track_info_updated_timeout <= 0) {
                 track_info_updated_timeout = Application.RunTimeout (250, OnTrackInfoUpdated);
             }
         }
-        
+
         private bool OnTrackInfoUpdated ()
         {
             TrackInfoUpdated ();
             track_info_updated_timeout = 0;
             return false;
         }
-        
+
         public void TrackInfoUpdated ()
         {
             OnEventChanged (PlayerEvent.TrackInfoUpdated);
         }
-        
+
         public TrackInfo CurrentTrack {
             get { return current_track; }
         }
-        
+
         public SafeUri CurrentUri {
             get { return current_uri; }
         }
-        
+
         public PlayerState CurrentState {
             get { return current_state; }
         }
-        
+
         public PlayerState LastState {
             get { return last_state; }
         }
-        
+
         public abstract ushort Volume {
             get;
             set;
         }
-        
+
         public virtual bool CanSeek {
             get { return true; }
         }
-        
+
         public abstract uint Position {
             get;
             set;
         }
-        
+
         public abstract uint Length {
             get;
         }
-        
+
         public abstract IEnumerable SourceCapabilities {
             get;
         }
-        
+
         public abstract IEnumerable ExplicitDecoderCapabilities {
             get;
         }
-        
+
         public abstract string Id {
             get;
         }
-        
+
         public abstract string Name {
             get;
         }
-        
+
         public abstract bool SupportsEqualizer {
             get;
         }
-        
+
         public abstract VideoDisplayContextType VideoDisplayContextType {
             get;
         }
-        
+
         public virtual IntPtr VideoDisplayContext {
             set { }
             get { return IntPtr.Zero; }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index 87af023..2ad3f74 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -47,9 +47,9 @@ namespace Banshee.MediaEngine
 {
     public delegate bool TrackInterceptHandler (TrackInfo track);
 
-    public class PlayerEngineService : IInitializeService, IDelayedInitializeService, 
+    public class PlayerEngineService : IInitializeService, IDelayedInitializeService,
         IRequiredService, IPlayerEngineService, IDisposable
-    {   
+    {
         private List<PlayerEngine> engines = new List<PlayerEngine> ();
         private PlayerEngine active_engine;
         private PlayerEngine default_engine;
@@ -64,7 +64,7 @@ namespace Banshee.MediaEngine
         public event TrackInterceptHandler TrackIntercept;
         public event Action<PlayerEngine> EngineBeforeInitialize;
         public event Action<PlayerEngine> EngineAfterInitialize;
-        
+
         private event DBusPlayerEventHandler dbus_event_changed;
         event DBusPlayerEventHandler IPlayerEngineService.EventChanged {
             add { dbus_event_changed += value; }
@@ -76,30 +76,30 @@ namespace Banshee.MediaEngine
             add { dbus_state_changed += value; }
             remove { dbus_state_changed -= value; }
         }
-        
+
         public PlayerEngineService ()
         {
         }
-        
+
         void IInitializeService.Initialize ()
         {
             preferred_engine_id = EngineSchema.Get();
-            
+
             if (default_engine == null && engines.Count > 0) {
                 default_engine = engines[0];
             }
-            
+
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/MediaEngine/PlayerEngine")) {
                 LoadEngine (node);
             }
-            
+
             if (default_engine != null) {
                 active_engine = default_engine;
                 Log.Debug (Catalog.GetString ("Default player engine"), active_engine.Name);
             } else {
                 default_engine = active_engine;
             }
-            
+
             if (default_engine == null || active_engine == null || engines == null || engines.Count == 0) {
                 Log.Warning (Catalog.GetString (
                     "No player engines were found. Please ensure Banshee has been cleanly installed."),
@@ -109,9 +109,9 @@ namespace Banshee.MediaEngine
                 active_engine = null_engine;
                 default_engine = null_engine;
             }
-            
+
             MetadataService.Instance.HaveResult += OnMetadataServiceHaveResult;
-            
+
             TrackInfo.IsPlayingMethod = track => IsPlaying (track) &&
                 track.CacheModelId == CurrentTrack.CacheModelId &&
                 (track.CacheEntryId == null || track.CacheEntryId.Equals (CurrentTrack.CacheEntryId));
@@ -123,16 +123,16 @@ namespace Banshee.MediaEngine
             if (handler != null) {
                 handler (engine);
             }
-            
+
             engine.Initialize ();
             engine.IsInitialized = true;
-            
+
             handler = EngineAfterInitialize;
             if (handler != null) {
                 handler (engine);
             }
         }
-        
+
         void IDelayedInitializeService.DelayedInitialize ()
         {
             foreach (var engine in Engines) {
@@ -141,18 +141,18 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         private void LoadEngine (TypeExtensionNode node)
         {
             LoadEngine ((PlayerEngine) node.CreateInstance (typeof (PlayerEngine)));
         }
-        
+
         private void LoadEngine (PlayerEngine engine)
         {
             if (!engine.DelayedInitialize) {
                 InitializeEngine (engine);
             }
-            
+
             engine.EventChanged += OnEngineEventChanged;
 
             if (engine.Id == preferred_engine_id) {
@@ -168,31 +168,31 @@ namespace Banshee.MediaEngine
         public void Dispose ()
         {
             MetadataService.Instance.HaveResult -= OnMetadataServiceHaveResult;
-            
+
             foreach (PlayerEngine engine in engines) {
                 engine.Dispose ();
             }
-            
+
             active_engine = null;
             default_engine = null;
             pending_engine = null;
-            
+
             preferred_engine_id = null;
-            
+
             engines.Clear ();
         }
-        
+
         private void OnMetadataServiceHaveResult (object o, MetadataLookupResultArgs args)
         {
             if (CurrentTrack != null && args.Track == CurrentTrack) {
                 foreach (StreamTag tag in args.ResultTags) {
                     StreamTagger.TrackInfoMerge (CurrentTrack, tag);
                 }
-                
+
                 OnEngineEventChanged (new PlayerEventArgs (PlayerEvent.TrackInfoUpdated));
             }
         }
-        
+
         private void HandleStateChange (PlayerEventStateChangeArgs args)
         {
             if (args.Current == PlayerState.Loaded && CurrentTrack != null) {
@@ -213,7 +213,7 @@ namespace Banshee.MediaEngine
                                 break;
                             }
                         }
-                        
+
                         if (equalizer != null) {
                             Log.DebugFormat ("Enabling equalizer preset: {0}", equalizer.Name);
                             manager.Enable (equalizer);
@@ -227,7 +227,7 @@ namespace Banshee.MediaEngine
                     pending_playback_for_not_ready_play = false;
                 }
             }
-            
+
             DBusPlayerStateHandler dbus_handler = dbus_state_changed;
             if (dbus_handler != null) {
                 dbus_handler (args.Current.ToString ().ToLower ());
@@ -237,33 +237,33 @@ namespace Banshee.MediaEngine
         private void OnEngineEventChanged (PlayerEventArgs args)
         {
             if (CurrentTrack != null) {
-                if (args.Event == PlayerEvent.Error 
+                if (args.Event == PlayerEvent.Error
                     && CurrentTrack.PlaybackError == StreamPlaybackError.None) {
                     CurrentTrack.SavePlaybackError (StreamPlaybackError.Unknown);
-                } else if (args.Event == PlayerEvent.Iterate 
+                } else if (args.Event == PlayerEvent.Iterate
                     && CurrentTrack.PlaybackError != StreamPlaybackError.None) {
                     CurrentTrack.SavePlaybackError (StreamPlaybackError.None);
                 }
             }
-            
+
             RaiseEvent (args);
-            
+
             // Do not raise iterate across DBus to avoid so many calls;
-            // DBus clients should do their own iterating and 
+            // DBus clients should do their own iterating and
             // event/state checking locally
             if (args.Event == PlayerEvent.Iterate) {
                 return;
             }
-            
+
             DBusPlayerEventHandler dbus_handler = dbus_event_changed;
             if (dbus_handler != null) {
-                dbus_handler (args.Event.ToString ().ToLower (), 
-                    args is PlayerEventErrorArgs ? ((PlayerEventErrorArgs)args).Message : String.Empty, 
+                dbus_handler (args.Event.ToString ().ToLower (),
+                    args is PlayerEventErrorArgs ? ((PlayerEventErrorArgs)args).Message : String.Empty,
                     args is PlayerEventBufferingArgs ? ((PlayerEventBufferingArgs)args).Progress : 0
                 );
             }
         }
-        
+
         private void OnPlayWhenIdleRequest ()
         {
             EventHandler handler = PlayWhenIdleRequest;
@@ -271,49 +271,49 @@ namespace Banshee.MediaEngine
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         private bool OnTrackIntercept (TrackInfo track)
         {
             TrackInterceptHandler handler = TrackIntercept;
             if (handler == null) {
                 return false;
             }
-            
+
             bool handled = false;
-            
+
             foreach (TrackInterceptHandler single_handler in handler.GetInvocationList ()) {
                 handled |= single_handler (track);
             }
-            
+
             return handled;
         }
-        
+
         public void Open (TrackInfo track)
         {
             OpenPlay (track, false);
         }
-        
+
         public void Open (SafeUri uri)
         {
             OpenCheck (uri);
         }
-        
+
         void IPlayerEngineService.Open (string uri)
         {
             OpenCheck (new SafeUri (uri));
         }
-        
+
         public void OpenPlay (TrackInfo track)
         {
             OpenPlay (track, true);
         }
-        
+
         private void OpenPlay (TrackInfo track, bool play)
         {
             if (track == null || !track.CanPlay || OnTrackIntercept (track)) {
                 return;
             }
-        
+
             try {
                 OpenCheck (track, true);
             } catch (Exception e) {
@@ -328,7 +328,7 @@ namespace Banshee.MediaEngine
         {
             OpenCheck (o, false);
         }
-        
+
         private void OpenCheck (object o, bool play)
         {
             if (CurrentState == PlayerState.NotReady) {
@@ -336,10 +336,10 @@ namespace Banshee.MediaEngine
                 pending_playback_for_not_ready_play = play;
                 return;
             }
-        
+
             SafeUri uri = null;
             TrackInfo track = null;
-        
+
             if (o is SafeUri) {
                 uri = (SafeUri)o;
             } else if (o is TrackInfo) {
@@ -350,10 +350,10 @@ namespace Banshee.MediaEngine
             }
 
             IncrementLastPlayed ();
-            
+
             FindSupportingEngine (uri);
             CheckPending ();
-            
+
             if (track != null) {
                 active_engine.Open (track);
                 incremented_last_played = false;
@@ -380,7 +380,7 @@ namespace Banshee.MediaEngine
                 incremented_last_played = true;
             }
         }
-        
+
         private void FindSupportingEngine (SafeUri uri)
         {
             foreach (PlayerEngine engine in engines) {
@@ -395,7 +395,7 @@ namespace Banshee.MediaEngine
                     return;
                 }
             }
-        
+
             foreach (PlayerEngine engine in engines) {
                 foreach (string scheme in engine.SourceCapabilities) {
                     bool supported = scheme == uri.Scheme;
@@ -410,19 +410,19 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         public void Close ()
         {
             Close (false);
         }
-        
+
         public void Close (bool fullShutdown)
         {
             IncrementLastPlayed ();
             active_engine.Reset ();
             active_engine.Close (fullShutdown);
         }
-        
+
         public void Play ()
         {
             if (CurrentState == PlayerState.Idle) {
@@ -431,7 +431,7 @@ namespace Banshee.MediaEngine
                 active_engine.Play ();
             }
         }
-        
+
         public void Pause ()
         {
             if (!CanPause) {
@@ -460,7 +460,7 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         public void TogglePlaying ()
         {
             if (IsPlaying () && CurrentState != PlayerState.Paused) {
@@ -469,31 +469,31 @@ namespace Banshee.MediaEngine
                 Play ();
             }
         }
-        
+
         public void VideoExpose (IntPtr displayContext, bool direct)
         {
             active_engine.VideoExpose (displayContext, direct);
         }
-        
+
         public IntPtr VideoDisplayContext {
             set { active_engine.VideoDisplayContext = value; }
             get { return active_engine.VideoDisplayContext; }
         }
-        
+
         public void TrackInfoUpdated ()
         {
             active_engine.TrackInfoUpdated ();
         }
-        
+
         public bool IsPlaying (TrackInfo track)
         {
             return IsPlaying () && track != null && track.TrackEqual (CurrentTrack);
         }
-        
+
         public bool IsPlaying ()
         {
-            return CurrentState == PlayerState.Playing || 
-                CurrentState == PlayerState.Paused || 
+            return CurrentState == PlayerState.Playing ||
+                CurrentState == PlayerState.Paused ||
                 CurrentState == PlayerState.Loaded ||
                 CurrentState == PlayerState.Loading ||
                 CurrentState == PlayerState.Contacting;
@@ -505,136 +505,136 @@ namespace Banshee.MediaEngine
                 if(active_engine.CurrentState == PlayerState.Idle) {
                     Close ();
                 }
-                
+
                 active_engine = pending_engine;
                 pending_engine = null;
-            } 
+            }
         }
-    
+
         public TrackInfo CurrentTrack {
             get { return active_engine.CurrentTrack ?? synthesized_contacting_track; }
         }
-        
+
         private Dictionary<string, object> dbus_sucks;
         IDictionary<string, object> IPlayerEngineService.CurrentTrack {
-            get { 
+            get {
                 // FIXME: Managed DBus sucks - it explodes if you transport null
                 // or even an empty dictionary (a{sv} in our case). Piece of shit.
                 if (dbus_sucks == null) {
                     dbus_sucks = new Dictionary<string, object> ();
                     dbus_sucks.Add (String.Empty, String.Empty);
                 }
-                
+
                 return CurrentTrack == null ? dbus_sucks : CurrentTrack.GenerateExportable ();
             }
         }
-        
+
         public SafeUri CurrentSafeUri {
             get { return active_engine.CurrentUri; }
         }
-        
+
         string IPlayerEngineService.CurrentUri {
             get { return CurrentSafeUri == null ? String.Empty : CurrentSafeUri.AbsoluteUri; }
         }
-        
+
         public PlayerState CurrentState {
             get { return synthesized_contacting_track != null ? PlayerState.Contacting : active_engine.CurrentState; }
         }
-        
+
         string IPlayerEngineService.CurrentState {
             get { return CurrentState.ToString ().ToLower (); }
         }
-        
+
         public PlayerState LastState {
             get { return active_engine.LastState; }
         }
-        
+
         string IPlayerEngineService.LastState {
             get { return LastState.ToString ().ToLower (); }
         }
-        
+
         public ushort Volume {
             get { return active_engine.Volume; }
-            set { 
+            set {
                 foreach (PlayerEngine engine in engines) {
                     engine.Volume = value;
                 }
             }
         }
-        
+
         public uint Position {
             get { return active_engine.Position; }
             set { active_engine.Position = value; }
         }
-        
+
         public bool CanSeek {
             get { return active_engine.CanSeek; }
         }
-        
+
         public bool CanPause {
             get { return CurrentTrack != null && !CurrentTrack.IsLive; }
         }
-        
+
         public bool SupportsEqualizer {
             get { return ((active_engine is IEqualizer) && active_engine.SupportsEqualizer); }
         }
-        
+
         public VideoDisplayContextType VideoDisplayContextType {
             get { return active_engine.VideoDisplayContextType; }
         }
-        
+
         public uint Length {
-            get { 
+            get {
                 uint length = active_engine.Length;
                 if (length > 0) {
                     return length;
                 } else if (CurrentTrack == null) {
                     return 0;
                 }
-                
+
                 return (uint) CurrentTrack.Duration.TotalSeconds;
             }
         }
-    
+
         public PlayerEngine ActiveEngine {
             get { return active_engine; }
             set { pending_engine = value; }
         }
-        
+
         public PlayerEngine DefaultEngine {
             get { return default_engine; }
-            set { 
+            set {
                 if (engines.Contains (value)) {
                     engines.Remove (value);
                 }
-                
+
                 engines.Insert (0, value);
-            
+
                 default_engine = value;
                 EngineSchema.Set (value.Id);
             }
         }
-        
+
         public IEnumerable<PlayerEngine> Engines {
             get { return engines; }
         }
-        
+
 #region Player Event System
 
         private LinkedList<PlayerEventHandlerSlot> event_handlers = new LinkedList<PlayerEventHandlerSlot> ();
-        
+
         private struct PlayerEventHandlerSlot
         {
             public PlayerEvent EventMask;
             public PlayerEventHandler Handler;
-            
+
             public PlayerEventHandlerSlot (PlayerEvent mask, PlayerEventHandler handler)
             {
                 EventMask = mask;
                 Handler = handler;
             }
         }
-        
+
         private const PlayerEvent event_all_mask = PlayerEvent.Iterate
             | PlayerEvent.StateChange
             | PlayerEvent.StartOfStream
@@ -645,38 +645,38 @@ namespace Banshee.MediaEngine
             | PlayerEvent.Volume
             | PlayerEvent.Metadata
             | PlayerEvent.TrackInfoUpdated;
-        
+
         private const PlayerEvent event_default_mask = event_all_mask & ~PlayerEvent.Iterate;
-        
+
         private static void VerifyEventMask (PlayerEvent eventMask)
         {
             if (eventMask <= PlayerEvent.None || eventMask > event_all_mask) {
                 throw new ArgumentOutOfRangeException ("eventMask", "A valid event mask must be provided");
             }
         }
-        
+
         public void ConnectEvent (PlayerEventHandler handler)
         {
             ConnectEvent (handler, event_default_mask, false);
         }
-        
+
         public void ConnectEvent (PlayerEventHandler handler, PlayerEvent eventMask)
         {
             ConnectEvent (handler, eventMask, false);
         }
-        
+
         public void ConnectEvent (PlayerEventHandler handler, bool connectAfter)
         {
             ConnectEvent (handler, event_default_mask, connectAfter);
         }
-        
+
         public void ConnectEvent (PlayerEventHandler handler, PlayerEvent eventMask, bool connectAfter)
         {
             lock (event_handlers) {
                 VerifyEventMask (eventMask);
-            
+
                 PlayerEventHandlerSlot slot = new PlayerEventHandlerSlot (eventMask, handler);
-                
+
                 if (connectAfter) {
                     event_handlers.AddLast (slot);
                 } else {
@@ -684,7 +684,7 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         private LinkedListNode<PlayerEventHandlerSlot> FindEventNode (PlayerEventHandler handler)
         {
             LinkedListNode<PlayerEventHandlerSlot> node = event_handlers.First;
@@ -694,10 +694,10 @@ namespace Banshee.MediaEngine
                 }
                 node = node.Next;
             }
-            
+
             return null;
         }
-        
+
         public void DisconnectEvent (PlayerEventHandler handler)
         {
             lock (event_handlers) {
@@ -707,12 +707,12 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         public void ModifyEvent (PlayerEvent eventMask, PlayerEventHandler handler)
         {
             lock (event_handlers) {
                 VerifyEventMask (eventMask);
-                
+
                 LinkedListNode<PlayerEventHandlerSlot> node = FindEventNode (handler);
                 if (node != null) {
                     PlayerEventHandlerSlot slot = node.Value;
@@ -721,14 +721,14 @@ namespace Banshee.MediaEngine
                 }
             }
         }
-        
+
         private void RaiseEvent (PlayerEventArgs args)
         {
             lock (event_handlers) {
                 if (args.Event == PlayerEvent.StateChange && args is PlayerEventStateChangeArgs) {
                     HandleStateChange ((PlayerEventStateChangeArgs)args);
                 }
-            
+
                 LinkedListNode<PlayerEventHandlerSlot> node = event_handlers.First;
                 while (node != null) {
                     if ((node.Value.EventMask & args.Event) == args.Event) {
@@ -740,15 +740,15 @@ namespace Banshee.MediaEngine
         }
 
 #endregion
-        
+
         string IService.ServiceName {
             get { return "PlayerEngine"; }
         }
-        
-        IDBusExportable IDBusExportable.Parent { 
+
+        IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         public static readonly SchemaEntry<int> VolumeSchema = new SchemaEntry<int> (
             "player_engine", "volume",
             80,
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEvent.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEvent.cs
index ff3487e..96b1b79 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEvent.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEvent.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlayerEvent.cs
 //
 // Author:
@@ -33,68 +33,68 @@ namespace Banshee.MediaEngine
     public delegate void DBusPlayerStateHandler (string state);
     public delegate void DBusPlayerEventHandler (string evnt, string message, double bufferingPercent);
     public delegate void PlayerEventHandler (PlayerEventArgs args);
-    
+
     public class PlayerEventArgs : EventArgs
     {
         private PlayerEvent @event;
         public PlayerEvent Event {
             get { return @event; }
         }
-        
+
         public PlayerEventArgs (PlayerEvent @event)
         {
             this. at event = @event;
         }
     }
-    
+
     public class PlayerEventStateChangeArgs : PlayerEventArgs
     {
         private PlayerState previous;
         public PlayerState Previous {
             get { return previous; }
         }
-        
+
         private PlayerState current;
         public PlayerState Current {
             get { return current; }
         }
-        
+
         public PlayerEventStateChangeArgs (PlayerState previous, PlayerState current) : base (PlayerEvent.StateChange)
         {
             this.previous = previous;
             this.current = current;
         }
     }
-    
+
     public class PlayerEventErrorArgs : PlayerEventArgs
     {
         private string message;
         public string Message {
             get { return message; }
         }
-        
+
         public PlayerEventErrorArgs (string message) : base (PlayerEvent.Error)
         {
             this.message = message;
         }
     }
-    
+
     public sealed class PlayerEventBufferingArgs : PlayerEventArgs
     {
         private double progress;
         public double Progress {
             get { return progress; }
         }
-        
+
         public PlayerEventBufferingArgs (double progress) : base (PlayerEvent.Buffering)
         {
             this.progress = progress;
         }
     }
-    
-    // WARNING: If you add events to the list below, you MUST update the 
+
+    // WARNING: If you add events to the list below, you MUST update the
     // "all" mask in PlayerEngineService.cs to reflect your addition!
-    
+
     [Flags]
     public enum PlayerEvent
     {
@@ -110,8 +110,8 @@ namespace Banshee.MediaEngine
         Metadata = 256,
         TrackInfoUpdated = 512
     }
-    
-    public enum PlayerState 
+
+    public enum PlayerState
     {
         NotReady,
         Ready,
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs
index 77db232..0a4100b 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/TranscoderService.cs
@@ -57,7 +57,7 @@ namespace Banshee.MediaEngine
             public TranscodeCancelledHandler CancelledHandler;
             public TranscodeErrorHandler ErrorHandler;
 
-            public TranscodeContext (TrackInfo track, SafeUri out_uri, ProfileConfiguration config, 
+            public TranscodeContext (TrackInfo track, SafeUri out_uri, ProfileConfiguration config,
                 TrackTranscodedHandler handler, TranscodeCancelledHandler cancelledHandler, TranscodeErrorHandler errorHandler)
             {
                 Track = track;
@@ -72,7 +72,7 @@ namespace Banshee.MediaEngine
         private static bool transcoder_extension_queried = false;
         private static TypeExtensionNode transcoder_extension_node = null;
         private static TypeExtensionNode TranscoderExtensionNode {
-            get { 
+            get {
                 if (!transcoder_extension_queried) {
                     transcoder_extension_queried = true;
                     foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
@@ -84,7 +84,7 @@ namespace Banshee.MediaEngine
                 return transcoder_extension_node;
             }
         }
-                
+
         public static bool Supported {
             get { return TranscoderExtensionNode != null; }
         }
@@ -106,7 +106,7 @@ namespace Banshee.MediaEngine
         }
 
         private static string cache_dir = Paths.Combine (Paths.ApplicationCache, "transcoder");
-        
+
         public static SafeUri GetTempUriFor (string extension)
         {
             return new SafeUri (Paths.GetTempFileName (cache_dir, extension));
@@ -144,7 +144,7 @@ namespace Banshee.MediaEngine
                 return user_job;
             }
         }
-        
+
         private void Reset ()
         {
             lock (queue) {
@@ -154,7 +154,7 @@ namespace Banshee.MediaEngine
                     user_job.Finish ();
                     user_job = null;
                 }
-                
+
                 if (transcoder != null) {
                     transcoder.Finish ();
                     transcoder = null;
@@ -173,13 +173,13 @@ namespace Banshee.MediaEngine
             }
         }
 
-        public void Enqueue (TrackInfo track, ProfileConfiguration config, 
+        public void Enqueue (TrackInfo track, ProfileConfiguration config,
             TrackTranscodedHandler handler, TranscodeCancelledHandler cancelledHandler, TranscodeErrorHandler errorHandler)
         {
             Enqueue (track, GetTempUriFor (config.Profile.OutputFileExtension), config, handler, cancelledHandler, errorHandler);
         }
 
-        public void Enqueue (TrackInfo track, SafeUri out_uri, ProfileConfiguration config, 
+        public void Enqueue (TrackInfo track, SafeUri out_uri, ProfileConfiguration config,
             TrackTranscodedHandler handler, TranscodeCancelledHandler cancelledHandler, TranscodeErrorHandler errorHandler)
         {
             bool start = false;
@@ -228,7 +228,7 @@ namespace Banshee.MediaEngine
 
             ProcessQueue ();
         }
-        
+
         private void OnProgress (object o, TranscoderProgressArgs args)
         {
             if (user_job == null) {
@@ -237,7 +237,7 @@ namespace Banshee.MediaEngine
 
             UserJob.DetailedProgress = args.Fraction;
         }
-        
+
         private void OnError (object o, TranscoderErrorArgs args)
         {
             transcoding = false;
@@ -253,19 +253,19 @@ namespace Banshee.MediaEngine
         }
 
 #endregion
-                                
-#region User Job Event Handlers        
-        
+
+#region User Job Event Handlers
+
         private void OnCancelRequested (object o, EventArgs args)
         {
             Reset ();
         }
-        
+
         private void OnFinished (object o, EventArgs args)
         {
             Reset ();
         }
-        
+
 #endregion
 
         string IService.ServiceName {
diff --git a/src/Core/Banshee.Services/Banshee.MediaProfiles/MediaProfileManager.cs b/src/Core/Banshee.Services/Banshee.MediaProfiles/MediaProfileManager.cs
index 2e75926..59c6556 100644
--- a/src/Core/Banshee.Services/Banshee.MediaProfiles/MediaProfileManager.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaProfiles/MediaProfileManager.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.IO;
 using System.Text;
@@ -41,16 +41,16 @@ namespace Banshee.MediaProfiles
     {
         private bool profile_available = true;
         private Profile profile;
-        
+
         public TestProfileArgs(Profile profile)
         {
             this.profile = profile;
         }
-        
+
         public Profile Profile {
             get { return profile; }
         }
-        
+
         public bool ProfileAvailable {
             get { return profile_available; }
             set { profile_available = value; }
@@ -64,7 +64,7 @@ namespace Banshee.MediaProfiles
         internal static System.Globalization.CultureInfo CultureInfo {
             get { return System.Globalization.CultureInfo.InvariantCulture; }
         }
-    
+
         private XmlDocument document;
         private List<Profile> profiles;
         private Dictionary<string, PipelineVariable> preset_variables;
@@ -96,7 +96,7 @@ namespace Banshee.MediaProfiles
                 if(File.Exists(base_file)) {
                     LoadFromFile(base_file);
                 }
-                
+
                 foreach(string file in Directory.GetFiles(path, "*.xml")) {
                     if(Path.GetFileName(file) != "base.xml") {
                         LoadFromFile(file);
@@ -111,7 +111,7 @@ namespace Banshee.MediaProfiles
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         private void LoadFromFile(string path)
         {
             document = new XmlDocument();
@@ -122,7 +122,7 @@ namespace Banshee.MediaProfiles
             } catch(Exception e) {
                 Console.WriteLine("Could not load profile: {0}\n{1}", path, e);
             }
-            
+
             document = null;
         }
 
@@ -137,7 +137,7 @@ namespace Banshee.MediaProfiles
             if(node == null) {
                 return;
             }
-            
+
             foreach(XmlNode variable_node in node.SelectNodes("variable")) {
                 try {
                     PipelineVariable variable = new PipelineVariable(variable_node);
@@ -189,14 +189,14 @@ namespace Banshee.MediaProfiles
             Initialize ();
             return preset_variables[id];
         }
-        
+
         protected virtual bool OnTestProfile(Profile profile)
         {
             TestProfileHandler handler = TestProfile;
             if(handler == null) {
                 return true;
             }
-            
+
             TestProfileArgs args = new TestProfileArgs(profile);
             handler(this, args);
             return args.ProfileAvailable;
@@ -210,20 +210,20 @@ namespace Banshee.MediaProfiles
                 if(profile.Available == null) {
                     profile.Available = OnTestProfile(profile);
                 }
-                
+
                 if(profile.Available == true) {
                     yield return profile;
                 }
             }
         }
-        
+
         public ProfileConfiguration GetActiveProfileConfiguration (string id)
         {
             Initialize ();
 
             return ProfileConfiguration.LoadActive (this, id);
         }
-        
+
         public ProfileConfiguration GetActiveProfileConfiguration(string id, string [] mimetypes)
         {
             Initialize ();
@@ -239,7 +239,7 @@ namespace Banshee.MediaProfiles
                     }
                 }
             }
-            
+
             foreach(string mimetype in mimetypes) {
                 Profile profile = GetProfileForMimeType(mimetype);
                 if(profile != null) {
@@ -247,10 +247,10 @@ namespace Banshee.MediaProfiles
                     return profile.Configuration;
                 }
             }
-            
+
             return null;
         }
-        
+
         public void TestAll()
         {
             Initialize ();
@@ -259,7 +259,7 @@ namespace Banshee.MediaProfiles
                 profile.Available = OnTestProfile(profile);
             }
         }
-        
+
         public Profile GetProfileForMimeType(string mimetype)
         {
             Initialize ();
@@ -269,7 +269,7 @@ namespace Banshee.MediaProfiles
                     return profile;
                 }
             }
-            
+
             return null;
         }
 
@@ -280,7 +280,7 @@ namespace Banshee.MediaProfiles
 
             if (extension[0] == '.')
                 extension = extension.Substring (1, extension.Length - 1);
-            
+
             Initialize ();
 
             foreach (Profile profile in this) {
@@ -311,11 +311,11 @@ namespace Banshee.MediaProfiles
             Initialize ();
             return profiles.GetEnumerator();
         }
-        
+
         public int ProfileCount {
             get { Initialize (); return profiles.Count; }
         }
-        
+
         public int AvailableProfileCount {
             get {
                 Initialize ();
@@ -333,24 +333,24 @@ namespace Banshee.MediaProfiles
         string Banshee.ServiceStack.IService.ServiceName {
             get { return "MediaProfileManager"; }
         }
-        
+
         public override string ToString()
         {
             Initialize ();
             StringBuilder builder = new StringBuilder();
-            
+
             builder.Append("Preset Pipeline Variables:\n\n");
             foreach(PipelineVariable variable in preset_variables.Values) {
                 builder.Append(variable);
                 builder.Append("\n");
             }
-            
+
             builder.Append("Profiles:\n\n");
             foreach(Profile profile in profiles) {
                 builder.Append(profile);
                 builder.Append("\n\n");
             }
-            
+
             return builder.ToString().Trim();
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.MediaProfiles/Pipeline.cs b/src/Core/Banshee.Services/Banshee.MediaProfiles/Pipeline.cs
index 26c5ee2..a64072f 100644
--- a/src/Core/Banshee.Services/Banshee.MediaProfiles/Pipeline.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaProfiles/Pipeline.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Text;
 using System.Xml;
@@ -43,44 +43,44 @@ namespace Banshee.MediaProfiles
         public struct Process : IComparable<Process>
         {
             public static readonly Process Zero;
-        
+
             private string id;
             private int order;
             private string pipeline;
-            
+
             public Process(string id, int order, string pipeline)
             {
                 this.id = id;
                 this.order = order;
                 this.pipeline = pipeline;
             }
-            
+
             public int CompareTo(Process process)
             {
                 int id_cmp = id.CompareTo(process.ID);
                 return id_cmp != 0 ? id_cmp : order.CompareTo(process.Order);
             }
-            
+
             public string ID {
                 get { return id; }
             }
-            
-            public int Order { 
+
+            public int Order {
                 get { return order; }
             }
-            
+
             public string Pipeline {
                 get { return pipeline; }
             }
         }
-    
-        private static Dictionary<string, SExpFunctionHandler> sexpr_functions = 
+
+        private static Dictionary<string, SExpFunctionHandler> sexpr_functions =
             new Dictionary<string, SExpFunctionHandler>();
-            
+
         private List<PipelineVariable> variables = new List<PipelineVariable>();
         private Dictionary<string, string> processes = new Dictionary<string, string>();
         private List<Process> processes_pending = new List<Process>();
-        
+
         internal Pipeline(MediaProfileManager manager, XmlNode node)
         {
             foreach(XmlNode process_node in node.SelectNodes("process")) {
@@ -94,7 +94,7 @@ namespace Banshee.MediaProfiles
                     }
                 } catch {
                 }
-                
+
                 processes_pending.Add(new Process(process_id, order, process));
             }
 
@@ -113,27 +113,27 @@ namespace Banshee.MediaProfiles
                 }
             }
         }
-        
+
         public static void AddSExprFunction(string name, SExpFunctionHandler handler)
         {
-            if(!sexpr_functions.ContainsKey(name)) { 
+            if(!sexpr_functions.ContainsKey(name)) {
                 sexpr_functions.Add(name, handler);
             }
         }
-        
+
         public string CompileProcess(Process process)
         {
             return CompileProcess(process.Pipeline, process.ID);
         }
-        
+
         public string CompileProcess(string process, string id)
         {
             Evaluator eval = new Evaluator();
-            
+
             foreach(KeyValuePair<string, SExpFunctionHandler> function in sexpr_functions) {
                 eval.RegisterFunction(function.Value, function.Key);
             }
-            
+
             foreach(PipelineVariable variable in this) {
                 double ?numeric = variable.CurrentValueNumeric;
                 if(numeric != null) {
@@ -146,7 +146,7 @@ namespace Banshee.MediaProfiles
                     eval.RegisterVariable(variable.Id, variable.CurrentValue);
                 }
             }
-            
+
             TreeNode result = eval.EvaluateString(process);
             if(eval.Success && result is StringLiteral) {
                 return (result.Flatten() as StringLiteral).Value;
@@ -157,19 +157,19 @@ namespace Banshee.MediaProfiles
                 Console.WriteLine(eval.ErrorMessage);
                 Console.WriteLine("-----");
                 Console.WriteLine("Stack Trace:");
-            
+
                 foreach(Exception e in eval.Exceptions) {
                     Console.WriteLine(e.Message);
                 }
-                
+
                 Console.WriteLine("-----");
                 Console.WriteLine("Expression Tree:");
                 Hyena.SExpEngine.TreeNode.DumpTree(eval.ExpressionTree);
             }
-            
+
             return null;
         }
-        
+
         public void AddProcess(Process process)
         {
             AddProcess(process.ID, process.Pipeline);
@@ -188,34 +188,34 @@ namespace Banshee.MediaProfiles
         {
             processes.Remove(id);
         }
-        
+
         public string GetProcessById(string id)
         {
             if(processes.ContainsKey(id)) {
                 return CompileProcess(processes[id], id);
             }
-            
+
             throw new ApplicationException("No processes in pipeline");
         }
-        
+
         public string GetProcessByIdOrDefault(string id)
         {
             if(processes.ContainsKey(id)) {
                 return GetProcessById(id);
-            } 
-            
+            }
+
             return GetDefaultProcess();
         }
-        
+
         public string GetDefaultProcess()
         {
             foreach(KeyValuePair<string, string> process in processes) {
                 return CompileProcess(process.Value, process.Key);
             }
-            
+
             throw new ApplicationException("No processes in pipeline");
         }
-        
+
         public IList<Process> GetPendingProcessesById(string id)
         {
             List<Process> processes = new List<Process>();
@@ -233,7 +233,7 @@ namespace Banshee.MediaProfiles
             if(variables.Contains(variable)) {
                 throw new ApplicationException(String.Format("A variable with ID '{0}' already exists in this profile", variable.Id));
             }
-            
+
             variables.Add(variable);
         }
 
@@ -263,7 +263,7 @@ namespace Banshee.MediaProfiles
         public IDictionary<string, string> Processes {
             get { return processes; }
         }
-        
+
         public IList<PipelineVariable> Variables {
             get { return variables; }
         }
@@ -275,9 +275,9 @@ namespace Banshee.MediaProfiles
                 }
             }
         }
-        
+
         public string this[string variableName] {
-            set { 
+            set {
                 foreach(PipelineVariable variable in this) {
                     if(variable.Id == variableName) {
                         variable.CurrentValue = value;
@@ -290,7 +290,7 @@ namespace Banshee.MediaProfiles
         public override string ToString()
         {
             StringBuilder builder = new StringBuilder();
-                
+
             builder.Append("\tProcesses:\n");
             foreach(KeyValuePair<string, string> process in processes) {
                 builder.Append(String.Format("\t{0} = {1}\n", process.Key, process.Value));
diff --git a/src/Core/Banshee.Services/Banshee.MediaProfiles/PipelineVariable.cs b/src/Core/Banshee.Services/Banshee.MediaProfiles/PipelineVariable.cs
index c5bc06e..9603456 100644
--- a/src/Core/Banshee.Services/Banshee.MediaProfiles/PipelineVariable.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaProfiles/PipelineVariable.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Text;
 using System.Xml;
@@ -34,14 +34,14 @@ using System.Collections.Generic;
 
 namespace Banshee.MediaProfiles
 {
-    public enum PipelineVariableControlType 
+    public enum PipelineVariableControlType
     {
         Text,
         Slider,
         Combo,
         Check
     }
-    
+
     public class PipelineVariable
     {
         public struct PossibleValue
@@ -50,7 +50,7 @@ namespace Banshee.MediaProfiles
             public string Display;
             public string [] Enables;
             public string [] Disables;
-            
+
             public PossibleValue(string value, string display)
             {
                 Value = value;
@@ -58,13 +58,13 @@ namespace Banshee.MediaProfiles
                 Enables = null;
                 Disables = null;
             }
-            
+
             public override string ToString()
             {
                 return Display;
             }
         }
-    
+
         private PipelineVariableControlType control_type;
         private string id;
         private string name;
@@ -79,17 +79,17 @@ namespace Banshee.MediaProfiles
         private int step_precision;
         private string [] enables = new string[0];
         private string [] disables = new string[0];
-        
+
         private Dictionary<string, PossibleValue> possible_values = new Dictionary<string, PossibleValue>();
         private List<string> possible_values_keys = new List<string>();
         private bool advanced;
-    
+
         internal PipelineVariable(XmlNode node)
         {
             id = node.Attributes["id"].Value.Trim();
             name = Banshee.Base.Localization.SelectSingleNode(node, "name").InnerText.Trim();
             control_type = StringToControlType(node.SelectSingleNode("control-type").InnerText.Trim());
-            
+
             XmlAttribute enables_attr = node.Attributes["enables"];
             if(enables_attr != null && enables_attr.Value != null) {
                 string [] vars = enables_attr.Value.Split(',');
@@ -100,7 +100,7 @@ namespace Banshee.MediaProfiles
                     }
                 }
             }
-            
+
             XmlAttribute disables_attr = node.Attributes["disables"];
             if(disables_attr != null && disables_attr.Value != null) {
                 string [] vars = disables_attr.Value.Split(',');
@@ -111,7 +111,7 @@ namespace Banshee.MediaProfiles
                     }
                 }
             }
-            
+
             try {
                 XmlNode unit_node = node.SelectSingleNode("unit");
                 if(unit_node != null) {
@@ -119,7 +119,7 @@ namespace Banshee.MediaProfiles
                 }
             } catch {
             }
-            
+
             try {
                 XmlNode advanced_node = node.SelectSingleNode("advanced");
                 if(advanced_node != null) {
@@ -133,35 +133,35 @@ namespace Banshee.MediaProfiles
             max_value = ToDouble(ReadValue(node, "max-value"));
             min_label = ReadValue(node, "min-label", true);
             max_label = ReadValue(node, "max-label", true);
-            
+
             string step_value_str = ReadValue(node, "step-value");
             if(step_value_str != null) {
                 bool zeros = true;
                 step_precision = step_value_str.IndexOf(".") + 1;
-                
+
                 for(int i = step_precision; i > 0 && i < step_value_str.Length; i++) {
                     if(step_value_str[i] != '0') {
                         zeros = false;
                         break;
                     }
                 }
-                
+
                 step_precision = zeros ? 0 : step_value_str.Length - step_precision;
                 step_value = ToDouble(step_value_str);
             }
-            
+
             if(default_value != null && default_value != String.Empty && (current_value == null ||
                 current_value == String.Empty)) {
                 current_value = default_value;
             }
-            
+
             foreach(XmlNode possible_value_node in Banshee.Base.Localization.SelectNodes(node, "possible-values/value")) {
                 try {
                     string value = possible_value_node.Attributes["value"].Value.Trim();
                     string display = possible_value_node.InnerText.Trim();
 
                     PossibleValue possible_value = new PossibleValue(value, display);
-                    
+
                     XmlAttribute attr = possible_value_node.Attributes["enables"];
                     if(attr != null && attr.Value != null) {
                         string [] vars = attr.Value.Split(',');
@@ -183,7 +183,7 @@ namespace Banshee.MediaProfiles
                             }
                         }
                     }
-                    
+
                     if(!possible_values.ContainsKey(value)) {
                         possible_values.Add(value, possible_value);
                         possible_values_keys.Add(value);
@@ -201,14 +201,14 @@ namespace Banshee.MediaProfiles
         private static string ReadValue(XmlNode node, string name, bool localize)
         {
             try {
-                XmlNode str_node = localize ? 
-                    Banshee.Base.Localization.SelectSingleNode(node, name) : 
+                XmlNode str_node = localize ?
+                    Banshee.Base.Localization.SelectSingleNode(node, name) :
                     node.SelectSingleNode(name);
-                    
+
                 if(str_node == null) {
                     return null;
                 }
-                
+
                 string str = str_node.InnerText.Trim();
                 return str == String.Empty ? null : str;
             } catch {
@@ -230,10 +230,10 @@ namespace Banshee.MediaProfiles
         private static PipelineVariableControlType StringToControlType(string str)
         {
             switch(str.ToLower()) {
-                case "combo": return PipelineVariableControlType.Combo; 
+                case "combo": return PipelineVariableControlType.Combo;
                 case "slider": return PipelineVariableControlType.Slider;
                 case "check": return PipelineVariableControlType.Check;
-                case "text": 
+                case "text":
                 default:
                     return PipelineVariableControlType.Text;
             }
@@ -244,7 +244,7 @@ namespace Banshee.MediaProfiles
             if(advanced == null || advanced.Trim() == String.Empty) {
                 return true;
             }
-            
+
             switch(advanced.Trim().ToLower()) {
                 case "true":
                 case "yes":
@@ -275,12 +275,12 @@ namespace Banshee.MediaProfiles
             get { return control_type; }
             set { control_type = value; }
         }
-        
+
         public bool Advanced {
             get { return advanced; }
             set { advanced = value; }
         }
-        
+
         public string DefaultValue {
             get { return default_value; }
             set { default_value = value; }
@@ -295,20 +295,20 @@ namespace Banshee.MediaProfiles
             get { return min_label; }
             set { min_label = value; }
         }
-        
+
         public string MaxLabel {
             get { return max_label; }
             set { max_label = value; }
         }
-        
+
         public int StepPrecision {
             get { return step_precision; }
         }
-        
+
         public string [] Enables {
             get { return enables; }
         }
-        
+
         public string [] Disables {
             get { return disables; }
         }
@@ -355,15 +355,15 @@ namespace Banshee.MediaProfiles
             get { return step_value; }
             set { step_value = value; }
         }
-        
+
         public IDictionary<string, PossibleValue> PossibleValues {
             get { return possible_values; }
         }
-        
+
         public ICollection<string> PossibleValuesKeys {
             get { return possible_values_keys; }
         }
-        
+
         public int PossibleValuesCount {
             get { return possible_values.Count; }
         }
@@ -382,13 +382,13 @@ namespace Banshee.MediaProfiles
             builder.Append(String.Format("\tMax Value     = {0}\n", MaxValue));
             builder.Append(String.Format("\tStep Value    = {0}\n", StepValue));
             builder.Append(String.Format("\tPossible Values:\n"));
-            
+
             foreach(KeyValuePair<string, PossibleValue> value in PossibleValues) {
                 builder.Append(String.Format("\t\t{0} => {1}\n", value.Value, value.Key));
             }
 
             builder.Append("\n");
-            
+
             return builder.ToString();
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.MediaProfiles/Profile.cs b/src/Core/Banshee.Services/Banshee.MediaProfiles/Profile.cs
index 7d712b6..7ee4cec 100644
--- a/src/Core/Banshee.Services/Banshee.MediaProfiles/Profile.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaProfiles/Profile.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Text;
 using System.Xml;
@@ -51,19 +51,19 @@ namespace Banshee.MediaProfiles
             name = Banshee.Base.Localization.SelectSingleNode(node, "name").InnerText.Trim();
             description = Banshee.Base.Localization.SelectSingleNode(node, "description").InnerText.Trim();
             output_file_extension = node.SelectSingleNode("output-file-extension").InnerText.Trim();
-            
+
             foreach(XmlNode mimetype_node in node.SelectNodes("mimetype")) {
                 mimetypes.Add(mimetype_node.InnerText.Trim());
             }
-            
+
             pipeline = new Pipeline(manager, node.SelectSingleNode("pipeline"));
         }
-        
+
         public void LoadConfiguration(string configurationId)
         {
             SetConfiguration (ProfileConfiguration.Load(this, configurationId));
         }
-        
+
         public void SetConfiguration(ProfileConfiguration configuration)
         {
             this.configuration = configuration;
@@ -71,40 +71,40 @@ namespace Banshee.MediaProfiles
                 pipeline[variable.Key] = variable.Value;
             }
         }
-        
+
         public void SaveConfiguration()
         {
             SaveConfiguration(configuration.Id);
         }
-        
+
         public void SaveConfiguration(string configurationId)
         {
             if(configuration == null) {
                 LoadConfiguration(configurationId);
             }
-            
+
             foreach(PipelineVariable variable in pipeline) {
                 configuration.Add(variable.Id, variable.CurrentValue);
             }
-            
+
             configuration.Save();
         }
-        
-        public bool HasMimeType(string mimetype) 
+
+        public bool HasMimeType(string mimetype)
         {
             return mimetypes.Contains(mimetype);
         }
-        
+
         public string Id {
             get { return id; }
             set { id = value; }
         }
-        
+
         public bool? Available {
             get { return available; }
             internal set { available = value; }
         }
-        
+
         public string Name {
             get { return name; }
             set { name = value; }
@@ -124,11 +124,11 @@ namespace Banshee.MediaProfiles
             get { return pipeline; }
             set { pipeline = value; }
         }
-        
+
         public ProfileConfiguration Configuration {
             get { return configuration; }
         }
-        
+
         public IList<string> MimeTypes {
             get { return mimetypes; }
         }
@@ -143,7 +143,7 @@ namespace Banshee.MediaProfiles
             builder.Append(String.Format("Extension   = {0}\n", OutputFileExtension));
             builder.Append("Pipeline    =\n");
             builder.Append(Pipeline);
-            
+
             return builder.ToString();
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.MediaProfiles/ProfileConfiguration.cs b/src/Core/Banshee.Services/Banshee.MediaProfiles/ProfileConfiguration.cs
index 130d6c5..58471e1 100644
--- a/src/Core/Banshee.Services/Banshee.MediaProfiles/ProfileConfiguration.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaProfiles/ProfileConfiguration.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Text;
 using System.Xml;
@@ -41,7 +41,7 @@ namespace Banshee.MediaProfiles
         private Dictionary<string, string> variable_values = new Dictionary<string, string>();
         private string id;
         private Profile profile;
-        
+
         public static ProfileConfiguration Load(Profile profile, string id)
         {
             ProfileConfiguration configuration = new ProfileConfiguration(profile, id);
@@ -66,12 +66,12 @@ namespace Banshee.MediaProfiles
 
             return null;
         }
-        
+
         public static void SaveActiveProfile(Profile profile, string id)
         {
             ConfigurationClient.Set<string>(MakeConfNamespace(id), "active_profile", profile.Id);
         }
-        
+
         public ProfileConfiguration(Profile profile, string id)
         {
             this.profile = profile;
@@ -94,7 +94,7 @@ namespace Banshee.MediaProfiles
             }
             ConfigurationClient.Set<string[]>(ConfNamespace, "variables", variable_names.ToArray());
         }
-        
+
         public void Add(string variable, string value)
         {
             if(variable_values.ContainsKey(variable)) {
@@ -103,28 +103,28 @@ namespace Banshee.MediaProfiles
                 variable_values.Add(variable, value);
             }
         }
-        
+
         public void Remove(string variable)
         {
             if(variable_values.ContainsKey(variable)) {
                 variable_values.Remove(variable);
             }
         }
-        
+
         public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
         {
             return variable_values.GetEnumerator();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator()
         {
             return variable_values.GetEnumerator();
         }
-        
+
         public string this[string variable] {
             get { return variable_values[variable]; }
         }
-        
+
         public string Id {
             get { return id; }
         }
@@ -132,7 +132,7 @@ namespace Banshee.MediaProfiles
         public int Count {
             get { return variable_values.Count; }
         }
-        
+
         public Profile Profile {
             get {
                 if (profile.Configuration != this)
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedMetadataProvider.cs
index 7e71ce7..673c074 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedMetadataProvider.cs
@@ -41,7 +41,7 @@ namespace Banshee.Metadata.Embedded
         public EmbeddedMetadataProvider() : base()
         {
         }
-        
+
         public override IMetadataLookupJob CreateJob(IBasicTrackInfo track)
         {
             return new EmbeddedQueryJob(track);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedQueryJob.cs b/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedQueryJob.cs
index b4d119e..c4a7512 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedQueryJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.Embedded/EmbeddedQueryJob.cs
@@ -42,22 +42,22 @@ namespace Banshee.Metadata.Embedded
     public class EmbeddedQueryJob : MetadataServiceJob
     {
         private TrackInfo track;
-        
+
         public EmbeddedQueryJob(IBasicTrackInfo track)
         {
             Track = track;
             this.track = track as TrackInfo;
         }
-        
+
         public override void Run()
         {
             if(track == null || CoverArtSpec.CoverExists (track.ArtworkId)) {
                 return;
             }
-          
+
             Fetch();
         }
-        
+
         protected void Fetch()
         {
             if (track.Uri == null || !track.Uri.IsFile || !Banshee.IO.File.Exists (track.Uri))
@@ -68,49 +68,49 @@ namespace Banshee.Metadata.Embedded
             if(artist_album_id == null) {
                 return;
             }
-            
+
             IPicture [] pictures = GetEmbeddedPictures(track.Uri);
-                    
+
             if(pictures != null && pictures.Length > 0) {
                 int preferred_index = GetPictureIndexToUse(pictures);
                 IPicture picture = pictures[preferred_index];
                 string path = CoverArtSpec.GetPath(artist_album_id);
-                
-                if(SavePicture(picture, path)) {    
+
+                if(SavePicture(picture, path)) {
                     StreamTag tag = new StreamTag();
                     tag.Name = CommonTags.AlbumCoverId;
-                    tag.Value = artist_album_id;   
-                    
+                    tag.Value = artist_album_id;
+
                     AddTag(tag);
-                } 
+                }
             }
         }
 
         protected IPicture [] GetEmbeddedPictures(SafeUri uri)
         {
-            TagLib.File file = StreamTagger.ProcessUri(uri);            
-            return file == null ? null : file.Tag.Pictures;            
+            TagLib.File file = StreamTagger.ProcessUri(uri);
+            return file == null ? null : file.Tag.Pictures;
         }
-        
+
         protected int GetPictureIndexToUse(IPicture [] pictures)
         {
             int preferred_index = -1;
-            
-            // Use the front cover.  If we don't find it, use the first image. 
+
+            // Use the front cover.  If we don't find it, use the first image.
             for(int i = 0; i < pictures.Length; i++) {
                 if(preferred_index == -1) {
                     preferred_index = i;
                 }
-                
+
                 if(pictures[i].Type == PictureType.FrontCover) {
                     preferred_index = i;
                     break;
                 }
             }
-            
+
             return preferred_index;
         }
-        
+
         protected bool SavePicture (IPicture picture, string image_path)
         {
             if (picture == null || picture.Data == null || picture.Data.Count == 0) {
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemMetadataProvider.cs
index c2f636e..2a92f95 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemMetadataProvider.cs
@@ -40,7 +40,7 @@ namespace Banshee.Metadata.FileSystem
         public FileSystemMetadataProvider() : base()
         {
         }
-        
+
         public override IMetadataLookupJob CreateJob (IBasicTrackInfo track)
         {
             return new FileSystemQueryJob (track);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemQueryJob.cs b/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemQueryJob.cs
index 0cc5fcf..87d482a 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemQueryJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.FileSystem/FileSystemQueryJob.cs
@@ -47,26 +47,26 @@ namespace Banshee.Metadata.FileSystem
             Track = track;
             this.track = track as TrackInfo;
         }
-        
+
         public override void Run ()
         {
             if (Track == null || CoverArtSpec.CoverExists (Track.ArtworkId)) {
                 return;
             }
-          
+
             Fetch ();
         }
-        
+
         private static string [] extensions = new string [] { ".jpg", ".jpeg", ".png", ".bmp" };
         private static string [] filenames = new string [] { "cover", "folder", "front" };
-        
+
         protected void Fetch ()
         {
             if (Track.Uri == null || !Track.Uri.IsFile ||
                     Track.ArtworkId == null || !Banshee.IO.File.Exists (Track.Uri)) {
                 return;
             }
-            
+
             string directory = System.IO.Path.GetDirectoryName (Track.Uri.AbsolutePath);
 
             // Get the largest (in terms of file size) JPEG in the directory
@@ -74,7 +74,11 @@ namespace Banshee.Metadata.FileSystem
             string best_file = null;
             int items_in_directory = 0;
             bool found_definite_best = false;
-            int max_acceptable_items = Math.Max (30, track.TrackCount + 8);
+            int track_count = track.TrackCount;
+            if (track.DiscCount > 0) {
+                track_count = track.TrackCount * track.DiscCount;
+            }
+            int max_acceptable_items = Math.Max (30, track_count + 8);
             foreach (string file in Banshee.IO.Directory.GetFiles (directory)) {
                 // Ignore directories with tons of songs in them; this lookup is only intended for when the
                 // music file is in a directory specific to its album.
@@ -84,11 +88,11 @@ namespace Banshee.Metadata.FileSystem
                     }
                     return;
                 }
-                
+
                 if (found_definite_best) {
                     continue;
                 }
-                
+
                 string extension = System.IO.Path.GetExtension (file).ToLower ();
                 if (Array.IndexOf (extensions, extension) != -1) {
                     string filename = System.IO.Path.GetFileNameWithoutExtension (file).ToLower ();
@@ -104,7 +108,7 @@ namespace Banshee.Metadata.FileSystem
                     }
                 }
             }
-            
+
             if (best_file != null) {
                 try {
                     string extension = "cover";
@@ -121,7 +125,7 @@ namespace Banshee.Metadata.FileSystem
                     tag.Name = CommonTags.AlbumCoverId;
                     tag.Value = Track.ArtworkId;
                     AddTag (tag);
-                    
+
                     Log.Debug ("Got cover art from track's folder", best_file);
                 } catch (Exception e) {
                     Log.Exception (e);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMMetadataProvider.cs
index 1032fc3..89f8797 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMMetadataProvider.cs
@@ -3,9 +3,9 @@
 //
 // Author:
 //   Peter de Kraker <peterdk.dev at umito.nl>
-// 
+//
 // Based on RhapsodyMetadataProvider.cs
-//   
+//
 // Copyright (C) 2006-2008 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
@@ -42,7 +42,7 @@ namespace Banshee.Metadata.LastFM
         public LastFMMetadataProvider () : base ()
         {
         }
-        
+
         public override IMetadataLookupJob CreateJob (IBasicTrackInfo track)
         {
             return new LastFMQueryJob (track);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMQueryJob.cs b/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMQueryJob.cs
index 546f354..0a7f6ba 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMQueryJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.LastFM/LastFMQueryJob.cs
@@ -50,39 +50,39 @@ using Lastfm;
 namespace Banshee.Metadata.LastFM
 {
     public class LastFMQueryJob : MetadataServiceJob
-    {        
+    {
         public LastFMQueryJob (IBasicTrackInfo track)
         {
-            Track = track;                
+            Track = track;
         }
-        
+
         public override void Run ()
         {
-            
+
             if (Track == null || (Track.MediaAttributes & TrackMediaAttributes.Podcast) != 0) {
                 return;
             }
-        
+
             string artwork_id = Track.ArtworkId;
 
             if (artwork_id == null || CoverArtSpec.CoverExists (artwork_id) || !ServiceManager.Get<Network> ().Connected) {
                 return;
             }
-            
+
             // Lastfm uses double url-encoding in their current 1.2 api for albuminfo.
             string lastfmArtist = HttpUtility.UrlEncode (HttpUtility.UrlEncode (Track.AlbumArtist));
             string lastfmAlbum = HttpUtility.UrlEncode (HttpUtility.UrlEncode (Track.AlbumTitle));
-             
+
             Lastfm.Data.LastfmAlbumData album = null;
-            
-            try { 
+
+            try {
                 album = new Lastfm.Data.LastfmAlbumData (lastfmArtist, lastfmAlbum);
             } catch {
                 return;
             }
 
             // AllUrls is an array with [small,medium,large] coverart url
-            string [] album_cover_urls = album.AlbumCoverUrls.AllUrls ();              
+            string [] album_cover_urls = album.AlbumCoverUrls.AllUrls ();
 
             // Select the URL for the coverart with highest resolution
             string best_url = String.Empty;
@@ -94,22 +94,22 @@ namespace Banshee.Metadata.LastFM
 
             // No URL's found
             if (String.IsNullOrEmpty (best_url) || best_url.Contains ("noimage")) {
-                //string upload_url = String.Format ("http://www.last.fm/music/{0}/{1}/+images", lastfmArtist, lastfmAlbum);  
+                //string upload_url = String.Format ("http://www.last.fm/music/{0}/{1}/+images", lastfmArtist, lastfmAlbum);
                 //Log.DebugFormat ("No coverart provided by lastfm. (you can upload it here: {0}) - {1} ", upload_url, Track.ArtworkId);
                 return;
             }
-            
+
             // Hack: You can get higher resolution artwork by replacing 130X130 with 300x300 in lastfm hosted albumart
             string high_res_url = null;
             if (best_url.Contains ("130x130")) {
                 high_res_url = best_url.Replace ("130x130", "300x300");
             }
-            
+
             // Hack: You can get higher resolution artwork from Amazon too (lastfm sometimes uses amazon links)
-            if (best_url.Contains ("MZZZZZZZ")) {                                        
+            if (best_url.Contains ("MZZZZZZZ")) {
                 high_res_url = best_url.Replace ("MZZZZZZZ", "LZZZZZZZ");
             }
-                
+
             // Download the cover
             try {
                 if ((high_res_url != null && SaveHttpStreamCover (new Uri (high_res_url), artwork_id, null)) ||
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzMetadataProvider.cs
index fb4c3d6..19551d3 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzMetadataProvider.cs
@@ -40,7 +40,7 @@ namespace Banshee.Metadata.MusicBrainz
         public MusicBrainzMetadataProvider() : base()
         {
         }
-        
+
         public override IMetadataLookupJob CreateJob(IBasicTrackInfo track)
         {
             return new MusicBrainzQueryJob(track);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs b/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs
index 8748b0b..92fdb91 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs
@@ -46,32 +46,32 @@ namespace Banshee.Metadata.MusicBrainz
     public class MusicBrainzQueryJob : MetadataServiceJob
     {
         private static string AmazonUriFormat = "http://images.amazon.com/images/P/{0}.01._SCLZZZZZZZ_.jpg";
-    
+
         private string asin;
-        
+
         public MusicBrainzQueryJob (IBasicTrackInfo track)
         {
             Track = track;
         }
-        
+
         public MusicBrainzQueryJob (IBasicTrackInfo track, string asin) : this (track)
         {
             this.asin = asin;
         }
-        
+
         public override void Run ()
         {
             Lookup ();
         }
-        
+
         public bool Lookup ()
         {
             if (Track == null || (Track.MediaAttributes & TrackMediaAttributes.Podcast) != 0) {
                 return false;
             }
-            
+
             string artwork_id = Track.ArtworkId;
-            
+
             if (artwork_id == null) {
                 return false;
             } else if (CoverArtSpec.CoverExists (artwork_id)) {
@@ -79,15 +79,15 @@ namespace Banshee.Metadata.MusicBrainz
             } else if (!InternetConnected) {
                 return false;
             }
-            
+
             if (asin == null) {
                 asin = FindAsin ();
                 if (asin == null) {
                     return false;
                 }
             }
-            
-            if (SaveHttpStreamCover (new Uri (String.Format (AmazonUriFormat, asin)), artwork_id, 
+
+            if (SaveHttpStreamCover (new Uri (String.Format (AmazonUriFormat, asin)), artwork_id,
                 new string [] { "image/gif" })) {
                 Log.Debug ("Downloaded cover art from Amazon", artwork_id);
                 StreamTag tag = new StreamTag ();
@@ -95,17 +95,17 @@ namespace Banshee.Metadata.MusicBrainz
                 tag.Value = artwork_id;
 
                 AddTag (tag);
-                
+
                 return true;
             }
-            
+
             return false;
         }
 
-        // MusicBrainz has this new XML API, so I'm using that here 
-        // instead of using the stuff in the MusicBrainz namespace 
+        // MusicBrainz has this new XML API, so I'm using that here
+        // instead of using the stuff in the MusicBrainz namespace
         // which sucks and doesn't even appear to work anymore.
-        
+
         private string FindAsin ()
         {
             Uri uri = new Uri (String.Format ("http://musicbrainz.org/ws/1/release/?type=xml&artist={0}&title={1}",
@@ -115,12 +115,12 @@ namespace Banshee.Metadata.MusicBrainz
             if (response == null) {
                 return null;
             }
-            
+
             using (Stream stream = response.GetResponseStream ()) {
                 XmlTextReader reader = new XmlTextReader (stream);
-    
+
                 bool haveMatch = false;
-                
+
                 while (reader.Read ()) {
                     if (reader.NodeType == XmlNodeType.Element) {
                         switch (reader.LocalName) {
@@ -138,7 +138,7 @@ namespace Banshee.Metadata.MusicBrainz
                     }
                 }
             }
-            
+
             return null;
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyMetadataProvider.cs
index 2f8c097..4119377 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyMetadataProvider.cs
@@ -40,7 +40,7 @@ namespace Banshee.Metadata.Rhapsody
         public RhapsodyMetadataProvider() : base()
         {
         }
-        
+
         public override IMetadataLookupJob CreateJob(IBasicTrackInfo track)
         {
             return new RhapsodyQueryJob(track);
diff --git a/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs b/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs
index 7365ff9..02d42e2 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs
@@ -47,38 +47,38 @@ namespace Banshee.Metadata.Rhapsody
     public class RhapsodyQueryJob : MetadataServiceJob
     {
         private static Uri base_uri = new Uri("http://www.rhapsody.com/");
-        
+
         public RhapsodyQueryJob(IBasicTrackInfo track)
         {
             Track = track;
         }
-        
+
         public override void Run()
         {
             if (Track == null || (Track.MediaAttributes & TrackMediaAttributes.Podcast) != 0) {
                 return;
             }
-        
+
             string artwork_id = Track.ArtworkId;
-            
+
             if(artwork_id == null || CoverArtSpec.CoverExists(artwork_id) || !InternetConnected) {
                 return;
             }
-            
+
             Uri data_uri = new Uri(base_uri, String.Format("/{0}/data.xml", artwork_id.Replace('-', '/')));
-        
+
             XmlDocument doc = new XmlDocument();
             HttpWebResponse response = GetHttpStream (data_uri);
             if (response == null) {
                 return;
             }
-            
+
             string [] content_types = response.Headers.GetValues ("Content-Type");
             if (content_types.Length == 0 || content_types[0] != "text/xml") {
                 response.Close ();
                 return;
             }
-            
+
             using (Stream stream = response.GetResponseStream ()) {
                 doc.Load (stream);
             }
@@ -89,17 +89,17 @@ namespace Banshee.Metadata.Rhapsody
                 string second_attempt = art_node.Attributes["src"].Value;
                 string first_attempt = second_attempt.Replace("170x170", "500x500");
 
-                if(SaveHttpStreamCover(new Uri(first_attempt), artwork_id, null) || 
+                if(SaveHttpStreamCover(new Uri(first_attempt), artwork_id, null) ||
                     SaveHttpStreamCover(new Uri(second_attempt), artwork_id, null)) {
                     Log.Debug ("Downloaded cover art from Rhapsody", artwork_id);
                     StreamTag tag = new StreamTag();
                     tag.Name = CommonTags.AlbumCoverId;
                     tag.Value = artwork_id;
-                
+
                     AddTag(tag);
                 }
             }
-            
+
             response.Close ();
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/BaseMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata/BaseMetadataProvider.cs
index 97cabc9..2835328 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/BaseMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/BaseMetadataProvider.cs
@@ -39,36 +39,36 @@ namespace Banshee.Metadata
     public abstract class BaseMetadataProvider : IMetadataProvider
     {
         public event MetadataLookupResultHandler HaveResult;
-        
+
         protected BaseMetadataProvider()
         {
         }
-        
+
         public abstract IMetadataLookupJob CreateJob(IBasicTrackInfo track);
-        
+
         public virtual void Lookup(IBasicTrackInfo track)
         {
             IMetadataLookupJob job = CreateJob(track);
             job.Run();
         }
-        
+
         public virtual void Cancel(IBasicTrackInfo track)
         {
         }
-        
+
         public virtual void Cancel()
         {
         }
-        
+
         protected virtual void OnHaveResult(IBasicTrackInfo track, IList<StreamTag> tags)
         {
             if(tags == null) {
                 return;
             }
-            
+
             MetadataLookupResultHandler handler = HaveResult;
             if(handler != null) {
-                handler(this, new MetadataLookupResultArgs(track, 
+                handler(this, new MetadataLookupResultArgs(track,
                     new ReadOnlyCollection<StreamTag>(tags)));
             }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/IMetadataProvider.cs b/src/Core/Banshee.Services/Banshee.Metadata/IMetadataProvider.cs
index 21f4ee3..b9b3ed6 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/IMetadataProvider.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/IMetadataProvider.cs
@@ -36,33 +36,33 @@ using Banshee.Streaming;
 namespace Banshee.Metadata
 {
     public delegate void MetadataLookupResultHandler(object o, MetadataLookupResultArgs args);
-    
+
     public class MetadataLookupResultArgs : EventArgs
     {
         private IBasicTrackInfo track;
         private ReadOnlyCollection<StreamTag> tags;
-        
+
         public MetadataLookupResultArgs(IBasicTrackInfo track, ReadOnlyCollection<StreamTag> tags)
         {
             this.track = track;
             this.tags = tags;
         }
-        
+
         public IBasicTrackInfo Track {
             get { return track; }
         }
-        
+
         public ReadOnlyCollection<StreamTag> ResultTags {
             get { return tags; }
         }
     }
-    
+
     public interface IMetadataProvider
     {
         event MetadataLookupResultHandler HaveResult;
-        
+
         IMetadataLookupJob CreateJob(IBasicTrackInfo track);
-        
+
         void Lookup(IBasicTrackInfo track);
         void Cancel(IBasicTrackInfo track);
         void Cancel();
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/MetadataService.cs b/src/Core/Banshee.Services/Banshee.Metadata/MetadataService.cs
index 9210cd0..54f2258 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/MetadataService.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/MetadataService.cs
@@ -39,18 +39,18 @@ namespace Banshee.Metadata
     public class MetadataService : BaseMetadataProvider
     {
         private static MetadataService instance;
-        
+
         public static MetadataService Instance {
             get {
                 if (instance == null) {
                     instance = new MetadataService ();
                 }
-                
+
                 return instance;
             }
         }
-        
-        private Dictionary<IBasicTrackInfo, IMetadataLookupJob> queries 
+
+        private Dictionary<IBasicTrackInfo, IMetadataLookupJob> queries
             = new Dictionary<IBasicTrackInfo, IMetadataLookupJob> ();
         private List<IMetadataProvider> providers = new List<IMetadataProvider> ();
 
@@ -61,7 +61,7 @@ namespace Banshee.Metadata
             AddProvider (new Banshee.Metadata.Rhapsody.RhapsodyMetadataProvider ());
             AddProvider (new Banshee.Metadata.MusicBrainz.MusicBrainzMetadataProvider ());
             AddProvider (new Banshee.Metadata.LastFM.LastFMMetadataProvider ());
-            
+
             Scheduler.JobFinished += OnSchedulerJobFinished;
             Scheduler.JobUnscheduled += OnSchedulerJobUnscheduled;
         }
@@ -70,25 +70,25 @@ namespace Banshee.Metadata
         {
             return new MetadataServiceJob (this, track);
         }
-        
+
         public override void Lookup (IBasicTrackInfo track)
         {
             Lookup (track, JobPriority.Highest);
         }
-        
+
         public void Lookup (IBasicTrackInfo track, JobPriority priority)
         {
             if (track == null || queries == null || track.ArtworkId == null) {
                 return;
             }
-            
+
             lock (((ICollection)queries).SyncRoot) {
                 if (!queries.ContainsKey (track)) {
                     IMetadataLookupJob job = CreateJob (track);
                     if (job == null) {
                         return;
                     }
-                    
+
                     queries.Add (track, job);
                     Scheduler.Schedule (job, priority);
                 }
@@ -117,42 +117,42 @@ namespace Banshee.Metadata
                 providers.Remove (provider);
             }
         }
-        
+
         private bool RemoveJob (IMetadataLookupJob job)
         {
             if (job == null || job.Track == null) {
                 return false;
             }
-            
+
             lock (((ICollection)queries).SyncRoot) {
                 if (queries.ContainsKey (job.Track)) {
                     queries.Remove (job.Track);
                     return true;
                 }
-                
+
                 return false;
             }
         }
-        
+
         private void OnSchedulerJobFinished (IJob job)
         {
             if (!(job is IMetadataLookupJob)) {
                 return;
             }
-            
+
             IMetadataLookupJob lookup_job = (IMetadataLookupJob)job;
             if (RemoveJob (lookup_job)) {
-                Banshee.Base.ThreadAssist.ProxyToMain (delegate { 
-                    OnHaveResult (lookup_job.Track, lookup_job.ResultTags); 
+                Banshee.Base.ThreadAssist.ProxyToMain (delegate {
+                    OnHaveResult (lookup_job.Track, lookup_job.ResultTags);
                 });
             }
         }
-        
+
         private void OnSchedulerJobUnscheduled (IJob job)
         {
             RemoveJob (job as IMetadataLookupJob);
         }
-        
+
         public ReadOnlyCollection<IMetadataProvider> Providers {
             get {
                 lock (providers) {
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/MetadataServiceJob.cs b/src/Core/Banshee.Services/Banshee.Metadata/MetadataServiceJob.cs
index 97308c1..d4f8794 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/MetadataServiceJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/MetadataServiceJob.cs
@@ -47,15 +47,15 @@ namespace Banshee.Metadata
         private IBasicTrackInfo track;
         private List<StreamTag> tags = new List<StreamTag>();
         private IMetadataLookupJob current_job;
-        
+
         protected bool InternetConnected {
             get { return ServiceManager.Get<Network> ().Connected; }
         }
-        
+
         protected MetadataServiceJob()
         {
         }
-        
+
         public MetadataServiceJob(MetadataService service, IBasicTrackInfo track)
         {
             this.service = service;
@@ -71,7 +71,7 @@ namespace Banshee.Metadata
                 }
             }
         }
-    
+
         public virtual void Run()
         {
             foreach(IMetadataProvider provider in service.Providers) {
@@ -87,7 +87,7 @@ namespace Banshee.Metadata
 
                     if (cancelled)
                         break;;
-                    
+
                     foreach(StreamTag tag in current_job.ResultTags) {
                         AddTag(tag);
                     }
@@ -102,21 +102,21 @@ namespace Banshee.Metadata
                 }
             }
         }
-        
-        public virtual IBasicTrackInfo Track { 
+
+        public virtual IBasicTrackInfo Track {
             get { return track; }
             protected set { track = value; }
         }
-        
-        public virtual IList<StreamTag> ResultTags { 
+
+        public virtual IList<StreamTag> ResultTags {
             get { return tags; }
         }
-        
+
         protected void AddTag(StreamTag tag)
         {
             tags.Add(tag);
         }
-        
+
         protected HttpWebResponse GetHttpStream(Uri uri)
         {
             return GetHttpStream(uri, null);
@@ -127,15 +127,15 @@ namespace Banshee.Metadata
             if(!InternetConnected) {
                 throw new NetworkUnavailableException();
             }
-        
+
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri.AbsoluteUri);
             request.UserAgent = Banshee.Web.Browser.UserAgent;
             request.Timeout = 10 * 1000;
             request.KeepAlive = false;
             request.AllowAutoRedirect = true;
-            
+
             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
-            
+
             if(ignoreMimeTypes != null) {
                 string [] content_types = response.Headers.GetValues("Content-Type");
                 if(content_types != null) {
@@ -148,15 +148,15 @@ namespace Banshee.Metadata
                     }
                 }
             }
-            
+
             return response;
         }
-        
+
         protected bool SaveHttpStream(Uri uri, string path)
         {
             return SaveHttpStream(uri, path, null);
         }
-        
+
         protected bool SaveHttpStream(Uri uri, string path, string [] ignoreMimeTypes)
         {
             HttpWebResponse response = GetHttpStream(uri, ignoreMimeTypes);
@@ -169,12 +169,12 @@ namespace Banshee.Metadata
             }
 
             SaveAtomically (path, from_stream);
-            
+
             from_stream.Close ();
-                
+
             return true;
         }
-        
+
         protected bool SaveHttpStreamCover (Uri uri, string albumArtistId, string [] ignoreMimeTypes)
         {
             return SaveHttpStream (uri, CoverArtSpec.GetPath (albumArtistId), ignoreMimeTypes);
@@ -190,7 +190,7 @@ namespace Banshee.Metadata
             if (Banshee.IO.File.Exists (path_uri)) {
                 return;
             }
-            
+
             // Save the file to a temporary path while downloading/copying,
             // so that nobody sees it and thinks it's ready for use before it is
             SafeUri tmp_uri = new SafeUri (String.Format ("{0}.part", path));
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
index 7956667..c999d69 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
@@ -63,11 +63,12 @@ namespace Banshee.Metadata
             );
         }
 
-        public bool WriteEnabled { get; set; }
+        public bool WriteMetadataEnabled { get; set; }
+        public bool WriteRatingsAndPlayCountsEnabled { get; set; }
         public bool RenameEnabled { get; set; }
 
         private HyenaSqliteCommand update_synced_at;
-    
+
         protected override void IterateCore (HyenaDataReader reader)
         {
             DatabaseTrackInfo track = DatabaseTrackInfo.Provider.Load (reader.Reader);
@@ -75,9 +76,9 @@ namespace Banshee.Metadata
             bool wrote = false;
             bool renamed = false;
             try {
-                if (WriteEnabled) {
+                if (WriteMetadataEnabled || WriteRatingsAndPlayCountsEnabled) {
                     Hyena.Log.DebugFormat ("Saving metadata for {0}", track);
-                    wrote = StreamTagger.SaveToFile (track);
+                    wrote = StreamTagger.SaveToFile (track, WriteMetadataEnabled, WriteRatingsAndPlayCountsEnabled);
                 }
 
                 if (RenameEnabled) {
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
index 0ff7f2b..c3aea2d 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
@@ -43,16 +43,21 @@ namespace Banshee.Metadata
 {
     public class SaveTrackMetadataService : IService
     {
-        public static SchemaPreference<bool> WriteEnabled = new SchemaPreference<bool> (
-                LibrarySchema.WriteMetadata, 
+        public static SchemaPreference<bool> WriteMetadataEnabled = new SchemaPreference<bool> (
+                LibrarySchema.WriteMetadata,
                 Catalog.GetString ("Write _metadata to files"),
-                Catalog.GetString ("Enable this option to save tags and other metadata inside supported audio files.")
+                Catalog.GetString ("Save tags and other metadata inside supported media files")
         );
 
+        public static SchemaPreference<bool> WriteRatingsAndPlayCountsEnabled = new SchemaPreference<bool> (
+                LibrarySchema.WriteRatingsAndPlayCounts,
+                Catalog.GetString ("Write _ratings and play counts to files"),
+                Catalog.GetString ("Enable this option to save rating and playcount metadata inside supported audio files"));
+
         public static SchemaPreference<bool> RenameEnabled = new SchemaPreference<bool> (
                 LibrarySchema.MoveOnInfoSave,
                 Catalog.GetString ("_Update file and folder names"),
-                Catalog.GetString ("Enabling this option ensures that files and folders are renamed according to the metadata.")
+                Catalog.GetString ("Rename files and folders according to media metadata")
         );
 
         private SaveTrackMetadataJob job;
@@ -62,7 +67,8 @@ namespace Banshee.Metadata
         public SaveTrackMetadataService ()
         {
             Banshee.ServiceStack.Application.RunTimeout (10000, delegate {
-                WriteEnabled.ValueChanged += OnEnabledChanged;
+                WriteMetadataEnabled.ValueChanged += OnEnabledChanged;
+                WriteRatingsAndPlayCountsEnabled.ValueChanged += OnEnabledChanged;
                 RenameEnabled.ValueChanged += OnEnabledChanged;
                 ServiceManager.SourceManager.MusicLibrary.TracksChanged += OnTracksChanged;
                 Save ();
@@ -84,23 +90,24 @@ namespace Banshee.Metadata
 
         private void Save ()
         {
-            if (!(WriteEnabled.Value || RenameEnabled.Value))
+            if (!(WriteMetadataEnabled.Value || WriteRatingsAndPlayCountsEnabled.Value || RenameEnabled.Value))
                 return;
 
             lock (sync) {
                 if (job != null) {
-                    job.WriteEnabled  = WriteEnabled.Value;
+                    job.WriteMetadataEnabled  = WriteMetadataEnabled.Value;
+                    job.WriteRatingsAndPlayCountsEnabled = WriteRatingsAndPlayCountsEnabled.Value;
                     job.RenameEnabled = RenameEnabled.Value;
-                    return;
                 } else {
-                    job = new SaveTrackMetadataJob ();
-                    job.WriteEnabled  = WriteEnabled.Value;
-                    job.RenameEnabled = RenameEnabled.Value;
+                    var new_job = new SaveTrackMetadataJob ();
+                    new_job.WriteMetadataEnabled  = WriteMetadataEnabled.Value;
+                    new_job.WriteRatingsAndPlayCountsEnabled = WriteRatingsAndPlayCountsEnabled.Value;
+                    new_job.RenameEnabled = RenameEnabled.Value;
+                    new_job.Finished += delegate { lock (sync) { job = null; } };
+                    job = new_job;
+                    job.Register ();
                 }
             }
-
-            job.Finished += delegate { job = null; };
-            job.Register ();
         }
 
         private void OnTracksChanged (Source sender, TrackEventArgs args)
@@ -110,7 +117,7 @@ namespace Banshee.Metadata
 
         private void OnEnabledChanged (Root pref)
         {
-            if (WriteEnabled.Value || RenameEnabled.Value) {
+            if (WriteMetadataEnabled.Value || WriteRatingsAndPlayCountsEnabled.Value || RenameEnabled.Value) {
                 Save ();
             } else {
                 if (job != null) {
diff --git a/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs b/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs
new file mode 100644
index 0000000..d7b9d64
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/INetworkAvailabilityService.cs
@@ -0,0 +1,36 @@
+//
+// INetworkAvailabilityService.cs
+//
+// Author:
+//   Jérémie "Garuma" Laval <jeremie.laval at gmail.com>
+//
+// Copyright 2009 Jérémie "Garuma" Laval
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Banshee.Networking
+{
+    public interface INetworkAvailabilityService
+    {
+        State State { get; }
+        event StateChangeHandler StateChange;
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.Networking/Network.cs b/src/Core/Banshee.Services/Banshee.Networking/Network.cs
index 6b41fdc..9f8d073 100644
--- a/src/Core/Banshee.Services/Banshee.Networking/Network.cs
+++ b/src/Core/Banshee.Services/Banshee.Networking/Network.cs
@@ -41,7 +41,7 @@ using Banshee.Configuration;
 namespace Banshee.Networking
 {
     public delegate void NetworkStateChangedHandler(object o, NetworkStateChangedArgs args);
-    
+
     public class NetworkStateChangedArgs : EventArgs
     {
         public bool Connected;
@@ -61,38 +61,45 @@ namespace Banshee.Networking
     public class Network : IService, IRegisterOnDemandService, IDisposable
     {
         public event NetworkStateChangedHandler StateChanged;
-        
-        private NetworkManager nm_manager;
+
+        private INetworkAvailabilityService manager;
         private State current_state;
         private bool disable_internet_access = false;
-        
+
         public Network ()
         {
             InstallPreferences ();
-            
+
             try {
-                ConnectToNetworkManager();
+                ConnectToManager ();
             } catch(Exception) {
-                nm_manager = null;
+                manager = null;
                 Log.Warning(
-                    Catalog.GetString("Cannot connect to NetworkManager"),
+                    Catalog.GetString("Cannot connect to NetworkManager or Wicd"),
                     Catalog.GetString("An available, working network connection will be assumed"),
                     false);
             }
         }
-        
+
         public void Dispose ()
         {
             UninstallPreferences ();
         }
 
-        private void ConnectToNetworkManager()
+        private void ConnectToManager()
         {
-            nm_manager = new NetworkManager();
-            nm_manager.StateChange += OnNetworkManagerEvent;
-            current_state = nm_manager.State;
+            if (NetworkManager.ManagerPresent) {
+                manager = new NetworkManager ();
+            } else if (Wicd.ManagerPresent) {
+                manager = new Wicd ();
+            } else {
+                throw new NetworkUnavailableException ("Neither NetworkManager nor Wicd could be found");
+            }
+
+            manager.StateChange += OnNetworkManagerEvent;
+            current_state = manager.State;
         }
-        
+
         private void OnNetworkManagerEvent(State new_state)
         {
             try {
@@ -103,7 +110,7 @@ namespace Banshee.Networking
                     if (Connected != was_connected) {
                         OnStateChanged ();
                     }
-                    
+
                 }
             } catch(Exception) {
             }
@@ -117,22 +124,22 @@ namespace Banshee.Networking
                 state_changed_args.Connected = Connected;
                 handler(this, state_changed_args);
             }
-            
+
             if(Connected) {
                 Log.Debug("Network Connection Established", "Connected");
             } else {
                 Log.Debug("Network Connection Unavailable", "Disconnected");
             }
         }
-        
+
         public bool Connected {
-            get { return disable_internet_access ? false : (nm_manager == null ? true : current_state == State.Connected); }
+            get { return disable_internet_access ? false : (manager == null ? true : current_state == State.Connected); }
         }
-        
-        public NetworkManager Manager {
-            get { return nm_manager; }
+
+        public INetworkAvailabilityService Manager {
+            get { return manager; }
         }
-        
+
 #region Offline Preference
 
         private PreferenceBase disable_internet_access_preference;
@@ -140,13 +147,13 @@ namespace Banshee.Networking
         private void InstallPreferences ()
         {
             disable_internet_access = DisableInternetAccess.Get ();
-            
+
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null) {
                 return;
             }
-            
-            disable_internet_access_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (DisableInternetAccess, 
+
+            disable_internet_access_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (DisableInternetAccess,
                 Catalog.GetString ("_Disable features requiring Internet access"),
                 Catalog.GetString ("Some features require a broadband Internet connection such as Last.fm or cover art fetching"),
                 delegate {
@@ -158,20 +165,20 @@ namespace Banshee.Networking
                 }
             ));
         }
-        
+
         private void UninstallPreferences ()
         {
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null) {
                 return;
             }
-            
+
             service["general"]["misc"].Remove (disable_internet_access_preference);
             disable_internet_access_preference = null;
         }
-        
+
         public static readonly SchemaEntry<bool> DisableInternetAccess = new SchemaEntry<bool> (
-            "core", "disable_internet_access", 
+            "core", "disable_internet_access",
             false,
             "Disable internet access",
             "Do not allow components to have internet access within Banshee"
diff --git a/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs b/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
index 9d6b558..ddeed94 100644
--- a/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Networking/NetworkManager.cs
@@ -34,42 +34,32 @@ using NDesk.DBus;
 
 namespace Banshee.Networking
 {
-    public enum State : uint {
-        Unknown = 0,
-        Asleep,
-        Connecting,
-        Connected,
-        Disconnected
-    }
-    
-    [Interface("org.freedesktop.NetworkManager")]
-    public interface INetworkManager
-    {
-        event StateChangeHandler StateChange;
-        State state();
-    }
-    
-    public delegate void StateChangeHandler(State state);
-    
-    public class NetworkManager
+    public class NetworkManager : INetworkAvailabilityService
     {
+        [Interface ("org.freedesktop.NetworkManager")]
+        private interface INetworkManager
+        {
+            event StateChangeHandler StateChange;
+            State state ();
+        }
+
         private const string BusName = "org.freedesktop.NetworkManager";
         private const string ObjectPath = "/org/freedesktop/NetworkManager";
 
         private INetworkManager manager;
-        
+
         public event StateChangeHandler StateChange;
 
         public NetworkManager()
         {
-            if(!Bus.System.NameHasOwner(BusName)) {
+            if (!ManagerPresent) {
                 throw new ApplicationException(String.Format("Name {0} has no owner", BusName));
             }
 
             manager = Bus.System.GetObject<INetworkManager>(BusName, new ObjectPath(ObjectPath));
             manager.StateChange += OnStateChange;
         }
-        
+
         private void OnStateChange(State state)
         {
             StateChangeHandler handler = StateChange;
@@ -81,6 +71,10 @@ namespace Banshee.Networking
         public State State {
             get { return manager.state(); }
         }
+
+        public static bool ManagerPresent {
+            get { return Bus.System.NameHasOwner (BusName); }
+        }
     }
 }
 
diff --git a/src/Core/Banshee.Services/Banshee.Networking/State.cs b/src/Core/Banshee.Services/Banshee.Networking/State.cs
new file mode 100644
index 0000000..4619416
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/State.cs
@@ -0,0 +1,41 @@
+//
+// State.cs
+//
+// Author:
+//   Aaron Bockover <abockover at novell.com>
+//
+// Copyright 2005-2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+namespace Banshee.Networking
+{
+    public enum State : uint
+    {
+        Unknown = 0,
+        Asleep,
+        Connecting,
+        Connected,
+        Disconnected
+    }
+
+    public delegate void StateChangeHandler (State state);
+}
diff --git a/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs b/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs
new file mode 100644
index 0000000..723e272
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Networking/Wicd.cs
@@ -0,0 +1,112 @@
+//
+// Wicd.cs
+//
+// Author:
+//   Jérémie Laval <jeremie.laval at gmail.com>
+//
+// Copyright 2009 Jérémie "Garuma" Laval
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using NDesk.DBus;
+
+namespace Banshee.Networking
+{
+    public class Wicd : INetworkAvailabilityService
+    {
+        public delegate void StateChangeInternalHandler (uint code, object [] foo);
+
+        internal struct StatusStruct
+        {
+            public uint Code;
+            public string [] Foo;
+        }
+
+        [Interface ("org.wicd.daemon")]
+        internal interface IWicd
+        {
+            event StateChangeInternalHandler StatusChanged;
+            StatusStruct GetConnectionStatus ();
+        }
+
+        private enum WicdCodes : uint {
+            NotConnected = 0,
+            Connecting,
+            Wired,
+            Wireless,
+            Suspended
+        }
+
+        private const string BusName = "org.wicd.daemon";
+        private const string ObjectPath = "/org/wicd/daemon";
+
+        private IWicd manager;
+
+        public event StateChangeHandler StateChange;
+
+        public Wicd ()
+        {
+            if (!ManagerPresent) {
+                throw new ApplicationException (String.Format ("Name {0} has no owner", BusName));
+            }
+
+            manager = Bus.System.GetObject<IWicd> (BusName, new ObjectPath(ObjectPath));
+            manager.StatusChanged += OnStateChange;
+        }
+
+        private void OnStateChange (uint code, object[] foo)
+        {
+            var handler = StateChange;
+            if (handler != null) {
+                handler(GetTranslatedCode (code));
+            }
+        }
+
+        public State State {
+            get { return GetTranslatedCode (manager.GetConnectionStatus ().Code); }
+        }
+
+        public static bool ManagerPresent {
+            get { return Bus.System.NameHasOwner (BusName); }
+        }
+
+        private State GetTranslatedCode (uint wicdCode)
+        {
+            switch ((WicdCodes)wicdCode) {
+                case WicdCodes.NotConnected:
+                    return State.Disconnected;
+                case WicdCodes.Connecting:
+                    return State.Connecting;
+                case WicdCodes.Wireless:
+                case WicdCodes.Wired:
+                    return State.Connected;
+                case WicdCodes.Suspended:
+                    return State.Asleep;
+                default:
+                    return State.Unknown;
+            }
+        }
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.PlatformServices/ScreensaverManager.cs b/src/Core/Banshee.Services/Banshee.PlatformServices/ScreensaverManager.cs
index 7d22dcb..8a1afe2 100644
--- a/src/Core/Banshee.Services/Banshee.PlatformServices/ScreensaverManager.cs
+++ b/src/Core/Banshee.Services/Banshee.PlatformServices/ScreensaverManager.cs
@@ -36,7 +36,7 @@ namespace Banshee.PlatformServices
     {
         private IScreensaverManager manager;
         bool inhibited = false;
-        
+
         public ScreensaverManager ()
         {
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/PlatformServices/ScreensaverManager")) {
@@ -45,16 +45,16 @@ namespace Banshee.PlatformServices
                     Log.DebugFormat ("Loaded IScreensaverManager: {0}", manager.GetType ().FullName);
                     break;
                 } catch (Exception e) {
-                    Log.Exception ("IScreensaverManager extension failed to load", e);    
+                    Log.Exception ("IScreensaverManager extension failed to load", e);
                 }
             }
         }
-        
+
         public void Dispose ()
         {
             UnInhibit ();
         }
-        
+
         public void Inhibit ()
         {
             if (manager != null && !inhibited) {
@@ -63,7 +63,7 @@ namespace Banshee.PlatformServices
                 inhibited = true;
             }
         }
-        
+
         public void UnInhibit ()
         {
             if (manager != null && inhibited) {
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackController.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackController.cs
index 31ef7e4..57d4e10 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackController.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackController.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IPlaybackController.cs
 //
 // Author:
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
index 70b4d11..9c8883f 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IPlaybackControllerExportable.cs
 //
 // Author:
@@ -34,21 +34,21 @@ using Banshee.ServiceStack;
 namespace Banshee.PlaybackController
 {
     public delegate void PlaybackControllerStoppedHandler ();
-    
+
     [Interface ("org.bansheeproject.Banshee.PlaybackController")]
     public interface IPlaybackControllerService : IDBusExportable
     {
         // FIXME: IPlaybackControllerExportable : IPlaybackController
-        // but NDesk DBus has a design flaw where it only exports 
-        // members of the top level interface where the [Interface] 
+        // but NDesk DBus has a design flaw where it only exports
+        // members of the top level interface where the [Interface]
         // attribute is applied
-        
+
         event PlaybackControllerStoppedHandler Stopped;
-        
+
         void First ();
         void Next (bool restart);
         void Previous (bool restart);
-        
+
         PlaybackShuffleMode ShuffleMode { get; set; }
         PlaybackRepeatMode RepeatMode { get; set; }
         bool StopWhenFinished { get; set; }
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerDatabaseStack.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerDatabaseStack.cs
index e5476b9..504415d 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerDatabaseStack.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerDatabaseStack.cs
@@ -37,7 +37,7 @@ namespace Banshee.PlaybackController
     internal class PlaybackControllerDatabaseStack : IStackProvider<TrackInfo>
     {
         private Stack<TrackInfo> stack = new Stack<TrackInfo> ();
-    
+
     	public TrackInfo Peek ()
     	{
     	    return stack.Peek ();
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
index 5c52f55..6625cde 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
@@ -39,7 +39,7 @@ using Banshee.MediaEngine;
 
 namespace Banshee.PlaybackController
 {
-    public class PlaybackControllerService : IRequiredService, ICanonicalPlaybackController, 
+    public class PlaybackControllerService : IRequiredService, ICanonicalPlaybackController,
         IPlaybackController, IPlaybackControllerService
     {
         private enum Direction
@@ -47,10 +47,10 @@ namespace Banshee.PlaybackController
             Next,
             Previous
         }
-    
+
         private IStackProvider<TrackInfo> previous_stack;
         private IStackProvider<TrackInfo> next_stack;
-    
+
         private TrackInfo current_track;
         private TrackInfo prior_track;
         private TrackInfo changing_to_track;
@@ -60,40 +60,40 @@ namespace Banshee.PlaybackController
         private int consecutive_errors;
         private uint error_transition_id;
         private DateTime source_auto_set_at = DateTime.MinValue;
-    
+
         private PlaybackShuffleMode shuffle_mode;
         private PlaybackRepeatMode repeat_mode;
         private bool stop_when_finished = false;
-        
+
         private PlayerEngineService player_engine;
         private ITrackModelSource source;
         private ITrackModelSource next_source;
-        
+
         private event PlaybackControllerStoppedHandler dbus_stopped;
         event PlaybackControllerStoppedHandler IPlaybackControllerService.Stopped {
             add { dbus_stopped += value; }
             remove { dbus_stopped -= value; }
         }
-        
+
         public event EventHandler Stopped;
         public event EventHandler SourceChanged;
         public event EventHandler NextSourceChanged;
         public event EventHandler TrackStarted;
         public event EventHandler Transition;
-        public event EventHandler<ShuffleModeChangedEventArgs> ShuffleModeChanged;
-        public event EventHandler<RepeatModeChangedEventArgs> RepeatModeChanged;
-        
+        public event EventHandler<EventArgs<PlaybackShuffleMode>> ShuffleModeChanged;
+        public event EventHandler<EventArgs<PlaybackRepeatMode>> RepeatModeChanged;
+
         public PlaybackControllerService ()
         {
             InstantiateStacks ();
-            
+
             player_engine = ServiceManager.PlayerEngine;
             player_engine.PlayWhenIdleRequest += OnPlayerEnginePlayWhenIdleRequest;
-            player_engine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.EndOfStream | 
+            player_engine.ConnectEvent (OnPlayerEvent,
+                PlayerEvent.EndOfStream |
                 PlayerEvent.StartOfStream |
                 PlayerEvent.StateChange |
-                PlayerEvent.Error, 
+                PlayerEvent.Error,
                 true);
 
             ServiceManager.SourceManager.ActiveSourceChanged += delegate {
@@ -104,13 +104,13 @@ namespace Banshee.PlaybackController
                 }
             };
         }
-        
+
         protected virtual void InstantiateStacks ()
         {
             previous_stack = new PlaybackControllerDatabaseStack ();
             next_stack = new PlaybackControllerDatabaseStack ();
         }
-        
+
         private void OnPlayerEnginePlayWhenIdleRequest (object o, EventArgs args)
         {
             ITrackModelSource next_source = NextSource;
@@ -123,7 +123,7 @@ namespace Banshee.PlaybackController
                 Next ();
             }
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
@@ -140,7 +140,7 @@ namespace Banshee.PlaybackController
                         OnStopped ();
                         break;
                     }
-                    
+
                     CancelErrorTransition ();
                     // TODO why is this so long? any reason not to be instantaneous?
                     Application.RunTimeout (250, EosTransition);
@@ -149,14 +149,14 @@ namespace Banshee.PlaybackController
                     if (((PlayerEventStateChangeArgs)args).Current != PlayerState.Loading) {
                         break;
                     }
-                       
+
                     TrackInfo track = player_engine.CurrentTrack;
                     if (changing_to_track != track && track != null) {
                         CurrentTrack = track;
                     }
-                    
+
                     changing_to_track = null;
-                    
+
                     if (!raise_started_after_transition) {
                         transition_track_started = false;
                         OnTrackStarted ();
@@ -164,9 +164,9 @@ namespace Banshee.PlaybackController
                         transition_track_started = true;
                     }
                     break;
-            }       
+            }
         }
-        
+
         private void CancelErrorTransition ()
         {
             if (error_transition_id > 0) {
@@ -174,7 +174,7 @@ namespace Banshee.PlaybackController
                 error_transition_id = 0;
             }
         }
-        
+
         private bool EosTransition ()
         {
             if (!StopWhenFinished) {
@@ -187,47 +187,47 @@ namespace Banshee.PlaybackController
             } else {
                 OnStopped ();
             }
-            
+
             StopWhenFinished = false;
             return false;
         }
-        
+
         public void First ()
         {
             CancelErrorTransition ();
-            
+
             Source = NextSource;
-            
+
             // This and OnTransition() below commented out b/c of BGO #524556
             //raise_started_after_transition = true;
-            
+
             if (Source is IBasicPlaybackController && ((IBasicPlaybackController)Source).First ()) {
             } else {
                 ((IBasicPlaybackController)this).First ();
             }
-            
+
             //OnTransition ();
         }
-        
+
         public void Next ()
         {
             Next (RepeatMode == PlaybackRepeatMode.RepeatAll);
         }
-        
+
         public void Next (bool restart)
         {
             CancelErrorTransition ();
-            
+
             Source = NextSource;
             raise_started_after_transition = true;
 
             player_engine.IncrementLastPlayed ();
-            
+
             if (Source is IBasicPlaybackController && ((IBasicPlaybackController)Source).Next (restart)) {
             } else {
                 ((IBasicPlaybackController)this).Next (restart);
             }
-            
+
             OnTransition ();
         }
 
@@ -235,24 +235,24 @@ namespace Banshee.PlaybackController
         {
             Previous (RepeatMode == PlaybackRepeatMode.RepeatAll);
         }
-        
+
         public void Previous (bool restart)
         {
             CancelErrorTransition ();
-            
+
             Source = NextSource;
             raise_started_after_transition = true;
 
             player_engine.IncrementLastPlayed ();
-            
+
             if (Source is IBasicPlaybackController && ((IBasicPlaybackController)Source).Previous (restart)) {
             } else {
                 ((IBasicPlaybackController)this).Previous (restart);
             }
-            
+
             OnTransition ();
         }
-        
+
         bool IBasicPlaybackController.First ()
         {
             if (Source.Count > 0) {
@@ -260,7 +260,7 @@ namespace Banshee.PlaybackController
             }
             return true;
         }
-        
+
         bool IBasicPlaybackController.Next (bool restart)
         {
             TrackInfo tmp_track = CurrentTrack;
@@ -279,14 +279,14 @@ namespace Banshee.PlaybackController
                 } else {
                     return true;
                 }
-                
+
                 CurrentTrack = next_track;
             }
-            
+
             QueuePlayTrack ();
             return true;
         }
-        
+
         bool IBasicPlaybackController.Previous (bool restart)
         {
             if (CurrentTrack != null && previous_stack.Count > 0) {
@@ -303,11 +303,11 @@ namespace Banshee.PlaybackController
                     return true;
                 }
             }
-            
+
             QueuePlayTrack ();
             return true;
         }
-        
+
         private TrackInfo QueryTrack (Direction direction, bool restart)
         {
             Log.DebugFormat ("Querying model for track to play in {0}:{1} mode", ShuffleMode, direction);
@@ -315,7 +315,7 @@ namespace Banshee.PlaybackController
                 ? QueryTrackLinear (direction, restart)
                 : QueryTrackRandom (ShuffleMode, restart);
         }
-        
+
         private TrackInfo QueryTrackLinear (Direction direction, bool restart)
         {
             if (Source.TrackModel.Count == 0)
@@ -341,15 +341,18 @@ namespace Banshee.PlaybackController
                 }
             }
         }
-        
+
         private TrackInfo QueryTrackRandom (PlaybackShuffleMode mode, bool restart)
         {
-            var track = Source.TrackModel.GetRandom (source_set_at, mode, restart, last_was_skipped);
+            var track_shuffler = Source.TrackModel as Banshee.Collection.Database.DatabaseTrackListModel;
+            TrackInfo track = track_shuffler == null
+                ? Source.TrackModel.GetRandom (source_set_at)
+                : track_shuffler.GetRandom (source_set_at, mode, restart, last_was_skipped, Banshee.Collection.Database.Shuffler.Playback);
             // Reset to default of true, only ever set to false by EosTransition
             last_was_skipped = true;
             return track;
         }
-        
+
         private void QueuePlayTrack ()
         {
             changing_to_track = CurrentTrack;
@@ -358,32 +361,34 @@ namespace Banshee.PlaybackController
 
         protected virtual void OnStopped ()
         {
+            player_engine.IncrementLastPlayed ();
+
             EventHandler handler = Stopped;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
-            
+
             PlaybackControllerStoppedHandler dbus_handler = dbus_stopped;
             if (dbus_handler != null) {
                 dbus_handler ();
             }
         }
-        
+
         protected virtual void OnTransition ()
         {
             EventHandler handler = Transition;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
-            
+
             if (raise_started_after_transition && transition_track_started) {
                 OnTrackStarted ();
             }
-            
+
             raise_started_after_transition = false;
             transition_track_started = false;
         }
-        
+
         protected virtual void OnSourceChanged ()
         {
             EventHandler handler = SourceChanged;
@@ -391,7 +396,7 @@ namespace Banshee.PlaybackController
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected void OnNextSourceChanged ()
         {
             EventHandler handler = NextSourceChanged;
@@ -399,7 +404,7 @@ namespace Banshee.PlaybackController
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnTrackStarted ()
         {
             EventHandler handler = TrackStarted;
@@ -407,7 +412,7 @@ namespace Banshee.PlaybackController
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public TrackInfo CurrentTrack {
             get { return current_track; }
             protected set { current_track = value; }
@@ -417,16 +422,16 @@ namespace Banshee.PlaybackController
             get { return prior_track ?? CurrentTrack; }
             set { prior_track = value; }
         }
-        
+
         protected DateTime source_set_at = DateTime.MinValue;
         public ITrackModelSource Source {
-            get { 
+            get {
                 if (source == null && ServiceManager.SourceManager.DefaultSource is ITrackModelSource) {
                     return (ITrackModelSource)ServiceManager.SourceManager.DefaultSource;
                 }
                 return source;
             }
-            
+
             set {
                 if (source != value) {
                     NextSource = value;
@@ -436,52 +441,52 @@ namespace Banshee.PlaybackController
                 }
             }
         }
-        
+
         public ITrackModelSource NextSource {
             get { return next_source ?? Source; }
             set {
                 if (next_source != value) {
                     next_source = value;
                     OnNextSourceChanged ();
-                    
+
                     if (!player_engine.IsPlaying ()) {
                         Source = next_source;
                     }
                 }
             }
         }
-        
+
         public PlaybackShuffleMode ShuffleMode {
             get { return shuffle_mode; }
             set {
                 shuffle_mode = value;
-                EventHandler<ShuffleModeChangedEventArgs> handler = ShuffleModeChanged;
+                EventHandler<EventArgs<PlaybackShuffleMode>> handler = ShuffleModeChanged;
                 if (handler != null) {
-                    handler (this, new ShuffleModeChangedEventArgs (shuffle_mode));
+                    handler (this, new EventArgs<PlaybackShuffleMode> (shuffle_mode));
                 }
             }
         }
-        
+
         public PlaybackRepeatMode RepeatMode {
             get { return repeat_mode; }
             set {
                 repeat_mode = value;
-                EventHandler<RepeatModeChangedEventArgs> handler = RepeatModeChanged;
+                EventHandler<EventArgs<PlaybackRepeatMode>> handler = RepeatModeChanged;
                 if (handler != null) {
-                    handler (this, new RepeatModeChangedEventArgs (repeat_mode));
+                    handler (this, new EventArgs<PlaybackRepeatMode> (repeat_mode));
                 }
             }
         }
-        
+
         public bool StopWhenFinished {
             get { return stop_when_finished; }
             set { stop_when_finished = value; }
         }
-        
+
         string IService.ServiceName {
             get { return "PlaybackController"; }
         }
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackRepeatMode.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackRepeatMode.cs
index a512522..b48913f 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackRepeatMode.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackRepeatMode.cs
@@ -36,17 +36,4 @@ namespace Banshee.PlaybackController
         RepeatAll,
         RepeatSingle
     }
-
-    public class RepeatModeChangedEventArgs : EventArgs
-    {
-        private PlaybackRepeatMode repeat_mode;
-        public PlaybackRepeatMode RepeatMode {
-            get { return repeat_mode; }
-        }
-
-        public RepeatModeChangedEventArgs (PlaybackRepeatMode repeat_mode)
-        {
-            this.repeat_mode = repeat_mode;
-        }
-    }
 }
diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackShuffleMode.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackShuffleMode.cs
index 8903ce4..ad965df 100644
--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackShuffleMode.cs
+++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackShuffleMode.cs
@@ -39,17 +39,4 @@ namespace Banshee.PlaybackController
         Rating,
         Score
     }
-
-    public class ShuffleModeChangedEventArgs : EventArgs
-    {
-        private PlaybackShuffleMode shuffle_mode;
-        public PlaybackShuffleMode ShuffleMode {
-            get { return shuffle_mode; }
-        }
-
-        public ShuffleModeChangedEventArgs (PlaybackShuffleMode shuffle_mode)
-        {
-            this.shuffle_mode = shuffle_mode;
-        }
-    }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
index 875f410..0654104 100644
--- a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
@@ -23,48 +23,48 @@ namespace Banshee.Playlist
         public PlaylistImportCanceledException (string message) : base (message)
         {
         }
-        
+
         public PlaylistImportCanceledException () : base ()
         {
         }
     }
-    
+
     public static class PlaylistFileUtil
-    {        
+    {
         public static readonly SchemaEntry<string> DefaultExportFormat = new SchemaEntry<string> (
             "player_window", "default_export_format",
             String.Empty,
             "Export Format",
             "The default playlist export format"
         );
-        
+
         private static PlaylistFormatDescription [] export_formats = new PlaylistFormatDescription [] {
             M3uPlaylistFormat.FormatDescription,
             PlsPlaylistFormat.FormatDescription,
             XspfPlaylistFormat.FormatDescription
         };
-        
+
         public static readonly string [] PlaylistExtensions = new string [] {
             M3uPlaylistFormat.FormatDescription.FileExtension,
             PlsPlaylistFormat.FormatDescription.FileExtension,
             XspfPlaylistFormat.FormatDescription.FileExtension
         };
-        
+
         public static PlaylistFormatDescription [] ExportFormats {
             get { return export_formats; }
         }
-        
+
         public static bool IsSourceExportSupported (Source source)
         {
             bool supported = true;
-            
+
             if (source == null || !(source is AbstractPlaylistSource)) {
                 supported = false;
             }
-            
+
             return supported;
         }
-        
+
         public static PlaylistFormatDescription GetDefaultExportFormat ()
         {
             PlaylistFormatDescription default_format = null;
@@ -77,36 +77,36 @@ namespace Banshee.Playlist
                         break;
                     }
                 }
-            } catch {            
-                // Ignore errors, return our default if we encounter an error.                
+            } catch {
+                // Ignore errors, return our default if we encounter an error.
             } finally {
-                if (default_format == null) {                    
+                if (default_format == null) {
                     default_format = M3uPlaylistFormat.FormatDescription;
                 }
             }
             return default_format;
         }
-        
+
         public static void SetDefaultExportFormat (PlaylistFormatDescription format)
         {
             try {
-                DefaultExportFormat.Set (format.FileExtension);        
+                DefaultExportFormat.Set (format.FileExtension);
             } catch (Exception) {
-            }            
+            }
         }
-        
-        public static int GetFormatIndex (PlaylistFormatDescription [] formats, PlaylistFormatDescription playlist) 
+
+        public static int GetFormatIndex (PlaylistFormatDescription [] formats, PlaylistFormatDescription playlist)
         {
             int default_export_index = -1;
             foreach (PlaylistFormatDescription format in formats) {
                 default_export_index++;
-                if (format.FileExtension.Equals (playlist.FileExtension)) {                    
+                if (format.FileExtension.Equals (playlist.FileExtension)) {
                     break;
                 }
             }
             return default_export_index;
         }
-        
+
         public static string [] ImportPlaylist (string playlistUri)
         {
             return ImportPlaylist (playlistUri, null);
@@ -123,7 +123,7 @@ namespace Banshee.Playlist
             }
             return uris.ToArray ();
         }
-        
+
         public static bool PathHasPlaylistExtension (string playlistUri)
         {
             if (System.IO.Path.HasExtension (playlistUri)) {
@@ -134,28 +134,28 @@ namespace Banshee.Playlist
                     }
                 }
             }
-            
+
             return false;
         }
 
         public static IPlaylistFormat Load (string playlistUri, Uri baseUri)
         {
-            PlaylistFormatDescription [] formats = PlaylistFileUtil.ExportFormats;            
-            
-            // If the file has an extenstion, rearrange the format array so that the 
+            PlaylistFormatDescription [] formats = PlaylistFileUtil.ExportFormats;
+
+            // If the file has an extenstion, rearrange the format array so that the
             // appropriate format is tried first.
             if (System.IO.Path.HasExtension (playlistUri)) {
                 string extension = System.IO.Path.GetExtension (playlistUri);
                 extension = extension.ToLower ();
-                
+
                 int index = -1;
                 foreach (PlaylistFormatDescription format in formats) {
-                    index++;                    
-                    if (extension.Equals ("." + format.FileExtension)) {                        
+                    index++;
+                    if (extension.Equals ("." + format.FileExtension)) {
                         break;
-                    } 
+                    }
                 }
-                                
+
                 if (index != -1 && index != 0 && index < formats.Length) {
                     // Move to first position in array.
                     PlaylistFormatDescription preferredFormat = formats[index];
@@ -163,7 +163,7 @@ namespace Banshee.Playlist
                     formats[0] = preferredFormat;
                 }
             }
-            
+
             foreach (PlaylistFormatDescription format in formats) {
                 try {
                     IPlaylistFormat playlist = (IPlaylistFormat)Activator.CreateInstance (format.Type);
@@ -173,15 +173,15 @@ namespace Banshee.Playlist
                 } catch (InvalidPlaylistException) {
                 }
             }
-        
+
             return null;
         }
-        
+
         public static void ImportPlaylistToLibrary (string path)
         {
             ImportPlaylistToLibrary (path, ServiceManager.SourceManager.MusicLibrary, null);
         }
-        
+
         public static void ImportPlaylistToLibrary (string path, PrimarySource source, DatabaseImportManager importer)
         {
             try {
@@ -197,9 +197,9 @@ namespace Banshee.Playlist
                     foreach (Dictionary<string, object> element in parser.Elements) {
                         uris.Add (((Uri)element["uri"]).LocalPath);
                     }
-                    
+
                     ImportPlaylistWorker worker = new ImportPlaylistWorker (
-                        parser.Title, 
+                        parser.Title,
                         uris.ToArray (), source, importer);
                     worker.Import ();
                 }
@@ -208,16 +208,16 @@ namespace Banshee.Playlist
             }
         }
     }
-    
+
     public class ImportPlaylistWorker
     {
         private string [] uris;
         private string name;
-        
+
         private PrimarySource source;
         private DatabaseImportManager importer;
         private bool finished;
-        
+
         public ImportPlaylistWorker (string name, string [] uris, PrimarySource source, DatabaseImportManager importer)
         {
             this.name = name;
@@ -225,7 +225,7 @@ namespace Banshee.Playlist
             this.source = source;
             this.importer = importer;
         }
-        
+
         public void Import ()
         {
             try {
@@ -239,7 +239,7 @@ namespace Banshee.Playlist
                 Hyena.Log.Exception (e);
             }
         }
-        
+
         private void CreatePlaylist (object o, EventArgs args)
         {
             if (finished) {
@@ -264,7 +264,7 @@ namespace Banshee.Playlist
                         ServiceManager.DbConnection.Execute (insert_command, track_id);
                     }
                 }
-                
+
                 playlist.Reload ();
                 playlist.NotifyUser ();
             } catch (Exception e) {
diff --git a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
index ee97408..3605504 100644
--- a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
@@ -69,7 +69,7 @@ namespace Banshee.Playlist
         protected override string TrackJoinTable {
             get { return "CorePlaylistEntries"; }
         }
-        
+
         protected long MaxViewOrder {
             get {
                 return ServiceManager.DbConnection.Query<long> (
@@ -77,7 +77,7 @@ namespace Banshee.Playlist
             }
         }
 
-        static PlaylistSource () 
+        static PlaylistSource ()
         {
             add_track_range_command = new HyenaSqliteCommand (@"
                 INSERT INTO CorePlaylistEntries
@@ -145,7 +145,7 @@ namespace Banshee.Playlist
                 //(source.Parent == Parent || Parent == null || (source.Parent == null && !(source is PrimarySource)))
             );
         }
-        
+
         public override SourceMergeType SupportedMergeTypes {
             get { return SourceMergeType.All; }
         }
@@ -238,12 +238,12 @@ namespace Banshee.Playlist
             ServiceManager.DbConnection.Execute (add_track_command, DbId, track_id, MaxViewOrder);
             OnTracksAdded ();
         }
-        
+
         protected override void AddTrack (DatabaseTrackInfo track)
         {
             AddTrack (track.TrackId);
         }
-        
+
         public override bool AddSelectedTracks (Source source)
         {
             if (Parent == null || source == Parent || source.Parent == Parent) {
@@ -257,28 +257,28 @@ namespace Banshee.Playlist
             }
             return false;
         }
-        
+
         public virtual void ReorderSelectedTracks (int drop_row)
         {
             if (TrackModel.Selection.Count == 0 || TrackModel.Selection.AllSelected) {
                 return;
             }
-            
+
             TrackInfo track = TrackModel[drop_row];
             long order = track == null
                 ? ServiceManager.DbConnection.Query<long> ("SELECT MAX(ViewOrder) + 1 FROM CorePlaylistEntries WHERE PlaylistID = ?", DbId)
                 : ServiceManager.DbConnection.Query<long> ("SELECT ViewOrder FROM CorePlaylistEntries WHERE PlaylistID = ? AND EntryID = ?", DbId, Convert.ToInt64 (track.CacheEntryId));
-            
+
             // Make room for our new items
             if (track != null) {
                 ServiceManager.DbConnection.Execute ("UPDATE CorePlaylistEntries SET ViewOrder = ViewOrder + ? WHERE PlaylistID = ? AND ViewOrder >= ?",
                     TrackModel.Selection.Count, DbId, order
                 );
             }
-            
+
             HyenaSqliteCommand update_command = new HyenaSqliteCommand (String.Format ("UPDATE CorePlaylistEntries SET ViewOrder = ? WHERE PlaylistID = {0} AND EntryID = ?", DbId));
             HyenaSqliteCommand select_command = new HyenaSqliteCommand (String.Format ("SELECT ItemID FROM CoreCache WHERE ModelID = {0} LIMIT ?, ?", DatabaseTrackModel.CacheId));
-            
+
             // Reorder the selected items
             ServiceManager.DbConnection.BeginTransaction ();
             foreach (RangeCollection.Range range in TrackModel.Selection.Ranges) {
@@ -287,7 +287,7 @@ namespace Banshee.Playlist
                 }
             }
             ServiceManager.DbConnection.CommitTransaction ();
-            
+
             Reload ();
         }
 
@@ -347,7 +347,7 @@ namespace Banshee.Playlist
         {
             ClearTemporary ();
             using (HyenaDataReader reader = new HyenaDataReader (ServiceManager.DbConnection.Query (
-                @"SELECT PlaylistID, Name, SortColumn, SortType, PrimarySourceID, CachedCount, IsTemporary FROM CorePlaylists 
+                @"SELECT PlaylistID, Name, SortColumn, SortType, PrimarySourceID, CachedCount, IsTemporary FROM CorePlaylists
                     WHERE Special = 0 AND PrimarySourceID = ?", parent.DbId))) {
                 while (reader.Read ()) {
                     yield return new PlaylistSource (
@@ -372,24 +372,24 @@ namespace Banshee.Playlist
                 ServiceManager.DbConnection.CommitTransaction ();
             }
         }
-        
+
         private static int GetPlaylistId (string name)
         {
             return ServiceManager.DbConnection.Query<int> (
                 "SELECT PlaylistID FROM Playlists WHERE Name = ? LIMIT 1", name
             );
         }
-        
+
         private static bool PlaylistExists (string name)
         {
             return GetPlaylistId (name) > 0;
         }
-        
-        public static string CreateUniqueName () 
+
+        public static string CreateUniqueName ()
         {
             return NamingUtil.PostfixDuplicate (Catalog.GetString ("New Playlist"), PlaylistExists);
         }
-        
+
         public static string CreateUniqueName (IEnumerable tracks)
         {
             return NamingUtil.PostfixDuplicate (NamingUtil.GenerateTrackCollectionName (
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs
index 3c55602..7a8b012 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsfReferencePlaylistFormat.cs
@@ -42,7 +42,7 @@ namespace Banshee.Playlists.Formats
         public static readonly PlaylistFormatDescription FormatDescription = new PlaylistFormatDescription (
             typeof (AsfReferencePlaylistFormat), MagicHandler, Catalog.GetString ("Windows Media ASX"),
             "", new string [] {"video/x-ms-asx", "video/asx", "video/x-ms-asf"});
-        
+
         public static bool MagicHandler (StreamReader reader)
         {
             try {
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsxPlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsxPlaylistFormat.cs
index 1bad962..de0d008 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsxPlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/AsxPlaylistFormat.cs
@@ -35,17 +35,17 @@ using Mono.Unix;
 
 using Banshee.Base;
 using Banshee.Sources;
- 
+
 namespace Banshee.Playlists.Formats
 {
     // REFERENCE: http://msdn2.microsoft.com/en-us/library/ms925291.aspx
-    
+
     public class AsxPlaylistFormat : PlaylistFormatBase
     {
         public static readonly PlaylistFormatDescription FormatDescription = new PlaylistFormatDescription(
             typeof(AsxPlaylistFormat), MagicHandler, Catalog.GetString("Windows Media ASX (*.asx)"),
             "asx", new string [] {"video/x-ms-asx", "video/asx", "video/x-ms-asf"});
-        
+
         public static bool MagicHandler(StreamReader reader)
         {
             try {
@@ -56,51 +56,51 @@ namespace Banshee.Playlists.Formats
                 return false;
             }
         }
-        
+
         private static bool CheckAsxHeader(XmlTextReader xml_reader)
         {
             xml_reader.Read();
             if(xml_reader.NodeType == XmlNodeType.XmlDeclaration) {
                 xml_reader.Read();
             }
-                
-            return xml_reader.Depth == 0 && xml_reader.NodeType == XmlNodeType.Element 
+
+            return xml_reader.Depth == 0 && xml_reader.NodeType == XmlNodeType.Element
                 && String.Compare("asx", xml_reader.LocalName, true) == 0;
         }
-        
+
         public AsxPlaylistFormat()
         {
         }
-        
+
         public override void Load(StreamReader reader, bool validateHeader)
         {
             XmlTextReader xml_reader = new XmlTextReader(reader);
             xml_reader.WhitespaceHandling = WhitespaceHandling.None;
             xml_reader.EntityHandling = EntityHandling.ExpandCharEntities;
-            
+
             if(!CheckAsxHeader(xml_reader)) {
                 throw new InvalidPlaylistException();
             }
-            
+
             while(xml_reader.Read()) {
                 if(xml_reader.NodeType != XmlNodeType.Element || xml_reader.Depth != 1
                     || String.Compare(xml_reader.LocalName, "entry", true) != 0) {
                     continue;
                 }
-                
+
                 Dictionary<string, object> element = AddElement();
-                
+
                 do {
                     try {
                         xml_reader.Read();
                     } catch {
                         xml_reader.Skip();
                     }
-                    
+
                     if(xml_reader.NodeType != XmlNodeType.Element) {
                         continue;
                     }
-                    
+
                     switch(xml_reader.LocalName.ToLower()) {
                         case "title":
                             xml_reader.Read();
@@ -122,10 +122,10 @@ namespace Banshee.Playlists.Formats
                             }
                             break;
                     }
-                } while(!xml_reader.EOF && xml_reader.Depth > 1); 
+                } while(!xml_reader.EOF && xml_reader.Depth > 1);
             }
         }
-        
+
         public override void Save(Stream stream, ITrackModelSource source)
         {
             throw new NotImplementedException();
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/IPlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/IPlaylistFormat.cs
index 82be8de..a8076e5 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/IPlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/IPlaylistFormat.cs
@@ -38,12 +38,12 @@ namespace Banshee.Playlists.Formats
     {
         void Load(Stream stream, bool validateHeader);
         void Load(StreamReader reader, bool validateHeader);
-        
+
         void Save(Stream stream, ITrackModelSource source);
-        
+
         Dictionary<string, object> Attributes { get; }
         List<Dictionary<string, object>> Elements { get; }
-        
+
         Uri BaseUri { get; set; }
         string Title { get; set; }
     }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/InvalidPlaylistException.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/InvalidPlaylistException.cs
index f7b472f..a46e183 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/InvalidPlaylistException.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/InvalidPlaylistException.cs
@@ -35,7 +35,7 @@ namespace Banshee.Playlists.Formats
         public InvalidPlaylistException() : base()
         {
         }
-        
+
         public InvalidPlaylistException(string message) : base(message)
         {
         }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/M3uPlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/M3uPlaylistFormat.cs
index b827421..46bb44d 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/M3uPlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/M3uPlaylistFormat.cs
@@ -35,7 +35,7 @@ using Mono.Unix;
 using Banshee.Base;
 using Banshee.Collection;
 using Banshee.Sources;
- 
+
 namespace Banshee.Playlists.Formats
 {
     public class M3uPlaylistFormat : PlaylistFormatBase
@@ -43,36 +43,36 @@ namespace Banshee.Playlists.Formats
         public static readonly PlaylistFormatDescription FormatDescription = new PlaylistFormatDescription(
             typeof(M3uPlaylistFormat), MagicHandler, Catalog.GetString("MPEG Version 3.0 Extended (*.m3u)"),
             "m3u", new string [] {"audio/x-mpegurl", "audio/m3u", "audio/mpeg-url"});
-        
+
         public static bool MagicHandler(StreamReader reader)
         {
             string line = reader.ReadLine();
             if(line == null) {
                 return false;
             }
-            
+
             line = line.Trim();
             return line == "#EXTM3U" || line.StartsWith("http");
         }
-        
+
         public M3uPlaylistFormat()
         {
         }
-        
+
         public override void Load(StreamReader reader, bool validateHeader)
         {
             string line;
             Dictionary<string, object> element = null;
-                
+
             while((line = reader.ReadLine()) != null) {
                 line = line.Trim();
-               
+
                 if(line.Length == 0) {
                     continue;
                 }
-                    
+
                 bool extinf = line.StartsWith("#EXTINF:");
-                
+
                 if(!extinf && line[0] == '#') {
                     continue;
                 } else if(extinf) {
@@ -85,22 +85,22 @@ namespace Banshee.Playlists.Formats
                 } else if(element == null) {
                     element = AddElement();
                 }
-                    
+
                 try {
                     element["uri"] = ResolveUri(line);
                 } catch {
                     Elements.Remove(element);
                 }
-                
+
                 element = null;
             }
         }
-        
+
         private void ParseExtended(Dictionary<string, object> element, string line)
         {
             string split = line.Substring(8).TrimStart(',');
             string [] parts = split.Split(new char [] { ',' }, 2);
-            
+
             if(parts.Length == 2) {
                 element["duration"] = SecondsStringToTimeSpan(parts[0]);
                 element["title"] = parts[1].Trim();
@@ -108,7 +108,7 @@ namespace Banshee.Playlists.Formats
                 element["title"] = split.Trim();
             }
         }
-        
+
         public override void Save(Stream stream, ITrackModelSource source)
         {
             using(StreamWriter writer = new StreamWriter(stream)) {
@@ -120,7 +120,7 @@ namespace Banshee.Playlists.Formats
                     if(duration <= 0) {
                         duration = -1;
                     }
-                    
+
                     writer.WriteLine("#EXTINF:{0},{1} - {2}", duration, track.DisplayArtistName, track.DisplayTrackTitle);
                     writer.WriteLine(ExportUri(track.Uri));
                 }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatBase.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatBase.cs
index ca0e680..a6374c2 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatBase.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatBase.cs
@@ -41,56 +41,56 @@ namespace Banshee.Playlists.Formats
         private List<Dictionary<string, object>> elements = new List<Dictionary<string, object>>();
         private Uri base_uri = new Uri(Environment.CurrentDirectory);
         private string title = null;
-        
+
         public PlaylistFormatBase()
         {
             attributes = new Dictionary<string, object>();
             elements = new List<Dictionary<string, object>>();
         }
-        
+
         public virtual void Load(Stream stream, bool validateHeader)
         {
             using(StreamReader reader = new StreamReader(stream)) {
                 Load(reader, validateHeader);
             }
         }
-            
+
         public abstract void Load(StreamReader reader, bool validateHeader);
-        
+
         public abstract void Save(Stream stream, ITrackModelSource source);
-        
+
         protected virtual Dictionary<string, object> AddElement()
         {
             Dictionary<string, object> element = new Dictionary<string, object>();
             Elements.Add(element);
             return element;
         }
-        
+
         protected virtual Uri ResolveUri(string uri)
         {
             return BaseUri == null ? new Uri(uri) : new Uri(BaseUri, uri);
         }
-        
+
         protected virtual string ExportUri(SafeUri uri)
         {
             if(BaseUri == null) {
                 return uri.IsLocalPath ? uri.LocalPath : uri.AbsoluteUri;
             }
-            
+
             // TODO replace with call to Paths.MakeRelativeTo
             string base_uri = uri.IsLocalPath ? BaseUri.LocalPath : BaseUri.AbsoluteUri;
             string relative_uri = uri.IsLocalPath ? uri.LocalPath : uri.AbsoluteUri;
-            
+
             if(relative_uri.StartsWith(base_uri)) {
                 relative_uri = relative_uri.Substring(base_uri.Length);
                 if(relative_uri[0] == Path.DirectorySeparatorChar) {
                     relative_uri = relative_uri.Substring(1);
                 }
             }
-            
+
             return relative_uri;
         }
-        
+
         protected virtual TimeSpan SecondsStringToTimeSpan(string seconds)
         {
             try {
@@ -100,15 +100,15 @@ namespace Banshee.Playlists.Formats
                 return TimeSpan.Zero;
             }
         }
-        
-        public virtual Dictionary<string, object> Attributes { 
+
+        public virtual Dictionary<string, object> Attributes {
             get { return attributes; }
         }
-        
-        public virtual List<Dictionary<string, object>> Elements { 
+
+        public virtual List<Dictionary<string, object>> Elements {
             get { return elements; }
         }
-        
+
         public virtual Uri BaseUri {
             get { return base_uri; }
             set {
@@ -119,7 +119,7 @@ namespace Banshee.Playlists.Formats
                 base_uri = value;
             }
         }
-        
+
         public virtual string Title {
             get { return title; }
             set { title = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatDescription.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatDescription.cs
index 8a145aa..416cb61 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatDescription.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistFormatDescription.cs
@@ -31,7 +31,7 @@ using System;
 namespace Banshee.Playlists.Formats
 {
     public delegate bool PlaylistFormatMagicHandler(System.IO.StreamReader reader);
-    
+
     public class PlaylistFormatDescription
     {
         private Type type;
@@ -39,7 +39,7 @@ namespace Banshee.Playlists.Formats
         private string extension;
         private string [] mimetypes;
         private PlaylistFormatMagicHandler magic_handler;
-        
+
         public PlaylistFormatDescription(Type type, PlaylistFormatMagicHandler magic_handler, string name, string extension, string [] mimetypes)
         {
             this.type = type;
@@ -48,19 +48,19 @@ namespace Banshee.Playlists.Formats
             this.extension = extension;
             this.mimetypes = mimetypes;
         }
-        
+
         public Type Type {
             get { return type; }
         }
-        
+
         public PlaylistFormatMagicHandler MagicHandler {
             get { return magic_handler; }
         }
-        
+
         public string FormatName {
             get { return name; }
         }
-        
+
         public string FileExtension {
             get { return extension; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistParser.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistParser.cs
index f4714fd..73019e6 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistParser.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlaylistParser.cs
@@ -36,7 +36,7 @@ using System.Collections.Generic;
 using Banshee.Base;
 
 namespace Banshee.Playlists.Formats
-{   
+{
     public class PlaylistParser
     {
         private static PlaylistFormatDescription [] playlist_formats = new PlaylistFormatDescription [] {
@@ -46,15 +46,15 @@ namespace Banshee.Playlists.Formats
             AsfReferencePlaylistFormat.FormatDescription,
             XspfPlaylistFormat.FormatDescription
         };
-        
+
         private List<Dictionary<string, object>> elements;
         private Uri base_uri = new Uri (Environment.CurrentDirectory);
         private string title = null;
-        
+
         public PlaylistParser ()
         {
         }
-        
+
         public bool Parse (SafeUri uri)
         {
             ThreadAssist.AssertNotInMainThread ();
@@ -65,7 +65,7 @@ namespace Banshee.Playlists.Formats
                 Stream web_stream = null;
                 bool partial_read = false;
                 long saved_position = 0;
-                
+
                 if (uri.Scheme == "file") {
                     stream = Banshee.IO.File.OpenRead (uri);
                 } else if (uri.Scheme == "http") {
@@ -89,10 +89,10 @@ namespace Banshee.Playlists.Formats
                         }
                         request.Credentials = new NetworkCredential (username, password);
                     }
-            
+
                     response = (HttpWebResponse)request.GetResponse ();
                     web_stream = response.GetResponseStream ();
-                    
+
                     try {
                         stream = new MemoryStream ();
 
@@ -108,7 +108,7 @@ namespace Banshee.Playlists.Formats
                             stream.Write (buffer, 0, read);
                             saved_position = stream.Position;
                         }
-                        
+
                         stream.Position = 0;
                     } finally {
                         if (!partial_read) {
@@ -120,12 +120,12 @@ namespace Banshee.Playlists.Formats
                     Hyena.Log.DebugFormat ("Not able to parse playlist at {0}", uri);
                     return false;
                 }
-                                  
+
                 PlaylistFormatDescription matching_format = null;
 
                 foreach (PlaylistFormatDescription format in playlist_formats) {
                     stream.Position = 0;
-                    
+
                     StreamReader reader = new StreamReader (stream);
                     if (format.MagicHandler (reader)) {
                         matching_format = format;
@@ -151,22 +151,22 @@ namespace Banshee.Playlists.Formats
                 playlist.BaseUri = BaseUri;
                 playlist.Load (stream, false);
                 stream.Dispose ();
-                
+
                 elements = playlist.Elements;
                 Title = playlist.Title ?? Path.GetFileNameWithoutExtension (uri.LocalPath);
                 return true;
             }
         }
-        
+
         public List<Dictionary<string, object>> Elements {
             get { return elements; }
         }
-        
+
         public Uri BaseUri {
             get { return base_uri; }
             set { base_uri = value; }
         }
-        
+
         public string Title {
             get { return title; }
             set { title = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlsPlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlsPlaylistFormat.cs
index bb6900c..b5179ac 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlsPlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/PlsPlaylistFormat.cs
@@ -35,7 +35,7 @@ using Mono.Unix;
 using Banshee.Base;
 using Banshee.Collection;
 using Banshee.Sources;
- 
+
 namespace Banshee.Playlists.Formats
 {
     public class PlsPlaylistFormat : PlaylistFormatBase
@@ -46,49 +46,49 @@ namespace Banshee.Playlists.Formats
             Title,
             Length
         }
-        
+
         public static readonly PlaylistFormatDescription FormatDescription = new PlaylistFormatDescription(
             typeof(PlsPlaylistFormat), MagicHandler, Catalog.GetString("Shoutcast Playlist version 2 (*.pls)"),
             "pls", new string [] {"audio/x-scpls"});
-        
+
         public static bool MagicHandler(StreamReader reader)
         {
             string line = reader.ReadLine();
             if(line == null) {
                 return false;
             }
-            
+
             return line.Trim() == "[playlist]";
         }
-        
+
         public PlsPlaylistFormat()
         {
         }
-        
+
         public override void Load(StreamReader reader, bool validateHeader)
         {
             string line;
-            
+
             if(validateHeader && !MagicHandler(reader)) {
                 throw new InvalidPlaylistException();
             }
-           
+
             while((line = reader.ReadLine()) != null) {
                 line = line.Trim();
-                
+
                 if(line.Length == 0) {
                     continue;
                 }
-               
+
                 int eq_offset = line.IndexOf('=');
                 int index_offset = 0;
-               
+
                 if(eq_offset <= 0) {
                     continue;
                 }
-               
+
                 PlsType element_type = PlsType.Unknown;
-               
+
                 if(line.StartsWith("File")) {
                     element_type = PlsType.File;
                     index_offset = 4;
@@ -101,15 +101,15 @@ namespace Banshee.Playlists.Formats
                 } else {
                     continue;
                 }
-               
+
                 try {
-                    int index = Int32.Parse(line.Substring(index_offset, eq_offset - index_offset), 
+                    int index = Int32.Parse(line.Substring(index_offset, eq_offset - index_offset),
                         ApplicationContext.InternalCultureInfo.NumberFormat) - 1;
                     string value_string = line.Substring(eq_offset + 1).Trim();
                     Dictionary<string, object> element = index < Elements.Count
-                        ? Elements[index] 
+                        ? Elements[index]
                         : AddElement();
-                   
+
                     switch(element_type) {
                         case PlsType.File:
                             element["uri"] = ResolveUri(value_string);
@@ -126,24 +126,24 @@ namespace Banshee.Playlists.Formats
                 }
             }
         }
-        
+
         public override void Save(Stream stream, ITrackModelSource source)
         {
             using(StreamWriter writer = new StreamWriter(stream)) {
                 int count = 0;
-                
+
                 writer.WriteLine("[playlist]");
-                
+
                 TrackInfo track;
                 for (int i = 0; i < source.TrackModel.Count; i++) {
                     track = source.TrackModel[i];
                     count++;
-                    
+
                     writer.WriteLine("File{0}={1}", count, ExportUri(track.Uri));
                     writer.WriteLine("Title{0}={1} - {2}", count, track.DisplayArtistName, track.DisplayTrackTitle);
                     writer.WriteLine("Length{0}={1}", count, (int)Math.Round(track.Duration.TotalSeconds));
                 }
-                                
+
                 writer.WriteLine("NumberOfEntries={0}", count);
                 writer.WriteLine("Version=2");
             }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/Tests/PlaylistFormatTests.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/Tests/PlaylistFormatTests.cs
index 22e5c5e..fc94b4e 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/Tests/PlaylistFormatTests.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/Tests/PlaylistFormatTests.cs
@@ -55,9 +55,9 @@ namespace Banshee.Playlists.Formats.Tests
         public void Init()
         {
             Mono.Addins.AddinManager.Initialize (BinDir);
-            
+
             playlists_dir = Path.Combine (TestsDir, "Banshee.Services/playlist-data");
-            IPlaylistFormat playlist = LoadPlaylist(new M3uPlaylistFormat(), "extended.m3u");            
+            IPlaylistFormat playlist = LoadPlaylist(new M3uPlaylistFormat(), "extended.m3u");
             foreach(Dictionary<string, object> element in playlist.Elements) {
                 elements.Add(element);
             }
diff --git a/src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs b/src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs
index 2a2d557..5c0fe26 100644
--- a/src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlists.Formats/XspfPlaylistFormat.cs
@@ -33,7 +33,7 @@ using Mono.Unix;
 using Banshee.Collection;
 using Banshee.Sources;
 using Xspf = Media.Playlists.Xspf;
- 
+
 namespace Banshee.Playlists.Formats
 {
     public class XspfPlaylistFormat : PlaylistFormatBase
@@ -45,7 +45,7 @@ namespace Banshee.Playlists.Formats
             "xspf",
             new string [] {"application/xspf+xml"}
         );
-        
+
         public static bool MagicHandler (StreamReader stream)
         {
             try {
@@ -54,11 +54,11 @@ namespace Banshee.Playlists.Formats
                 return false;
             }
         }
-        
+
         public XspfPlaylistFormat ()
         {
         }
-        
+
         public override void Load (StreamReader stream, bool validateHeader)
         {
             Xspf.Playlist playlist = new Xspf.Playlist ();
@@ -70,7 +70,7 @@ namespace Banshee.Playlists.Formats
                 element["uri"] = track.GetLocationAt (0);
             }
         }
-        
+
         public override void Save (Stream stream, ITrackModelSource source)
         {
             Xspf.Playlist playlist = new Xspf.Playlist ();
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/Collection.cs b/src/Core/Banshee.Services/Banshee.Preferences/Collection.cs
index f8c6b7d..fd10743 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/Collection.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/Collection.cs
@@ -37,11 +37,11 @@ namespace Banshee.Preferences
     public class Collection<T> : Root, IList<T> where T : Root
     {
         private List<T> list = new List<T> ();
-        
+
         public Collection ()
         {
         }
-        
+
         public T Add (T item)
         {
             lock (this) {
@@ -53,18 +53,18 @@ namespace Banshee.Preferences
                 return item;
             }
         }
-        
+
         public T FindOrAdd (T item)
         {
             lock (this) {
                 return FindById (item.Id) ?? Add (item);
             }
         }
-        
+
         public T this[string id] {
             get { return FindById (id); }
         }
-        
+
         public T FindById (string id)
         {
             lock (this) {
@@ -73,7 +73,7 @@ namespace Banshee.Preferences
                         return item;
                     }
                 }
-                
+
                 return null;
             }
         }
@@ -99,16 +99,16 @@ namespace Banshee.Preferences
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region IList
 
         void IList<T>.Insert (int index, T item)
         {
             list.Insert (index, item);
         }
-        
+
         void IList<T>.RemoveAt (int index)
         {
             list.RemoveAt (index);
@@ -125,31 +125,31 @@ namespace Banshee.Preferences
         }
 
 #endregion
-        
+
 #region ICollection
 
         void ICollection<T>.Add (T item)
         {
             list.Add (item);
         }
-        
+
         public bool Remove (T item)
         {
             lock (this) {
                 return list.Remove (item);
             }
         }
-        
+
         void ICollection<T>.Clear ()
         {
             list.Clear ();
         }
-        
+
         bool ICollection<T>.Contains (T item)
         {
             return list.Contains (item);
         }
-        
+
         void ICollection<T>.CopyTo (T [] array, int arrayIndex)
         {
             list.CopyTo (array, arrayIndex);
@@ -158,7 +158,7 @@ namespace Banshee.Preferences
         public int Count {
             get { lock (this) { return list.Count; } }
         }
-        
+
         bool ICollection<T>.IsReadOnly {
             get { return ((ICollection<T>)list).IsReadOnly; }
         }
@@ -171,7 +171,7 @@ namespace Banshee.Preferences
         {
             return list.GetEnumerator ();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/Page.cs b/src/Core/Banshee.Services/Banshee.Preferences/Page.cs
index 702c9ea..6e7e938 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/Page.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/Page.cs
@@ -47,7 +47,7 @@ namespace Banshee.Preferences
         {
             child_pages = new Collection<Page> ();
         }
-        
+
         public Page (string id, string name, int order) : this ()
         {
             Id = id;
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/Preference.cs b/src/Core/Banshee.Services/Banshee.Preferences/Preference.cs
index 7f5310f..9f63459 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/Preference.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/Preference.cs
@@ -33,15 +33,15 @@ namespace Banshee.Preferences
     public class Preference<T> : PreferenceBase
     {
         private T value;
-        
+
         public Preference (string id, string name) : this (id, name, null)
         {
         }
-        
+
         public Preference (string id, string name, string description) : this (id, name, description, default (T))
         {
         }
-        
+
         public Preference (string id, string name, string description, T value)
         {
             Id = id;
@@ -49,7 +49,7 @@ namespace Banshee.Preferences
             Description = description;
             this.value = value;
         }
-        
+
         public virtual T Value {
             get { return this.value; }
             set {
@@ -57,7 +57,7 @@ namespace Banshee.Preferences
                 OnValueChanged ();
             }
         }
-        
+
         public override object BoxedValue {
             get { return (object)Value; }
             set { Value = (T)value; }
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/PreferenceBase.cs b/src/Core/Banshee.Services/Banshee.Preferences/PreferenceBase.cs
index 9263ef0..437b0a2 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/PreferenceBase.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/PreferenceBase.cs
@@ -31,15 +31,15 @@ using System;
 namespace Banshee.Preferences
 {
     public abstract class PreferenceBase : Root
-    {        
+    {
         public event Action<Root> ValueChanged;
 
         public PreferenceBase ()
         {
         }
-        
+
         public abstract object BoxedValue { get; set; }
-        
+
         private bool show_label = true;
         public virtual bool ShowLabel {
             get { return show_label; }
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs b/src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs
index 3a6b326..3b4d63d 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/PreferenceService.cs
@@ -42,7 +42,7 @@ namespace Banshee.Preferences
             add { install_widget_adapters += value; }
             remove { install_widget_adapters -= value; }
         }
-    
+
         public PreferenceService ()
         {
             // Pages (tabs)
@@ -52,17 +52,18 @@ namespace Banshee.Preferences
 
             // General policies
             Section policies = general.Add (new Section ("policies", Catalog.GetString ("File Policies"), 0));
-            
-            policies.Add (new SchemaPreference<bool> (LibrarySchema.CopyOnImport, 
+
+            policies.Add (new SchemaPreference<bool> (LibrarySchema.CopyOnImport,
                 Catalog.GetString ("Co_py files to media folders when importing")));
-            
-            policies.Add (Banshee.Metadata.SaveTrackMetadataService.WriteEnabled);
+
+            policies.Add (Banshee.Metadata.SaveTrackMetadataService.WriteMetadataEnabled);
+            policies.Add (Banshee.Metadata.SaveTrackMetadataService.WriteRatingsAndPlayCountsEnabled);
             policies.Add (Banshee.Metadata.SaveTrackMetadataService.RenameEnabled);
 
             // Misc section
             general.Add (new Section ("misc", Catalog.GetString ("Miscellaneous"), 20));
         }
-        
+
         public void RequestWidgetAdapters ()
         {
             EventHandler handler = install_widget_adapters;
@@ -70,7 +71,7 @@ namespace Banshee.Preferences
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         string IService.ServiceName {
             get { return "PreferenceService"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/Root.cs b/src/Core/Banshee.Services/Banshee.Preferences/Root.cs
index ed8bfbd..9cf2164 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/Root.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/Root.cs
@@ -31,7 +31,7 @@ using System;
 namespace Banshee.Preferences
 {
     public abstract class Root : IComparable
-    {    
+    {
         private string id;
         private string name;
         private string description;
@@ -42,20 +42,20 @@ namespace Banshee.Preferences
         private object mnemonic_widget;
 
         public event Action<Root> Changed;
-                
+
         public Root ()
         {
             sensitive = true;
             visible = true;
         }
-        
+
         public int CompareTo (object o)
         {
             Root r = o as Root;
             if (r == null) {
                 return -1;
             }
-            
+
             return Order.CompareTo (r.Order);
         }
 
@@ -63,7 +63,7 @@ namespace Banshee.Preferences
             get { return id; }
             set { id = value; }
         }
-        
+
         public string Name {
             get { return name; }
             set {
@@ -71,7 +71,7 @@ namespace Banshee.Preferences
                 OnChanged ();
             }
         }
-        
+
         public string Description {
             get { return description; }
             set {
@@ -79,12 +79,12 @@ namespace Banshee.Preferences
                 OnChanged ();
             }
         }
-        
+
         public int Order {
             get { return order; }
             set { order = value; }
         }
-        
+
         public virtual bool Sensitive {
             get { return sensitive; }
             set {
@@ -92,7 +92,7 @@ namespace Banshee.Preferences
                 OnChanged ();
             }
         }
-        
+
         public virtual bool Visible {
             get { return visible; }
             set {
@@ -100,7 +100,7 @@ namespace Banshee.Preferences
                 OnChanged ();
             }
         }
-        
+
         public virtual object DisplayWidget {
             get { return display_widget; }
             set { display_widget = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/SchemaPreference.cs b/src/Core/Banshee.Services/Banshee.Preferences/SchemaPreference.cs
index 416510f..3eb06e7 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/SchemaPreference.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/SchemaPreference.cs
@@ -38,26 +38,26 @@ namespace Banshee.Preferences
     {
         private SchemaEntry<T> schema;
         private SchemaPreferenceUpdatedHandler handler;
-        
+
         public SchemaPreference (SchemaEntry<T> schema, string name) : this (schema, name, null)
         {
         }
-        
-        public SchemaPreference (SchemaEntry<T> schema, string name, string description) 
+
+        public SchemaPreference (SchemaEntry<T> schema, string name, string description)
             : this (schema, name, description, null)
         {
         }
-        
-        public SchemaPreference (SchemaEntry<T> schema, string name, string description, SchemaPreferenceUpdatedHandler handler) 
+
+        public SchemaPreference (SchemaEntry<T> schema, string name, string description, SchemaPreferenceUpdatedHandler handler)
             : base (schema.Key, name, description)
         {
             this.schema = schema;
             this.handler = handler;
         }
-        
+
         public override T Value {
             get { return schema.Get (); }
-            set { 
+            set {
                 if (!schema.Set (value)) {
                     return;
                 }
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/Section.cs b/src/Core/Banshee.Services/Banshee.Preferences/Section.cs
index b1bca36..3812bc7 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/Section.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/Section.cs
@@ -44,7 +44,7 @@ namespace Banshee.Preferences
         public Section ()
         {
         }
-        
+
         public Section (string id, string name, int order)
         {
             Id = id;
diff --git a/src/Core/Banshee.Services/Banshee.Preferences/VoidPreference.cs b/src/Core/Banshee.Services/Banshee.Preferences/VoidPreference.cs
index 0e529d2..8bc11e8 100644
--- a/src/Core/Banshee.Services/Banshee.Preferences/VoidPreference.cs
+++ b/src/Core/Banshee.Services/Banshee.Preferences/VoidPreference.cs
@@ -35,7 +35,7 @@ namespace Banshee.Preferences
         public VoidPreference (string id) : base (id, null)
         {
         }
-        
+
         public VoidPreference (string id, string name) : base (id, name)
         {
         }
diff --git a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
index 9ef535b..a4c8485 100644
--- a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
+++ b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
@@ -45,12 +45,12 @@ namespace Banshee.Query
         QueryFieldSet FieldSet { get; }
         string GetSqlSort (string key, bool asc);
     }
-    
+
     public class QueryDefines : IQueryDefines
     {
-        
+
     }*/
-    
+
     public static class BansheeQuery
     {
         private static bool asc = true;
@@ -89,7 +89,7 @@ namespace Banshee.Query
             new QueryLimit ("MB",      Catalog.GetString ("MB"), "CoreTracks.FileSize", (int) FileSizeFactor.MB),
             new QueryLimit ("GB",      Catalog.GetString ("GB"), "CoreTracks.FileSize", (int) FileSizeFactor.GB)
         };
-        
+
 #region QueryField Definitions
 
         public static QueryField ArtistField = new QueryField (
@@ -102,7 +102,7 @@ namespace Banshee.Query
 
         public static QueryField AlbumArtistField = new QueryField (
             "albumartist", "DisplayAlbumArtistName",
-            Catalog.GetString ("Album Artist"), "CoreAlbums.ArtistNameLowered", true,
+            Catalog.GetString ("Album Artist"), "CoreAlbums.ArtistNameLowered", false,
             // Translators: These are unique search aliases for "album artist". You can use CSV for synonyms. Please, no spaces. Blank ok.
             Catalog.GetString ("albumartist"), Catalog.GetString ("compilationartist"),
             "albumartist", "compilationartist"
@@ -133,7 +133,7 @@ namespace Banshee.Query
             Catalog.GetString ("discs"), Catalog.GetString ("cds"),
             "discs", "cds"
         );
-        
+
         public static QueryField TrackNumberField = new QueryField (
             "track", "TrackNumber",
             // Translators: noun
@@ -329,14 +329,22 @@ namespace Banshee.Query
             Catalog.GetString ("score"),
             "score"
         );
-        
+
+        public static QueryField PlaybackErrorField = new QueryField (
+            "playbackerror", "PlaybackError",
+            Catalog.GetString ("Playback Error"), "CoreTracks.LastStreamError", typeof(PlaybackErrorQueryValue),
+            //Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+            Catalog.GetString ("playbackerror"),
+            "playbackerror", "error"
+        );
+
 #endregion
 
         public static QueryFieldSet FieldSet = new QueryFieldSet (
             ArtistField, AlbumField, AlbumArtistField, TitleField, TrackNumberField, TrackCountField, DiscNumberField, DiscCountField,
             YearField, GenreField, ComposerField, ConductorField, GroupingField, CommentField, LicenseUriField, RatingField, PlayCountField,
             SkipCountField, FileSizeField, UriField, DurationField, MimeTypeField, LastPlayedField, LastSkippedField,
-            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField, ScoreField
+            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField, ScoreField, PlaybackErrorField
         );
 
         // Type Initializer
@@ -364,40 +372,40 @@ namespace Banshee.Query
                 case "track":
                 case "grouping":
                     sort_query = String.Format (@"
-                        CoreAlbums.ArtistNameSortKey ASC, 
-                        CoreAlbums.TitleSortKey ASC, 
+                        CoreAlbums.ArtistNameSortKey ASC,
+                        CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber {0}", ascDesc); 
+                        CoreTracks.TrackNumber {0}", ascDesc);
                     break;
 
                 case "albumartist":
                     sort_query = String.Format (@"
-                        CoreAlbums.ArtistNameSortKey {0}, 
-                        CoreAlbums.TitleSortKey ASC, 
+                        CoreAlbums.ArtistNameSortKey {0},
+                        CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc); 
+                        CoreTracks.TrackNumber ASC", ascDesc);
                     break;
 
                 case "artist":
                     sort_query = String.Format (@"
-                        CoreArtists.NameSortKey {0}, 
+                        CoreArtists.NameSortKey {0},
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc); 
+                        CoreTracks.TrackNumber ASC", ascDesc);
                     break;
 
                 case "album":
                     sort_query = String.Format (@"
                         CoreAlbums.TitleSortKey {0},
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc); 
+                        CoreTracks.TrackNumber ASC", ascDesc);
                     break;
 
                 case "title":
                     sort_query = String.Format (@"
                         CoreTracks.TitleSortKey {0},
-                        CoreAlbums.ArtistNameSortKey ASC, 
-                        CoreAlbums.TitleSortKey ASC", ascDesc); 
+                        CoreAlbums.ArtistNameSortKey ASC,
+                        CoreAlbums.TitleSortKey ASC", ascDesc);
                     break;
 
                 case "random":
@@ -406,8 +414,8 @@ namespace Banshee.Query
 
                 case "disc":
                     sort_query = String.Format (@"
-                        CoreAlbums.ArtistNameSortKey ASC, 
-                        CoreAlbums.TitleSortKey ASC, 
+                        CoreAlbums.ArtistNameSortKey ASC,
+                        CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc {0},
                         CoreTracks.TrackNumber ASC", ascDesc);
                     break;
@@ -432,6 +440,12 @@ namespace Banshee.Query
                     );
                     break;
 
+                case "score":
+                    sort_query = String.Format (@"
+                        CoreTracks.Score {0},
+                        CoreTracks.Playcount {0}, {1}", ascDesc, default_sort);
+                    break;
+
                 case "year":
                 case "bitrate":
                 case "bpm":
@@ -439,7 +453,6 @@ namespace Banshee.Query
                 case "disccount":
                 case "duration":
                 case "rating":
-                case "score":
                 case "playcount":
                 case "skipcount":
                 case "filesize":
diff --git a/src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs b/src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs
new file mode 100644
index 0000000..4146c80
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Query/PlaybackErrorQueryValue.cs
@@ -0,0 +1,74 @@
+//
+// PlaybackErrorQueryValue.cs
+//
+// Author:
+//   Alexander Kojevnikov <alexander at kojevnikov.com>
+//
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+using Hyena.Query;
+
+using Banshee.Streaming;
+
+namespace Banshee.Query
+{
+    public class PlaybackErrorQueryValue : EnumQueryValue
+    {
+        private static AliasedObjectSet<EnumQueryValueItem> items = new AliasedObjectSet<EnumQueryValueItem>(
+            new EnumQueryValueItem (
+                (int)StreamPlaybackError.None, "None", Catalog.GetString ("None"),
+                //Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+                Catalog.GetString ("None"), Catalog.GetString ("none"), Catalog.GetString ("no"),
+                "None", "none", "no"),
+            new EnumQueryValueItem (
+                (int)StreamPlaybackError.ResourceNotFound, "ResourceNotFound", Catalog.GetString ("Resource Not Found"),
+                //Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+                Catalog.GetString ("ResourceNotFound"), Catalog.GetString ("missing"), Catalog.GetString ("notfound"),
+                "ResourceNotFound", "missing", "notfound"),
+            new EnumQueryValueItem (
+                (int)StreamPlaybackError.CodecNotFound, "CodecNotFound", Catalog.GetString ("CodecNotFound"),
+                //Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+                Catalog.GetString ("CodecNotFound"), Catalog.GetString ("nocodec"),
+                "CodecNotFound", "nocodec"),
+            new EnumQueryValueItem (
+                (int)StreamPlaybackError.Drm, "Drm", Catalog.GetString ("Drm"),
+                //Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+                Catalog.GetString ("Drm"), Catalog.GetString ("drm"),
+                "Drm", "drm"),
+            new EnumQueryValueItem (
+                (int)StreamPlaybackError.Unknown, "Unknown", Catalog.GetString ("Unknown"),
+                //Translators: These are unique strings for playback errors. Please, no spaces. Blank ok.
+                Catalog.GetString ("Unknown"), Catalog.GetString ("unknown"),
+                "Unknown", "unknown")
+        );
+
+        public override IEnumerable<EnumQueryValueItem> Items {
+            get { return items; }
+        }
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
index 67dfcd0..07279d2 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
@@ -39,17 +39,17 @@ using Banshee.Sources;
 using Banshee.Base;
 
 namespace Banshee.ServiceStack
-{    
+{
     public delegate bool ShutdownRequestHandler ();
     public delegate bool TimeoutHandler ();
     public delegate bool IdleHandler ();
     public delegate bool IdleTimeoutRemoveHandler (uint id);
-    public delegate uint TimeoutImplementationHandler (uint milliseconds, TimeoutHandler handler); 
+    public delegate uint TimeoutImplementationHandler (uint milliseconds, TimeoutHandler handler);
     public delegate uint IdleImplementationHandler (IdleHandler handler);
     public delegate bool IdleTimeoutRemoveImplementationHandler (uint id);
-    
+
     public static class Application
-    {   
+    {
         public static event ShutdownRequestHandler ShutdownRequested;
         public static event Action<Client> ClientAdded;
 
@@ -79,10 +79,10 @@ namespace Banshee.ServiceStack
         public static void Run ()
         {
             Banshee.Base.PlatformHacks.TrapMonoJitSegv ();
-            
+
             Catalog.Init (Application.InternalName, System.IO.Path.Combine (
                 Banshee.Base.Paths.InstalledApplicationDataRoot, "locale"));
-                
+
             if (!DBusConnection.ConnectTried) {
                 DBusConnection.Connect ();
             }
@@ -92,14 +92,14 @@ namespace Banshee.ServiceStack
             ServiceManager.SourceManager.AddSource (new MusicLibrarySource (), true);
             ServiceManager.SourceManager.AddSource (new VideoLibrarySource (), false);
             ServiceManager.SourceManager.LoadExtensionSources ();
-            
+
             Banshee.Base.PlatformHacks.RestoreMonoJitSegv ();
         }
 
         public static bool ShuttingDown {
             get { return shutting_down; }
         }
-     
+
         public static void Shutdown ()
         {
             shutting_down = true;
@@ -111,13 +111,13 @@ namespace Banshee.ServiceStack
                     return;
                 }
             }
-            
+
             if (OnShutdownRequested ()) {
                 Dispose ();
             }
             shutting_down = false;
         }
-        
+
         public static void PushClient (Client client)
         {
             lock (running_clients) {
@@ -130,16 +130,16 @@ namespace Banshee.ServiceStack
                 handler (client);
             }
         }
-        
+
         public static Client PopClient ()
         {
             lock (running_clients) {
                 return running_clients.Pop ();
             }
         }
-        
+
         public static Client ActiveClient {
-            get { lock (running_clients) { return running_clients.Peek (); } } 
+            get { lock (running_clients) { return running_clients.Peek (); } }
         }
 
         private static void OnClientStarted (Client client)
@@ -150,7 +150,7 @@ namespace Banshee.ServiceStack
                 handler (client);
             }
         }
-        
+
         private static bool OnShutdownRequested ()
         {
             ShutdownRequestHandler handler = ShutdownRequested;
@@ -161,10 +161,10 @@ namespace Banshee.ServiceStack
                     }
                 }
             }
-            
+
             return true;
         }
-        
+
         public static void Invoke (InvokeHandler handler)
         {
             RunIdle (delegate { handler (); return false; });
@@ -175,161 +175,161 @@ namespace Banshee.ServiceStack
             if (idle_handler == null) {
                 throw new NotImplementedException ("The application client must provide an IdleImplementationHandler");
             }
-            
+
             return idle_handler (handler);
         }
-        
+
         public static uint RunTimeout (uint milliseconds, TimeoutHandler handler)
         {
             if (timeout_handler == null) {
                 throw new NotImplementedException ("The application client must provide a TimeoutImplementationHandler");
             }
-            
+
             return timeout_handler (milliseconds, handler);
         }
-        
+
         public static bool IdleTimeoutRemove (uint id)
         {
             if (idle_timeout_remove_handler == null) {
                 throw new NotImplementedException ("The application client must provide a IdleTimeoutRemoveImplementationHandler");
             }
-            
+
             return idle_timeout_remove_handler (id);
         }
-        
+
         private static void Dispose ()
         {
             ServiceManager.JobScheduler.CancelAll (true);
             ServiceManager.Shutdown ();
-            
+
             lock (running_clients) {
                 while (running_clients.Count > 0) {
                     running_clients.Pop ().Dispose ();
                 }
             }
         }
-        
+
         private static ShutdownRequestHandler shutdown_prompt_handler = null;
         public static ShutdownRequestHandler ShutdownPromptHandler {
             get { return shutdown_prompt_handler; }
             set { shutdown_prompt_handler = value; }
         }
-        
+
         private static TimeoutImplementationHandler timeout_handler = null;
         public static TimeoutImplementationHandler TimeoutHandler {
             get { return timeout_handler; }
             set { timeout_handler = value; }
         }
-        
+
         private static IdleImplementationHandler idle_handler = null;
         public static IdleImplementationHandler IdleHandler {
             get { return idle_handler; }
             set { idle_handler = value; }
         }
-        
+
         private static IdleTimeoutRemoveImplementationHandler idle_timeout_remove_handler = null;
         public static IdleTimeoutRemoveImplementationHandler IdleTimeoutRemoveHandler {
             get { return idle_timeout_remove_handler; }
             set { idle_timeout_remove_handler = value; }
         }
-        
+
         public static string InternalName {
             get { return "banshee-1"; }
         }
-        
+
         public static string IconName {
             get { return "media-player-banshee"; }
         }
-        
+
         private static string api_version;
         public static string ApiVersion {
-            get { 
+            get {
                 if (api_version != null) {
                     return api_version;
                 }
-                
+
                 try {
                     AssemblyName name = Assembly.GetEntryAssembly ().GetName ();
-                    api_version = String.Format ("{0}.{1}.{2}", name.Version.Major, 
+                    api_version = String.Format ("{0}.{1}.{2}", name.Version.Major,
                         name.Version.Minor, name.Version.Build);
                 } catch {
                     api_version = "unknown";
                 }
-                
+
                 return api_version;
             }
         }
-        
+
         private static string version;
         public static string Version {
             get { return version ?? (version = GetVersion ("ReleaseVersion")); }
         }
-        
+
         private static string display_version;
         public static string DisplayVersion {
             get { return display_version ?? (display_version = GetVersion ("DisplayVersion")); }
         }
-        
+
         private static string build_time;
         public static string BuildTime {
             get { return build_time ?? (build_time = GetBuildInfo ("BuildTime")); }
         }
-        
+
         private static string build_host_os;
         public static string BuildHostOperatingSystem {
             get { return build_host_os ?? (build_host_os = GetBuildInfo ("HostOperatingSystem")); }
         }
-        
+
         private static string build_host_cpu;
         public static string BuildHostCpu {
             get { return build_host_cpu ?? (build_host_cpu = GetBuildInfo ("HostCpu")); }
         }
-        
+
         private static string build_vendor;
         public static string BuildVendor {
             get { return build_vendor ?? (build_vendor = GetBuildInfo ("Vendor")); }
         }
-        
+
         private static string build_display_info;
         public static string BuildDisplayInfo {
             get {
                 if (build_display_info != null) {
                     return build_display_info;
                 }
-                
+
                 build_display_info = String.Format ("{0} ({1}, {2}) @ {3}",
                     BuildVendor, BuildHostOperatingSystem, BuildHostCpu, BuildTime);
                 return build_display_info;
             }
         }
-        
+
         private static string GetVersion (string versionName)
         {
-            return GetCustomAssemblyMetadata ("ApplicationVersionAttribute", versionName) 
+            return GetCustomAssemblyMetadata ("ApplicationVersionAttribute", versionName)
                 ?? Catalog.GetString ("Unknown");
         }
-        
+
         private static string GetBuildInfo (string buildField)
         {
             return GetCustomAssemblyMetadata ("ApplicationBuildInformationAttribute", buildField);
         }
-        
+
         private static string GetCustomAssemblyMetadata (string attrName, string field)
         {
             Assembly assembly = Assembly.GetEntryAssembly ();
             if (assembly == null) {
                 return null;
             }
-            
+
             foreach (Attribute attribute in assembly.GetCustomAttributes (false)) {
                 Type type = attribute.GetType ();
                 PropertyInfo property = type.GetProperty (field);
-                if (type.Name == attrName && property != null && 
+                if (type.Name == attrName && property != null &&
                     property.PropertyType == typeof (string)) {
-                    return (string)property.GetValue (attribute, null); 
+                    return (string)property.GetValue (attribute, null);
                 }
             }
-            
+
             return null;
         }
     }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/BatchUserJob.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/BatchUserJob.cs
index eafc04e..2e0a6a1 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/BatchUserJob.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/BatchUserJob.cs
@@ -1,4 +1,4 @@
-// 
+//
 // BatchUserJob.cs
 //
 // Author:
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs
index cd02672..fd207d3 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/Client.cs
@@ -37,13 +37,13 @@ namespace Banshee.ServiceStack
         public Client ()
         {
         }
-        
+
         public virtual void Dispose ()
         {
         }
-        
+
         public abstract string ClientId {
-            get; 
+            get;
         }
 
         private bool is_started;
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusCommandService.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusCommandService.cs
index 2259bbd..dea0a81 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusCommandService.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusCommandService.cs
@@ -37,21 +37,21 @@ namespace Banshee.ServiceStack
     public class DBusCommandService : MarshalByRefObject, IDBusExportable
     {
         public event DBusCommandHandler ArgumentPushed;
-        
+
         public DBusCommandService ()
         {
         }
-        
+
         public void PushArgument (string argument, object value)
         {
             OnArgumentPushed (argument, value, false);
         }
-        
+
         public void PushFile (string file)
         {
             OnArgumentPushed (file, String.Empty, true);
         }
-        
+
         private void OnArgumentPushed (string argument, object value, bool isFile)
         {
             DBusCommandHandler handler = ArgumentPushed;
@@ -59,11 +59,11 @@ namespace Banshee.ServiceStack
                 handler (argument, value, isFile);
             }
         }
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string IService.ServiceName {
             get { return "DBusCommandService"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusConnection.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusConnection.cs
index 15214ed..ed3b969 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusConnection.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusConnection.cs
@@ -42,29 +42,29 @@ namespace Banshee.ServiceStack
         private const string BusPrefix = "org.bansheeproject";
         public const string DefaultServiceName = "Banshee";
         public const string DefaultBusName=  "org.bansheeproject.Banshee";
-    
+
         static DBusConnection ()
         {
             enabled = !ApplicationContext.CommandLine.Contains ("disable-dbus");
         }
-                    
-        private static List<string> active_connections = new List<string> (); 
-    
+
+        private static List<string> active_connections = new List<string> ();
+
         public static string MakeBusName (string serviceName)
         {
             return String.Format ("{0}.{1}", BusPrefix, serviceName);
         }
-    
+
         private static bool enabled;
         public static bool Enabled {
             get { return enabled; }
         }
-        
+
         private static bool connect_tried;
         public static bool ConnectTried {
             get { return connect_tried; }
         }
-        
+
         public static bool ApplicationInstanceAlreadyRunning {
             get {
                 try {
@@ -74,34 +74,34 @@ namespace Banshee.ServiceStack
                 }
             }
         }
-        
+
         public static bool ServiceIsConnected (string service)
         {
-            return active_connections.Contains (service);   
+            return active_connections.Contains (service);
         }
-        
+
         public static void Disconnect (string serviceName)
         {
             if (active_connections.Contains (serviceName)) {
                 active_connections.Remove (serviceName);
             }
-            
+
             Bus.Session.ReleaseName (MakeBusName (serviceName));
         }
-        
+
         public static bool Connect ()
         {
             return Connect (DefaultServiceName);
         }
-        
+
         public static bool Connect (string serviceName)
         {
             connect_tried = true;
-            
+
             if (!enabled) {
                 return false;
             }
-            
+
             try {
                 if (Connect (serviceName, true) == RequestNameReply.PrimaryOwner) {
                     active_connections.Add (serviceName);
@@ -111,10 +111,10 @@ namespace Banshee.ServiceStack
                 Log.Warning ("DBus support could not be started. Disabling for this session.");
                 enabled = false;
             }
-            
+
             return false;
         }
-        
+
         public static bool NameHasOwner (string serviceName)
         {
             try {
@@ -123,34 +123,34 @@ namespace Banshee.ServiceStack
                 return false;
             }
         }
-        
+
         private static RequestNameReply Connect (string serviceName, bool init)
         {
             connect_tried = true;
-            
+
             if (init) {
                 BusG.Init ();
             }
-            
+
             string bus_name = MakeBusName (serviceName);
             RequestNameReply name_reply = Bus.Session.RequestName (bus_name);
             Log.DebugFormat ("Bus.Session.RequestName ('{0}') replied with {1}", bus_name, name_reply);
             return name_reply;
         }
-        
+
         private static GLib.MainLoop mainloop;
-        
+
         public static void RunMainLoop ()
         {
             if (mainloop == null) {
                 mainloop = new GLib.MainLoop ();
             }
-            
+
             if (!mainloop.IsRunning) {
                 mainloop.Run ();
             }
         }
-        
+
         public static void QuitMainLoop ()
         {
             if (mainloop != null && mainloop.IsRunning) {
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
index 3a37a84..80bcbb6 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
@@ -31,7 +31,7 @@ using System.Text;
 using System.Text.RegularExpressions;
 using System.Collections.Generic;
 using System.Reflection;
-    
+
 using NDesk.DBus;
 using org.freedesktop.DBus;
 
@@ -53,72 +53,72 @@ namespace Banshee.ServiceStack
     {
         public const string ObjectRoot = "/org/bansheeproject/Banshee";
         private Dictionary<object, ObjectPath> registered_objects = new Dictionary<object, ObjectPath> ();
-        
+
         public static string MakeDBusSafeString (string str)
         {
             return str == null ? String.Empty : Regex.Replace (str, @"[^A-Za-z0-9]*", String.Empty);
         }
-        
+
         public static string MakeObjectPath (IDBusExportable o)
         {
             StringBuilder object_path = new StringBuilder ();
-            
+
             object_path.Append (ObjectRoot);
             object_path.Append ('/');
-            
+
             Stack<string> paths = new Stack<string> ();
-            
+
             IDBusExportable p = o.Parent;
-            
+
             while (p != null) {
                 paths.Push (String.Format ("{0}/", GetObjectName (p)));
                 p = p.Parent;
             }
-            
+
             while (paths.Count > 0) {
                 object_path.Append (paths.Pop ());
             }
-            
+
             object_path.Append (GetObjectName (o));
-            
+
             return object_path.ToString ();
         }
-        
+
         private static string GetObjectName (IDBusExportable o)
         {
             return o is IDBusObjectName ? ((IDBusObjectName)o).ExportObjectName : o.ServiceName;
         }
-        
+
         public static string [] MakeObjectPathArray<T> (IEnumerable<T> collection) where T : IDBusExportable
         {
             List<string> paths = new List<string> ();
-            
+
             foreach (IDBusExportable item in collection) {
                 paths.Add (MakeObjectPath (item));
             }
-            
+
             return paths.ToArray ();
         }
-        
+
         public ObjectPath RegisterObject (IDBusExportable o)
         {
             return RegisterObject (DBusConnection.DefaultServiceName, o);
         }
-        
+
         public ObjectPath RegisterObject (string serviceName, IDBusExportable o)
         {
             return RegisterObject (serviceName, o, MakeObjectPath (o));
         }
-        
+
         public ObjectPath RegisterObject (object o, string objectName)
         {
             return RegisterObject (DBusConnection.DefaultServiceName, o, objectName);
         }
-        
+
         public ObjectPath RegisterObject (string serviceName, object o, string objectName)
         {
             ObjectPath path = null;
-            
+
             if (DBusConnection.Enabled && Bus.Session != null) {
                 object [] attrs = o.GetType ().GetCustomAttributes (typeof (DBusExportableAttribute), true);
                 if (attrs != null && attrs.Length > 0) {
@@ -127,20 +127,20 @@ namespace Banshee.ServiceStack
                         serviceName = dbus_attr.ServiceName;
                     }
                 }
-            
+
                 lock (registered_objects) {
                     registered_objects.Add (o, path = new ObjectPath (objectName));
                 }
-                
+
                 string bus_name = DBusConnection.MakeBusName (serviceName);
-                
+
                 Log.DebugFormat ("Registering remote object {0} ({1}) on {2}", path, o.GetType (), bus_name);
-                
+
                 #pragma warning disable 0618
                 Bus.Session.Register (bus_name, path, o);
                 #pragma warning restore 0618
             }
-            
+
             return path;
         }
 
@@ -149,34 +149,34 @@ namespace Banshee.ServiceStack
             ObjectPath path = null;
             lock (registered_objects) {
                 if (!registered_objects.TryGetValue (o, out path)) {
-                    Log.WarningFormat ("Unable to unregister DBus object {0}, does not appear to be registered", 
+                    Log.WarningFormat ("Unable to unregister DBus object {0}, does not appear to be registered",
                         o.GetType ());
                     return;
                 }
-                
+
                 registered_objects.Remove (o);
             }
-        
+
             Bus.Session.Unregister (path);
         }
-        
+
         public static T FindInstance<T> (string objectPath) where T : class
         {
             return FindInstance<T> (DBusConnection.DefaultBusName, true, objectPath);
         }
-        
+
         public static T FindInstance<T> (string serviceName, string objectPath) where T : class
         {
             return FindInstance<T> (serviceName, false, objectPath);
         }
-        
+
         public static T FindInstance<T> (string serviceName, bool isFullBusName, string objectPath) where T : class
         {
             string busName = isFullBusName ? serviceName : DBusConnection.MakeBusName (serviceName);
             if (!DBusConnection.Enabled || !Bus.Session.NameHasOwner (busName)) {
                 return null;
             }
-            
+
             string full_object_path = objectPath;
             if (!objectPath.StartsWith (ObjectRoot)) {
                 full_object_path = ObjectRoot + objectPath;
@@ -184,7 +184,7 @@ namespace Banshee.ServiceStack
 
             return Bus.Session.GetObject<T> (busName, new ObjectPath (full_object_path));
         }
-        
+
         string IService.ServiceName {
             get { return "DBusServiceManager"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/DbIteratorJob.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/DbIteratorJob.cs
index 6ce6820..137cb5c 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/DbIteratorJob.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/DbIteratorJob.cs
@@ -131,7 +131,7 @@ namespace Banshee.ServiceStack
         {
             OnFinished ();
         }
-   
+
         protected abstract void IterateCore (HyenaDataReader reader);
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/IUserJob.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/IUserJob.cs
index 9a06cce..390e76a 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/IUserJob.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/IUserJob.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IUserJob.cs
 //
 // Author:
@@ -31,23 +31,23 @@ using System;
 using Hyena.Data;
 
 namespace Banshee.ServiceStack
-{   
+{
     public interface IUserJob
     {
         event EventHandler Finished;
         event EventHandler Updated;
-        
+
         void Cancel ();
-        
+
         string Title { get; }
         string Status { get; }
         double Progress { get; }
         string [] IconNames { get; }
         bool IsBackground { get; }
-        
-        string CancelMessage { get; }        
+
+        string CancelMessage { get; }
         bool CanCancel { get; }
-        
+
         bool IsFinished { get; }
         bool IsCancelRequested { get; }
         bool DelayShow { get; }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
index c5ccd62..0a77406 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
@@ -52,40 +52,40 @@ namespace Banshee.ServiceStack
         private static Stack<IService> dispose_services = new Stack<IService> ();
         private static List<Type> service_types = new List<Type> ();
         private static ExtensionNodeList extension_nodes;
-        
+
         private static bool is_initialized = false;
         private static readonly object self_mutex = new object ();
 
         public static event EventHandler StartupBegin;
         public static event EventHandler StartupFinished;
         public static event ServiceStartedHandler ServiceStarted;
-        
+
         public static void Initialize ()
         {
             Application.ClientStarted += OnClientStarted;
         }
-        
+
         public static void InitializeAddins ()
         {
-            AddinManager.Initialize (ApplicationContext.CommandLine.Contains ("uninstalled") 
+            AddinManager.Initialize (ApplicationContext.CommandLine.Contains ("uninstalled")
                 ? "." : Paths.ApplicationData);
-            
+
             IProgressStatus monitor = ApplicationContext.CommandLine.Contains ("debug-addins")
                 ? new ConsoleProgressStatus (true)
                 : null;
-        
+
             if (ApplicationContext.Debugging) {
                 AddinManager.Registry.Rebuild (monitor);
             } else {
                 AddinManager.Registry.Update (monitor);
             }
         }
-           
+
         public static void RegisterAddinServices ()
         {
             extension_nodes = AddinManager.GetExtensionNodes ("/Banshee/ServiceManager/Service");
         }
-        
+
         public static void RegisterDefaultServices ()
         {
             RegisterService<DBusServiceManager> ();
@@ -104,7 +104,7 @@ namespace Banshee.ServiceStack
             RegisterService<Banshee.Collection.Indexer.CollectionIndexerService> ();
             RegisterService<Banshee.Metadata.SaveTrackMetadataService> ();
         }
-        
+
         public static void DefaultInitialize ()
         {
             Initialize ();
@@ -117,50 +117,50 @@ namespace Banshee.ServiceStack
         {
             DelayedInitialize ();
         }
-        
+
         public static void Run()
         {
-            lock (self_mutex) {          
+            lock (self_mutex) {
                 OnStartupBegin ();
-                
+
                 uint cumulative_timer_id = Log.InformationTimerStart ();
-                
+
                 foreach (Type type in service_types) {
                     RegisterService (type);
                 }
-                
+
                 if (extension_nodes != null) {
                     foreach (TypeExtensionNode node in extension_nodes) {
                         StartExtension (node);
                     }
                 }
-                
+
                 if (AddinManager.IsInitialized) {
                     AddinManager.AddExtensionNodeHandler ("/Banshee/ServiceManager/Service", OnExtensionChanged);
                 }
-                
+
                 is_initialized = true;
-                
+
                 Log.InformationTimerPrint (cumulative_timer_id, "All services are started {0}");
-                
+
                 OnStartupFinished ();
             }
         }
-        
+
         private static IService RegisterService (Type type)
         {
             IService service = null;
-            
+
             try {
                 uint timer_id = Log.DebugTimerStart ();
                 service = (IService)Activator.CreateInstance (type);
                 RegisterService (service);
-                
+
                 Log.DebugTimerPrint (timer_id, String.Format (
                     "Core service started ({0}, {{0}})", service.ServiceName));
-                
+
                 OnServiceStarted (service);
-                
+
                 if (service is IDisposable) {
                     dispose_services.Push (service);
                 }
@@ -168,7 +168,7 @@ namespace Banshee.ServiceStack
                 if (service is IInitializeService) {
                     ((IInitializeService)service).Initialize ();
                 }
-                
+
                 return service;
             } catch (Exception e) {
                 if (service is IRequiredService) {
@@ -176,52 +176,52 @@ namespace Banshee.ServiceStack
                             service == null ? type.ToString () : service.ServiceName, false);
                     throw;
                 }
-                
-                Log.Warning (String.Format ("Service `{0}' not started: {1}", type.FullName, 
+
+                Log.Warning (String.Format ("Service `{0}' not started: {1}", type.FullName,
                     e.InnerException != null ? e.InnerException.Message : e.Message));
                 Log.Exception (e.InnerException ?? e);
             }
-            
+
             return null;
         }
-        
+
         private static void StartExtension (TypeExtensionNode node)
         {
             if (extension_services.ContainsKey (node.Path)) {
                 return;
             }
-        
+
             IExtensionService service = null;
-                    
+
             try {
                 uint timer_id = Log.DebugTimerStart ();
-                
+
                 service = (IExtensionService)node.CreateInstance (typeof (IExtensionService));
                 service.Initialize ();
                 RegisterService (service);
 
                 DelayedInitialize (service);
-            
+
                 Log.DebugTimerPrint (timer_id, String.Format (
                     "Extension service started ({0}, {{0}})", service.ServiceName));
-            
+
                 OnServiceStarted (service);
-                
+
                 extension_services.Add (node.Path, service);
-            
+
                 dispose_services.Push (service);
             } catch (Exception e) {
                 Log.Exception (e.InnerException ?? e);
-                Log.Warning (String.Format ("Extension `{0}' not started: {1}", 
+                Log.Warning (String.Format ("Extension `{0}' not started: {1}",
                     service == null ? node.Path : service.GetType ().FullName, e.Message));
             }
         }
-        
-        private static void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+
+        private static void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             lock (self_mutex) {
                 TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-                
+
                 if (args.Change == ExtensionChange.Add) {
                     StartExtension (node);
                 } else if (args.Change == ExtensionChange.Remove && extension_services.ContainsKey (node.Path)) {
@@ -229,9 +229,9 @@ namespace Banshee.ServiceStack
                     extension_services.Remove (node.Path);
                     services.Remove (service.ServiceName);
                     ((IDisposable)service).Dispose ();
-                    
+
                     Log.DebugFormat ("Extension service disposed ({0})", service.ServiceName);
-                    
+
                     // Rebuild the dispose stack excluding the extension service
                     IService [] tmp_services = new IService[dispose_services.Count - 1];
                     int count = tmp_services.Length;
@@ -258,7 +258,7 @@ namespace Banshee.ServiceStack
                 }
             }
         }
-        
+
         private static void DelayedInitialize (IService service)
         {
             try {
@@ -268,11 +268,11 @@ namespace Banshee.ServiceStack
                 }
             } catch (Exception e) {
                 Log.Exception (e.InnerException ?? e);
-                Log.Warning (String.Format ("Service `{0}' not initialized: {1}", 
+                Log.Warning (String.Format ("Service `{0}' not initialized: {1}",
                     service.GetType ().FullName, e.Message));
             }
         }
-        
+
         public static void Shutdown ()
         {
             lock (self_mutex) {
@@ -285,22 +285,22 @@ namespace Banshee.ServiceStack
                         Log.Exception (String.Format ("Service disposal ({0}) threw an exception", service.ServiceName), e);
                     }
                 }
-                
+
                 services.Clear ();
             }
         }
-        
+
         public static void RegisterService (IService service)
         {
             lock (self_mutex) {
                 services.Add (service.ServiceName, service);
-                
+
                 if(service is IDBusExportable) {
                     DBusServiceManager.RegisterObject ((IDBusExportable)service);
                 }
             }
         }
-        
+
         public static void RegisterService<T> () where T : IService
         {
             lock (self_mutex) {
@@ -311,7 +311,7 @@ namespace Banshee.ServiceStack
                 }
             }
         }
-        
+
         public static bool Contains (string serviceName)
         {
             lock (self_mutex) {
@@ -323,21 +323,21 @@ namespace Banshee.ServiceStack
         {
             return Contains (typeof (T).Name);
         }
-        
+
         public static IService Get (string serviceName)
         {
             if (services.ContainsKey (serviceName)) {
-                return services[serviceName]; 
+                return services[serviceName];
             }
-            
+
             return null;
         }
-        
+
         public static T Get<T> (string serviceName) where T : class, IService
         {
             return Get (serviceName) as T;
         }
-        
+
         public static T Get<T> () where T : class, IService
         {
             Type type = typeof (T);
@@ -345,10 +345,10 @@ namespace Banshee.ServiceStack
             if (service == null && type.GetInterface ("Banshee.ServiceStack.IRegisterOnDemandService") != null) {
                 return RegisterService (type) as T;
             }
-            
+
             return service;
         }
-        
+
         private static void OnStartupBegin ()
         {
             EventHandler handler = StartupBegin;
@@ -356,7 +356,7 @@ namespace Banshee.ServiceStack
                 handler (null, EventArgs.Empty);
             }
         }
-        
+
         private static void OnStartupFinished ()
         {
             EventHandler handler = StartupFinished;
@@ -364,7 +364,7 @@ namespace Banshee.ServiceStack
                 handler (null, EventArgs.Empty);
             }
         }
-        
+
         private static void OnServiceStarted (IService service)
         {
             ServiceStartedHandler handler = ServiceStarted;
@@ -372,23 +372,23 @@ namespace Banshee.ServiceStack
                 handler (new ServiceStartedArgs (service));
             }
         }
-        
+
         public static int StartupServiceCount {
             get { return service_types.Count + (extension_nodes == null ? 0 : extension_nodes.Count) + 1; }
         }
-        
+
         public static int ServiceCount {
             get { return services.Count; }
         }
-        
+
         public static bool IsInitialized {
             get { return is_initialized; }
         }
-        
+
         public static DBusServiceManager DBusServiceManager {
             get { return Get<DBusServiceManager> (); }
         }
-                
+
         public static BansheeDbConnection DbConnection {
             get { return (BansheeDbConnection)Get ("DbConnection"); }
         }
@@ -396,7 +396,7 @@ namespace Banshee.ServiceStack
         public static MediaProfileManager MediaProfileManager {
             get { return Get<MediaProfileManager> (); }
         }
-        
+
         public static SourceManager SourceManager {
             get { return (SourceManager)Get ("SourceManager"); }
         }
@@ -404,15 +404,15 @@ namespace Banshee.ServiceStack
         public static JobScheduler JobScheduler {
             get { return (JobScheduler)Get ("JobScheduler"); }
         }
-        
+
         public static PlayerEngineService PlayerEngine {
             get { return (PlayerEngineService)Get ("PlayerEngine"); }
         }
-        
+
         public static PlaybackControllerService PlaybackController {
             get { return (PlaybackControllerService)Get ("PlaybackController"); }
         }
-        
+
         public static HardwareManager HardwareManager {
             get { return Get<HardwareManager> (); }
         }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceStartedHandler.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceStartedHandler.cs
index d442e24..7af666f 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceStartedHandler.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceStartedHandler.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ServiceStartedHandler.cs
 //
 // Author:
@@ -31,16 +31,16 @@ using System;
 namespace Banshee.ServiceStack
 {
     public delegate void ServiceStartedHandler (ServiceStartedArgs args);
-    
+
     public class ServiceStartedArgs : EventArgs
     {
         private IService service;
-        
+
         public ServiceStartedArgs (IService service)
         {
             this.service = service;
         }
-        
+
         public IService Service {
             get { return service; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/TestUserJob.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/TestUserJob.cs
index 5109eeb..6d9060f 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/TestUserJob.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/TestUserJob.cs
@@ -1,4 +1,4 @@
-// 
+//
 // TestUserJob.cs
 //
 // Author:
@@ -38,32 +38,32 @@ namespace Banshee.ServiceStack
         private uint main_timeout_id = 0;
         private uint final_timeout_id = 0;
         private Random rand = new Random ();
-        
+
         private string [] icon_names_go = new string [] {
             "go-next", "go-down", "go-previous", "go-up"
         };
-        
+
         private string [] icon_names_rand = new string [] {
             "face-angel", "face-crying", "face-devilish", "face-glasses",
             "face-grin", "face-kiss", "face-monkey",  "face-plain",
             "face-sad", "face-smile-big", "face-smile", "face-surprise",
             "face-wink"
         };
-        
+
         public TestUserJob () : base ("UserJob Test Job", "Waiting for 7.5 seconds...")
         {
             CancelRequested += OnCancelRequested;
             DelayShow = true;
             Register ();
-            
+
             IconNames = new string [] { "media-eject" };
 
-            initial_timeout_id = Application.RunTimeout (7500, delegate {        
+            initial_timeout_id = Application.RunTimeout (7500, delegate {
                 Title = "New Title for Test Job";
-                
+
                 main_timeout_id = Application.RunTimeout (50, delegate {
                     Progress += 0.001;
-                    
+
                     if (Progress >= 0.45 && Progress <= 0.55) {
                         Status = null;
                     } else {
@@ -75,7 +75,7 @@ namespace Banshee.ServiceStack
                     } else if (Title == null) {
                         Title = "The final Title";
                     }
-                    
+
                     if (Progress >= 0.25 && Progress <= 0.35 && icon_timeout_id == 0) {
                         icon_timeout_id = Application.RunTimeout (100, delegate {
                             icon_index = (icon_index + 1) % icon_names_go.Length;
@@ -87,7 +87,7 @@ namespace Banshee.ServiceStack
                             return false;
                         });
                     }
-                    
+
                     if (Progress >= 0.45 && Progress <= 0.70 && icon_timeout_id == 0) {
                         icon_timeout_id = Application.RunTimeout (250, delegate {
                             icon_index = rand.Next (0, icon_names_rand.Length - 1);
@@ -99,9 +99,9 @@ namespace Banshee.ServiceStack
                             return false;
                         });
                     }
-                    
-                    CanCancel = (Progress >= 0.15 && Progress <= 0.30) || (Progress >= 0.65 && Progress <= 0.85); 
-                    
+
+                    CanCancel = (Progress >= 0.15 && Progress <= 0.30) || (Progress >= 0.65 && Progress <= 0.85);
+
                     if (Progress == 1.0) {
                         Progress = 0.0;
                         Title = "Bouncing";
@@ -110,43 +110,43 @@ namespace Banshee.ServiceStack
                             Finish ();
                             return false;
                         });
-                        
+
                         return false;
                     }
-                    
+
                     return true;
                 });
-                
+
                 return false;
             });
         }
-        
+
         private void OnCancelRequested (object o, EventArgs args)
         {
             if (initial_timeout_id > 0) {
                 Application.IdleTimeoutRemove (initial_timeout_id);
             }
-            
+
             if (main_timeout_id > 0) {
                 Application.IdleTimeoutRemove (main_timeout_id);
             }
-            
+
             if (icon_timeout_id > 0) {
                 Application.IdleTimeoutRemove (icon_timeout_id);
             }
-            
+
             if (final_timeout_id > 0) {
                 Application.IdleTimeoutRemove (final_timeout_id);
             }
-            
+
             OnFinished ();
         }
 
         public static void SpawnLikeFish (int count)
         {
             int i = 0;
-            Application.RunTimeout (2000, delegate { 
-                new TestUserJob (); 
+            Application.RunTimeout (2000, delegate {
+                new TestUserJob ();
                 return ++i < count;
             });
         }
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/UserJob.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/UserJob.cs
index 0e0320e..4a86c6d 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/UserJob.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/UserJob.cs
@@ -1,4 +1,4 @@
-// 
+//
 // UserJob.cs
 //
 // Author:
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/UserJobEventHandler.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/UserJobEventHandler.cs
index bd0f677..3fccb11 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/UserJobEventHandler.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/UserJobEventHandler.cs
@@ -1,4 +1,4 @@
-// 
+//
 // UserJobEventHandler.cs
 //
 // Author:
@@ -31,16 +31,16 @@ using System;
 namespace Banshee.ServiceStack
 {
     public delegate void UserJobEventHandler (object o, UserJobEventArgs args);
-    
+
     public class UserJobEventArgs : EventArgs
     {
         private IUserJob user_job;
-        
+
         public UserJobEventArgs (IUserJob job)
         {
             this.user_job = job;
         }
-        
+
         public IUserJob Job {
             get { return user_job; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
index 7a208f9..150aa14 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
@@ -386,7 +386,7 @@ namespace Banshee.SmartPlaylist
                 Catalog.GetString ("is not"),
                 QueryOperator.NotInSmartPlaylist
             );
-        
+
             // caution: the equal/not-equal operators for text fields (TextIs and TextNotIs) have to be defined
             // before the ones for non-text fields. Otherwise MatchesCondition will not return the right column names.
             // (because the regular expression for non-string fields machtes also for string fields)
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
index 64668df..eea45b0 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistDefinition.cs
@@ -29,7 +29,7 @@
 using System;
 
 using Hyena.Query;
- 
+
 using Banshee.Query;
 using Banshee.Sources;
 
@@ -55,7 +55,7 @@ namespace Banshee.SmartPlaylist
         {
         }
 
-        public SmartPlaylistDefinition (string name, string description, string condition, 
+        public SmartPlaylistDefinition (string name, string description, string condition,
             int limit_number, QueryLimit limit, QueryOrder order)
         {
             Name = name;
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
index 9322c33..7583bc6 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
@@ -37,7 +37,7 @@ using Mono.Unix;
 using Hyena;
 using Hyena.Query;
 using Hyena.Data.Sqlite;
- 
+
 using Banshee.Base;
 using Banshee.Query;
 using Banshee.Sources;
@@ -55,7 +55,7 @@ namespace Banshee.SmartPlaylist
     {
         private static List<SmartPlaylistSource> playlists = new List<SmartPlaylistSource> ();
         private static uint timeout_id = 0;
-        
+
         static SmartPlaylistSource () {
             Migrator.MigrateAll ();
 
@@ -65,13 +65,13 @@ namespace Banshee.SmartPlaylist
 
         private static string generic_name = Catalog.GetString ("Smart Playlist");
         private static string properties_label = Catalog.GetString ("Edit Smart Playlist");
-    
+
         private QueryOrder query_order;
         private QueryLimit limit;
         private IntegerQueryValue limit_value;
-        
+
         private List<SmartPlaylistSource> dependencies = new List<SmartPlaylistSource>();
-        
+
 
 #region Properties
 
@@ -116,7 +116,7 @@ namespace Banshee.SmartPlaylist
                 if (condition != null) {
                     condition_sql = condition.ToSql (BansheeQuery.FieldSet);
                     condition_xml = condition.ToXml (BansheeQuery.FieldSet);
-                    
+
                     foreach (QueryTermNode term in condition.GetTerms ()) {
                         if (!relevant_fields.Contains (term.Field))
                             relevant_fields.Add (term.Field);
@@ -176,7 +176,7 @@ namespace Banshee.SmartPlaylist
                 return (Limit != null && LimitValue != null && !LimitValue.IsEmpty && QueryOrder != null);
             }
         }
-        
+
         public override bool HasDependencies {
             get { return dependencies.Count > 0; }
         }
@@ -244,17 +244,17 @@ namespace Banshee.SmartPlaylist
         }
 
 #endregion
-        
+
 #region Private Methods
-        
+
         private void UpdateDependencies ()
         {
             foreach (SmartPlaylistSource s in dependencies) {
                 s.Updated -= OnDependencyUpdated;
             }
-            
+
             dependencies.Clear ();
-            
+
             if (ConditionTree != null) {
                 foreach (SmartPlaylistQueryValue value in ConditionTree.SearchForValues<SmartPlaylistQueryValue> ()) {
                     SmartPlaylistSource playlist = value.ObjectValue;
@@ -265,12 +265,12 @@ namespace Banshee.SmartPlaylist
                 }
             }
         }
-        
+
         private void OnDependencyUpdated (object sender, EventArgs args)
         {
             Reload ();
         }
-        
+
 #endregion
 
 #region AbstractPlaylist overrides
@@ -357,7 +357,7 @@ namespace Banshee.SmartPlaylist
 
         public void Refresh ()
         {
-            // Wipe the member list clean and repopulate it 
+            // Wipe the member list clean and repopulate it
             string reload_str = String.Format (
                 @"DELETE FROM CoreSmartPlaylistEntries WHERE SmartPlaylistID = {0};
                   INSERT INTO CoreSmartPlaylistEntries
@@ -374,7 +374,7 @@ namespace Banshee.SmartPlaylist
             if (IsLimited && !Limit.RowBased) {
                 // Identify where the cut off mark is
                 HyenaSqliteCommand limit_command = new HyenaSqliteCommand (String.Format (
-                    @"SELECT EntryID, {0} 
+                    @"SELECT EntryID, {0}
                       FROM CoreTracks, CoreSmartPlaylistEntries
                       WHERE SmartPlaylistID = {1} AND CoreSmartPlaylistEntries.TrackID = CoreTracks.TrackID
                       ORDER BY EntryID",
@@ -501,7 +501,7 @@ namespace Banshee.SmartPlaylist
                     } catch (Exception e) {
                         Log.Warning ("Ignoring Smart Playlist", String.Format ("Caught error: {0}", e), false);
                     }
-                    
+
                     if (playlist != null) {
                         yield return playlist;
                     }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
index d18906c..23c8f2c 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
@@ -65,7 +65,7 @@ namespace Banshee.Sources
         public DatabaseSource (string generic_name, string name, string id, int order) : this (generic_name, name, id, order, null)
         {
         }
-        
+
         public DatabaseSource (string generic_name, string name, string id, int order, Source parent) : base (generic_name, name, order, id)
         {
             if (parent != null) {
@@ -118,7 +118,7 @@ namespace Banshee.Sources
         private void DatabaseSourceInitialize ()
         {
             InitializeTrackModel ();
-            
+
             current_filters_schema = CreateSchema<string[]> ("current_filters");
 
             DatabaseSource filter_src = Parent as DatabaseSource ?? this;
@@ -255,7 +255,7 @@ namespace Banshee.Sources
         public virtual bool CanDeleteTracks {
             get { return true; }
         }
-        
+
         public virtual bool ConfirmRemoveTracks {
             get { return true; }
         }
@@ -275,8 +275,8 @@ namespace Banshee.Sources
         public TrackListModel TrackModel {
             get { return DatabaseTrackModel; }
         }
-        
-        public virtual bool ShowBrowser { 
+
+        public virtual bool ShowBrowser {
             get { return true; }
         }
 
@@ -299,31 +299,31 @@ namespace Banshee.Sources
         {
             return base.AcceptsUserInputFromSource (source) && CanAddTracks;
         }
-                
+
         public override bool HasViewableTrackProperties {
             get { return true; }
         }
-        
+
         public override bool HasEditableTrackProperties {
             get { return true; }
         }
 
 #endregion
-        
+
 #region Filters (aka Browsers)
-        
+
         private IList<IFilterListModel> available_filters;
         public IList<IFilterListModel> AvailableFilters {
             get { return available_filters ?? (available_filters = new List<IFilterListModel> ()); }
             protected set { available_filters = value; }
         }
-        
+
         private IList<IFilterListModel> default_filters;
         public IList<IFilterListModel> DefaultFilters {
             get { return default_filters ?? (default_filters = new List<IFilterListModel> ()); }
             protected set { default_filters = value; }
         }
-        
+
         private IList<IFilterListModel> current_filters;
         public IList<IFilterListModel> CurrentFilters {
             get {
@@ -349,7 +349,7 @@ namespace Banshee.Sources
             }
             protected set { current_filters = value; }
         }
-        
+
         public void ReplaceFilter (IFilterListModel old_filter, IFilterListModel new_filter)
         {
             int i = current_filters.IndexOf (old_filter);
@@ -358,7 +358,7 @@ namespace Banshee.Sources
                 SaveCurrentFilters ();
             }
         }
-        
+
         public void AppendFilter (IFilterListModel filter)
         {
             if (current_filters.IndexOf (filter) == -1) {
@@ -366,14 +366,14 @@ namespace Banshee.Sources
                 SaveCurrentFilters ();
             }
         }
-        
+
         public void RemoveFilter (IFilterListModel filter)
         {
             if (current_filters.Remove (filter)) {
                 SaveCurrentFilters ();
             }
         }
-        
+
         private void SaveCurrentFilters ()
         {
             Reload ();
@@ -387,13 +387,13 @@ namespace Banshee.Sources
                 }
                 current_filters_schema.Set (filters);
             }
-            
+
             EventHandler handler = FiltersChanged;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         private SchemaEntry<string[]> current_filters_schema;
 
 #endregion
@@ -418,7 +418,7 @@ namespace Banshee.Sources
         public virtual bool HasDependencies {
             get { return false; }
         }
-        
+
         public void RemoveTrack (int index)
         {
             if (index != -1) {
@@ -524,9 +524,9 @@ namespace Banshee.Sources
                 AddSelectedTracks (source);
             }
         }
-        
+
 #endregion
-        
+
 #region Protected Methods
 
         protected virtual void OnTracksAdded ()
@@ -590,7 +590,7 @@ namespace Banshee.Sources
                     if (track_model.CachesJoinTableEntries) {
                         rate_track_range_command = new HyenaSqliteCommand (String.Format (@"
                             UPDATE CoreTracks SET Rating = ?, DateUpdatedStamp = ? WHERE
-                                TrackID IN (SELECT TrackID FROM {0} WHERE 
+                                TrackID IN (SELECT TrackID FROM {0} WHERE
                                     {1} IN (SELECT ItemID FROM CoreCache WHERE ModelID = {2} LIMIT ?, ?))",
                             track_model.JoinTable, track_model.JoinPrimaryKey, track_model.CacheId
                         ));
@@ -612,7 +612,7 @@ namespace Banshee.Sources
             if (!ever_reloaded)
                 Reload ();
         }
-        
+
         public override void Deactivate ()
         {
             DatabaseTrackModel.InvalidateCache (false);
@@ -635,7 +635,7 @@ namespace Banshee.Sources
         {
             Log.ErrorFormat ("AddTrackRange not implemented by {0}", this);
         }
-        
+
         protected virtual void AddTrack (DatabaseTrackInfo track)
         {
             Log.ErrorFormat ("AddTrack not implemented by {0}", this);
diff --git a/src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs b/src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs
index 69e0911..4e4ac03 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/DurationStatusFormatters.cs
@@ -36,18 +36,18 @@ using Hyena;
 namespace Banshee.Sources
 {
     public delegate void DurationStatusFormatHandler (StringBuilder builder, TimeSpan span);
-    
+
     public class DurationStatusFormatters : List<DurationStatusFormatHandler>
     {
         private static StringBuilder default_builder = new StringBuilder ();
-        
+
         public DurationStatusFormatters ()
         {
             Add (AwesomeConciseFormatter);
             Add (AnnoyingPreciseFormatter);
             Add (ConfusingPreciseFormatter);
         }
-        
+
         public static string AwesomeConciseFormatter (TimeSpan span)
         {
             lock (default_builder) {
@@ -56,24 +56,24 @@ namespace Banshee.Sources
                 return default_builder.ToString ();
             }
         }
-        
+
         public static void AwesomeConciseFormatter (StringBuilder builder, TimeSpan span)
         {
             if (span.Days > 0) {
                 double days = span.Days + (span.Hours / 24.0);
-                builder.AppendFormat (Catalog.GetPluralString ("{0} day", "{0} days", 
+                builder.AppendFormat (Catalog.GetPluralString ("{0} day", "{0} days",
                     StringUtil.DoubleToPluralInt (days)), StringUtil.DoubleToTenthsPrecision (days));
             } else if (span.Hours > 0) {
                 double hours = span.Hours + (span.Minutes / 60.0);
-                builder.AppendFormat (Catalog.GetPluralString ("{0} hour", "{0} hours", 
+                builder.AppendFormat (Catalog.GetPluralString ("{0} hour", "{0} hours",
                     StringUtil.DoubleToPluralInt (hours)), StringUtil.DoubleToTenthsPrecision (hours));
             } else {
                 double minutes = span.Minutes + (span.Seconds / 60.0);
-                builder.AppendFormat (Catalog.GetPluralString ("{0} minute", "{0} minutes", 
+                builder.AppendFormat (Catalog.GetPluralString ("{0} minute", "{0} minutes",
                     StringUtil.DoubleToPluralInt (minutes)), StringUtil.DoubleToTenthsPrecision (minutes));
             }
         }
-        
+
         public static string AnnoyingPreciseFormatter (TimeSpan span)
         {
             lock (default_builder) {
@@ -82,14 +82,14 @@ namespace Banshee.Sources
                 return default_builder.ToString ();
             }
         }
-        
+
         public static void AnnoyingPreciseFormatter (StringBuilder builder, TimeSpan span)
         {
             if (span.Days > 0) {
                 builder.AppendFormat (Catalog.GetPluralString ("{0} day", "{0} days", span.Days), span.Days);
                 builder.Append (", ");
             }
-            
+
             if (span.Hours > 0) {
                 builder.AppendFormat (Catalog.GetPluralString ("{0} hour", "{0} hours", span.Hours), span.Hours);
                 builder.Append (", ");
@@ -99,7 +99,7 @@ namespace Banshee.Sources
             builder.Append (", ");
             builder.AppendFormat (Catalog.GetPluralString ("{0} second", "{0} seconds", span.Seconds), span.Seconds);
         }
-        
+
         public static string ConfusingPreciseFormatter (TimeSpan span)
         {
             lock (default_builder) {
@@ -108,7 +108,7 @@ namespace Banshee.Sources
                 return default_builder.ToString ();
             }
         }
-        
+
         public static void ConfusingPreciseFormatter (StringBuilder builder, TimeSpan span)
         {
             if (span.Days > 0) {
@@ -116,14 +116,14 @@ namespace Banshee.Sources
             } else if (span.Hours > 0) {
                 builder.AppendFormat ("{0}:", span.Hours);
             }
-            
+
             if (span.TotalHours < 1 || span.TotalMinutes < 1) {
                 builder.AppendFormat ("{0}:{1:00}", span.Minutes, span.Seconds);
             } else {
                 builder.AppendFormat ("{0:00}:{1:00}", span.Minutes, span.Seconds);
             }
         }
-        
+
         public static string ApproximateVerboseFormatter (TimeSpan span)
         {
             lock (default_builder) {
@@ -132,7 +132,7 @@ namespace Banshee.Sources
                 return default_builder.ToString ();
             }
         }
-        
+
         public static void ApproximateVerboseFormatter (StringBuilder builder, TimeSpan span)
         {
             if (span.Days > 0) {
diff --git a/src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs b/src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs
index 082db5a..3f1ab9a 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/ErrorSource.cs
@@ -40,10 +40,10 @@ namespace Banshee.Sources
     {
         private List<Message> messages = new List<Message> ();
         private Selection selection = new Selection ();
-        
+
         public event EventHandler Cleared;
         public event EventHandler Reloaded;
-        
+
         public ErrorSource (string name) : base (name, name, 0)
         {
             Properties.SetStringList ("Icon.Name", "dialog-error", "gtk-dialog-error");
@@ -57,7 +57,7 @@ namespace Banshee.Sources
             Parent.RemoveChildSource (this);
             return true;
         }
-        
+
         private void OnReloaded ()
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
@@ -67,7 +67,7 @@ namespace Banshee.Sources
                 }
             });
         }
-        
+
         private void OnCleared ()
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
@@ -77,46 +77,46 @@ namespace Banshee.Sources
                 }
             });
         }
-        
+
         private ColumnDescription [] columns = new ColumnDescription [] {
             new ColumnDescription ("Title", Catalog.GetString ("Error"), .35),
             new ColumnDescription ("Details", Catalog.GetString ("Details"), .65)
         };
-        
+
         public ColumnDescription [] ColumnDescriptions {
             get { return columns; }
         }
-        
+
         public override void Activate ()
         {
             Reload ();
         }
-        
+
         public void AddMessage (string title, string details)
         {
            AddMessage (new Message (title, details));
         }
-        
+
         public void AddMessage (Message message)
         {
             lock (this) {
                 messages.Add (message);
             }
-            
+
             OnUpdated ();
             OnReloaded ();
         }
-        
+
         public void Clear ()
         {
             lock (this) {
                 messages.Clear ();
             }
-            
+
             OnUpdated ();
             OnCleared ();
         }
-        
+
         public void Reload ()
         {
             OnReloaded ();
@@ -127,7 +127,7 @@ namespace Banshee.Sources
         }
 
         public bool CanReorder { get { return false; } }
-        
+
         public virtual bool CanUnmap {
             get { return true; }
         }
@@ -135,13 +135,13 @@ namespace Banshee.Sources
         public bool ConfirmBeforeUnmap {
             get { return false; }
         }
-        
+
         public object this[int index] {
             get {
                 if (index >= 0 && index < messages.Count) {
                     return messages[index];
-                } 
-                
+                }
+
                 return null;
             }
         }
@@ -149,22 +149,22 @@ namespace Banshee.Sources
         public Selection Selection {
             get { return selection; }
         }
-        
+
         public class Message
         {
             private string title;
             private string details;
-            
+
             public Message (string title, string details)
             {
                 this.title = title;
                 this.details = details;
             }
-            
+
             public string Title {
                 get { return title; }
             }
-            
+
             public string Details {
                 get { return details; }
             }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/IImportable.cs b/src/Core/Banshee.Services/Banshee.Sources/IImportable.cs
index aaacffa..92231f0 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/IImportable.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/IImportable.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Collections.Generic;
 
diff --git a/src/Core/Banshee.Services/Banshee.Sources/ISource.cs b/src/Core/Banshee.Services/Banshee.Sources/ISource.cs
index 77d0c4f..590c514 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/ISource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/ISource.cs
@@ -40,14 +40,14 @@ namespace Banshee.Sources
         void Activate();
         void Deactivate();
         void Rename(string name);
-        
+
         string Name { get; }
         string GenericName { get; }
         int Order { get; }
         int Count { get; }
-        
+
         string [] Children { get; }
-        
+
         // DBus Hack
         string TrackModelPath { get; }
 
diff --git a/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs b/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
index 2fde1c7..9b97854 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
@@ -38,7 +38,7 @@ namespace Banshee.Sources
     [Interface("org.bansheeproject.Banshee.SourceManager")]
     public interface ISourceManager : IDBusExportable
     {
-        //event SourceEventHandler SourceUpdated; 
+        //event SourceEventHandler SourceUpdated;
         ISource ActiveSource { get; set; }
         ISource DefaultSource { get; }
         string [] Sources { get; }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/MessageAction.cs b/src/Core/Banshee.Services/Banshee.Sources/MessageAction.cs
index caeb048..cb060dc 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/MessageAction.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/MessageAction.cs
@@ -34,21 +34,21 @@ namespace Banshee.Sources
     {
         private bool is_stock;
         private string label;
-        
+
         public event EventHandler Activated;
-        
+
         public MessageAction (string label) : this (label, false, null)
         {
         }
-        
+
         public MessageAction (string label, EventHandler handler) : this (label, false, handler)
         {
         }
-        
+
         public MessageAction (string label, bool isStock) : this (label, isStock, null)
         {
         }
-        
+
         public MessageAction (string label, bool isStock, EventHandler handler)
         {
             this.label = label;
@@ -57,12 +57,12 @@ namespace Banshee.Sources
                 this.Activated += handler;
             }
         }
-        
+
         public void Activate ()
         {
             OnActivated ();
         }
-        
+
         protected virtual void OnActivated ()
         {
             EventHandler handler = Activated;
@@ -70,12 +70,12 @@ namespace Banshee.Sources
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public bool IsStock {
             get { return is_stock; }
             set { is_stock = value; }
         }
-        
+
         public string Label {
             get { return label; }
             set { label = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
index f19049f..bdab989 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
@@ -79,7 +79,7 @@ namespace Banshee.Sources
     public abstract class PrimarySource : DatabaseSource, IDisposable
     {
         #region Functions that let us override some behavior of our DatabaseTrackInfos
-        
+
         private TrackEqualHandler track_equal_handler;
         public TrackEqualHandler TrackEqualHandler {
             get { return track_equal_handler; }
@@ -99,7 +99,7 @@ namespace Banshee.Sources
         }
 
         #endregion
-    
+
         protected ErrorSource error_source;
         protected bool error_source_visible = false;
 
@@ -116,7 +116,7 @@ namespace Banshee.Sources
             DELETE FROM CoreArtists WHERE ArtistID NOT IN (SELECT ArtistID FROM CoreTracks);
             DELETE FROM CoreAlbums WHERE AlbumID NOT IN (SELECT AlbumID FROM CoreTracks)
         ");
-        
+
         protected HyenaSqliteCommand purge_tracks_command = new HyenaSqliteCommand (@"
             DELETE FROM CoreTracks WHERE PrimarySourceId = ?
         ");
@@ -132,18 +132,18 @@ namespace Banshee.Sources
                 if (dbid > 0) {
                     return dbid;
                 }
-                
+
                 dbid = ServiceManager.DbConnection.Query<int> ("SELECT PrimarySourceID FROM CorePrimarySources WHERE StringID = ?", UniqueId);
                 if (dbid == 0) {
                     dbid = ServiceManager.DbConnection.Execute ("INSERT INTO CorePrimarySources (StringID) VALUES (?)", UniqueId);
                 } else {
                     SavedCount = ServiceManager.DbConnection.Query<int> ("SELECT CachedCount FROM CorePrimarySources WHERE PrimarySourceID = ?", dbid);
                 }
-                
+
                 if (dbid == 0) {
                     throw new ApplicationException ("dbid could not be resolved, this should never happen");
                 }
-                
+
                 return dbid;
             }
         }
@@ -175,17 +175,17 @@ namespace Banshee.Sources
             get { return is_local; }
             protected set { is_local = value; }
         }
-        
+
         private static SourceSortType[] sort_types = new SourceSortType[] {
             SortNameAscending,
             SortSizeAscending,
             SortSizeDescending
         };
-        
+
         public override SourceSortType[] ChildSortTypes {
             get { return sort_types; }
         }
-        
+
         public override SourceSortType DefaultChildSort {
             get { return SortNameAscending; }
         }
@@ -206,7 +206,7 @@ namespace Banshee.Sources
             get { return null; }
             protected set { base_dir_with_sep = null; }
         }
-        
+
         private string base_dir_with_sep;
         public string BaseDirectoryWithSeparator {
             get { return base_dir_with_sep ?? (base_dir_with_sep = BaseDirectory + System.IO.Path.DirectorySeparatorChar); }
@@ -264,7 +264,7 @@ namespace Banshee.Sources
             DatabaseTrackModel.AddCondition (String.Format ("CoreTracks.PrimarySourceID = {0}", DbId));
 
             primary_sources[DbId] = this;
-            
+
             // Load our playlists and smart playlists
             foreach (PlaylistSource pl in PlaylistSource.LoadAll (this)) {
                 AddChildSource (pl);
@@ -375,15 +375,6 @@ namespace Banshee.Sources
             get { return true; }
         }
 
-        public override void SetParentSource (Source source)
-        {
-            if (source is PrimarySource) {
-                throw new ArgumentException ("PrimarySource cannot have another PrimarySource as its parent");
-            }
-
-            base.SetParentSource (source);
-        }
-
         protected override void OnTracksAdded ()
         {
             ThreadAssist.SpawnFromMain (delegate {
@@ -431,7 +422,7 @@ namespace Banshee.Sources
         {
             OnTracksDeleted ();
         }
-        
+
         protected virtual void PurgeTracks ()
         {
             ServiceManager.DbConnection.Execute (purge_tracks_command, DbId);
@@ -464,7 +455,7 @@ namespace Banshee.Sources
 
             if (source.Count < 1)
                 return;
-            
+
             ThreadAssist.SpawnFromMain (delegate {
                 CachedList<DatabaseTrackInfo> list = CachedList<DatabaseTrackInfo>.CreateFromModel (source.DatabaseTrackModel);
                 DeleteTrackList (list);
@@ -476,7 +467,7 @@ namespace Banshee.Sources
             if (model == null || model.Count < 1) {
                 return;
             }
-            
+
             ThreadAssist.SpawnFromMain (delegate {
                 CachedList<DatabaseTrackInfo> list = CachedList<DatabaseTrackInfo>.CreateFromModelSelection (model);
                 DeleteTrackList (list);
@@ -521,7 +512,7 @@ namespace Banshee.Sources
                 delete_track_job.Finish ();
                 delete_track_job = null;
             }
-            
+
             if (skip_deletion != null) {
                 list.Remove (skip_deletion);
                 skip_deletion.Clear ();
@@ -532,7 +523,7 @@ namespace Banshee.Sources
             if (list.Count > 0) {
                 ServiceManager.DbConnection.Execute (remove_list_command, DateTime.Now, list.CacheId, list.CacheId);
             }
-            
+
             ThreadAssist.ProxyToMain (delegate {
                 OnTracksDeleted ();
                 OnUserNotifyUpdated ();
@@ -568,13 +559,13 @@ namespace Banshee.Sources
             }
             return true;
         }
-        
+
         public override bool AddAllTracks (Source source)
         {
             if (!AcceptsInputFromSource (source) || source.Count == 0) {
                 return false;
             }
-            
+
             DatabaseTrackListModel model = (source as ITrackModelSource).TrackModel as DatabaseTrackListModel;
             CachedList<DatabaseTrackInfo> cached_list = CachedList<DatabaseTrackInfo>.CreateFromModel (model);
             if (ThreadAssist.InMainThread) {
@@ -620,7 +611,7 @@ namespace Banshee.Sources
                     IncrementAddedTracks ();
                     break;
                 }
-                
+
                 if (track == null) {
                     IncrementAddedTracks ();
                     continue;
@@ -684,7 +675,7 @@ namespace Banshee.Sources
                 lock (this) {
                     if (add_track_job == null) {
                         add_track_job = new BatchUserJob (String.Format (Catalog.GetString (
-                            "Adding {0} of {1} to {2}"), "{0}", "{1}", Name), 
+                            "Adding {0} of {1} to {2}"), "{0}", "{1}", Name),
                             Properties.GetStringList ("Icon.Name"));
                         add_track_job.SetResources (Resource.Cpu, Resource.Database, Resource.Disk);
                         add_track_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
diff --git a/src/Core/Banshee.Services/Banshee.Sources/Source.cs b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
index a1c43cf..efccba7 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/Source.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
@@ -105,21 +105,21 @@ namespace Banshee.Sources
 
             properties.PropertyChanged += OnPropertyChanged;
             read_only_children = new ReadOnlyCollection<Source> (child_sources);
-            
+
             if (ApplicationContext.Debugging && ApplicationContext.CommandLine.Contains ("test-source-messages")) {
                 TestMessages ();
             }
 
             LoadSortSchema ();
         }
-        
+
         protected void OnSetupComplete ()
         {
             /*ITrackModelSource tm_source = this as ITrackModelSource;
             if (tm_source != null) {
                 tm_source.TrackModel.Parent = this;
                 ServiceManager.DBusServiceManager.RegisterObject (tm_source.TrackModel);
-                
+
                 // TODO if/when browsable models can be added/removed on the fly, this would need to change to reflect that
                 foreach (IListModel model in tm_source.FilterModels) {
                     Banshee.Collection.ExportableModel exportable = model as Banshee.Collection.ExportableModel;
@@ -145,19 +145,19 @@ namespace Banshee.Sources
                 }
             }
         }
-        
+
         protected void PauseSorting ()
         {
             sort_children = false;
         }
-        
+
         protected void ResumeSorting ()
         {
             sort_children = true;
         }
 
 #region Public Methods
-        
+
         public virtual void Activate ()
         {
         }
@@ -170,7 +170,7 @@ namespace Banshee.Sources
         {
             properties.SetString ("Name", newName);
         }
-        
+
         public virtual bool AcceptsInputFromSource (Source source)
         {
             return false;
@@ -180,28 +180,28 @@ namespace Banshee.Sources
         {
             return AcceptsInputFromSource (source);
         }
-        
+
         public virtual void MergeSourceInput (Source source, SourceMergeType mergeType)
         {
             Log.ErrorFormat ("MergeSourceInput not implemented by {0}", this);
         }
-        
+
         public virtual SourceMergeType SupportedMergeTypes {
             get { return SourceMergeType.None; }
         }
-        
+
         public virtual void SetParentSource (Source parent)
         {
             this.parent = parent;
         }
-        
+
         public virtual bool ContainsChildSource (Source child)
         {
             lock (Children) {
                 return child_sources.Contains (child);
             }
         }
-        
+
         public virtual void AddChildSource (Source child)
         {
             lock (Children) {
@@ -219,19 +219,19 @@ namespace Banshee.Sources
                 if (child.Children.Count > 0) {
                     child.ClearChildSources ();
                 }
-                
+
                 child_sources.Remove (child);
-                
+
                 if (ServiceManager.SourceManager.ActiveSource == child) {
                     if (CanActivate) {
                         ServiceManager.SourceManager.SetActiveSource (this);
                     }
                 }
-                
+
                 OnChildSourceRemoved (child);
             }
         }
-        
+
         public virtual void ClearChildSources ()
         {
             lock (Children) {
@@ -264,7 +264,7 @@ namespace Banshee.Sources
                 }
                 sort_children = false;
             }
-            
+
             if (child_sort != null && child_sort.SortType != SortType.None) {
                 lock (Children) {
                     child_sort.Sort (child_sources, SeparateChildrenByType);
@@ -277,7 +277,7 @@ namespace Banshee.Sources
             }
             sort_children = true;
         }
-        
+
         private void LoadSortSchema ()
         {
             if (ChildSortTypes.Length == 0) {
@@ -288,7 +288,7 @@ namespace Banshee.Sources
                 Hyena.Log.WarningFormat ("Trying to LoadSortSchema, but source's id not set! {0}", UniqueId);
                 return;
             }
-            
+
             child_sort_schema = CreateSchema<string> ("child_sort_id", DefaultChildSort.Id, "", "");
             string child_sort_id = child_sort_schema.Get ();
             foreach (SourceSortType sort_type in ChildSortTypes) {
@@ -306,20 +306,20 @@ namespace Banshee.Sources
         {
             return propagate ? GetInheritedProperty<T> (name) : Properties.Get<T> (name);
         }
-        
+
         public T GetInheritedProperty<T> (string name)
         {
             return Properties.Contains (name)
                 ? Properties.Get<T> (name)
-                : Parent != null 
+                : Parent != null
                     ? Parent.GetInheritedProperty<T> (name)
                     : default (T);
         }
-        
+
 #endregion
-        
+
 #region Protected Methods
-        
+
         public virtual void SetStatus (string message, bool error)
         {
             SetStatus (message, !error, !error, error ? "dialog-error" : null);
@@ -332,17 +332,18 @@ namespace Banshee.Sources
                     status_message = new SourceMessage (this);
                     PushMessage (status_message);
                 }
-            
+
                 string status_name = String.Format ("<i>{0}</i>", GLib.Markup.EscapeText (Name));
-                
+
                 status_message.FreezeNotify ();
                 status_message.Text = String.Format (GLib.Markup.EscapeText (message), status_name);
                 status_message.CanClose = can_close;
                 status_message.IsSpinning = is_spinning;
                 status_message.SetIconName (icon_name);
+                status_message.IsHidden = false;
                 status_message.ClearActions ();
             }
-                
+
             status_message.ThawNotify ();
         }
 
@@ -363,10 +364,10 @@ namespace Banshee.Sources
                 messages.Insert (0, message);
                 message.Updated += HandleMessageUpdated;
             }
-            
+
             OnMessageNotify ();
         }
-        
+
         protected virtual SourceMessage PopMessage ()
         {
             try {
@@ -377,14 +378,14 @@ namespace Banshee.Sources
                         messages.RemoveAt (0);
                         return message;
                     }
-                    
+
                     return null;
                 }
             } finally {
                 OnMessageNotify ();
             }
         }
-        
+
         protected virtual void ClearMessages ()
         {
             lock (this) {
@@ -395,14 +396,16 @@ namespace Banshee.Sources
                     messages.Clear ();
                     OnMessageNotify ();
                 }
+
+                status_message = null;
             }
         }
-        
+
         private void TestMessages ()
         {
             int count = 0;
             SourceMessage message_3 = null;
-            
+
             Application.RunTimeout (5000, delegate {
                 if (count++ > 5) {
                     if (count == 7) {
@@ -413,7 +416,7 @@ namespace Banshee.Sources
                 } else if (count > 10) {
                     return false;
                 }
-                
+
                 SourceMessage message = new SourceMessage (this);
                 message.FreezeNotify ();
                 message.Text = String.Format ("Testing message {0}", count);
@@ -424,18 +427,18 @@ namespace Banshee.Sources
                         message.AddAction (new MessageAction (String.Format ("Button {0}", i)));
                     }
                 }
-                    
+
                 message.ThawNotify ();
                 PushMessage (message);
-                
+
                 if (count == 3) {
                     message_3 = message;
                 }
-                
+
                 return true;
             });
         }
-        
+
         protected virtual void RemoveMessage (SourceMessage message)
         {
             lock (this) {
@@ -443,14 +446,14 @@ namespace Banshee.Sources
                     message.Updated -= HandleMessageUpdated;
                     OnMessageNotify ();
                 }
-            }   
+            }
         }
 
         private void HandleMessageUpdated (object o, EventArgs args)
         {
             OnMessageNotify ();
         }
-        
+
         protected virtual void OnMessageNotify ()
         {
             EventHandler handler = MessageNotify;
@@ -458,7 +461,7 @@ namespace Banshee.Sources
                 handler (this, EventArgs.Empty);
             }
         }
-    
+
         protected virtual void OnChildSourceAdded (Source source)
         {
             SortChildSources ();
@@ -472,7 +475,7 @@ namespace Banshee.Sources
                 }
             });
         }
-        
+
         protected virtual void OnChildSourceRemoved (Source source)
         {
             source.Updated -= OnChildSourceUpdated;
@@ -485,7 +488,7 @@ namespace Banshee.Sources
                 }
             });
         }
-        
+
         protected virtual void OnUpdated ()
         {
             EventHandler handler = Updated;
@@ -493,7 +496,7 @@ namespace Banshee.Sources
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnChildSourceUpdated (object o, EventArgs args)
         {
             SortChildSources ();
@@ -513,24 +516,24 @@ namespace Banshee.Sources
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region Private Methods
-        
+
         private void OnPropertyChanged (object o, PropertyChangeEventArgs args)
         {
             OnUpdated ();
         }
-        
+
 #endregion
-        
+
 #region Public Properties
-        
+
         public ReadOnlyCollection<Source> Children {
             get { return read_only_children; }
         }
-        
+
         string [] ISource.Children {
             get { return null; }
         }
@@ -542,7 +545,7 @@ namespace Banshee.Sources
         public virtual string TypeName {
             get { return GetType ().Name; }
         }
-        
+
         private string unique_id;
         public string UniqueId {
             get {
@@ -552,7 +555,7 @@ namespace Banshee.Sources
                 return unique_id ?? (unique_id = String.Format ("{0}-{1}", this.GetType ().Name, TypeUniqueId));
             }
         }
-        
+
         private string type_unique_id;
         protected string TypeUniqueId {
             get { return type_unique_id; }
@@ -566,11 +569,11 @@ namespace Banshee.Sources
         public virtual bool HasProperties {
             get { return false; }
         }
-        
+
         public virtual bool HasViewableTrackProperties {
             get { return false; }
         }
-        
+
         public virtual bool HasEditableTrackProperties {
             get { return false; }
         }
@@ -584,12 +587,12 @@ namespace Banshee.Sources
             get { return properties.Get<string> ("GenericName"); }
             set { properties.SetString ("GenericName", value); }
         }
-        
+
         public int Order {
             get { return properties.GetInteger ("Order"); }
             set { properties.SetInteger ("Order", value); }
         }
-        
+
         public SourceMessage CurrentMessage {
             get { lock (this) { return messages.Count > 0 ? messages[0] : null; } }
         }
@@ -597,38 +600,38 @@ namespace Banshee.Sources
         public virtual bool ImplementsCustomSearch {
             get { return false; }
         }
-        
+
         public virtual bool CanSearch {
             get { return false; }
         }
-                
+
         public virtual string FilterQuery {
             get { return properties.Get<string> ("FilterQuery"); }
             set { properties.SetString ("FilterQuery", value); }
         }
-        
+
         public TrackFilterType FilterType {
             get { return (TrackFilterType)properties.GetInteger ("FilterType"); }
             set { properties.SetInteger ("FilterType", (int)value); }
         }
-        
+
         public virtual bool Expanded {
             get { return properties.GetBoolean ("Expanded"); }
             set { properties.SetBoolean ("Expanded", value); }
         }
-        
+
         public virtual bool? AutoExpand {
             get { return true; }
         }
-        
+
         public virtual PropertyStore Properties {
             get { return properties; }
         }
-        
+
         public virtual bool CanActivate {
             get { return true; }
         }
-        
+
         public virtual int Count {
             get { return 0; }
         }
@@ -649,35 +652,35 @@ namespace Banshee.Sources
         }
 
         public virtual int FilteredCount { get { return Count; } }
-                
+
         public virtual string TrackModelPath {
             get { return null; }
         }
-        
+
         public static readonly SourceSortType SortNameAscending = new SourceSortType (
             "NameAsc",
             Catalog.GetString ("Name"),
             SortType.Ascending, null); // null comparer b/c we already fall back to sorting by name
-        
+
         public static readonly SourceSortType SortSizeAscending = new SourceSortType (
             "SizeAsc",
             Catalog.GetString ("Size Ascending"),
             SortType.Ascending, new SizeComparer ());
-        
+
         public static readonly SourceSortType SortSizeDescending = new SourceSortType (
             "SizeDesc",
             Catalog.GetString ("Size Descending"),
             SortType.Descending, new SizeComparer ());
-        
+
         private static SourceSortType[] sort_types = new SourceSortType[] {};
         public virtual SourceSortType[] ChildSortTypes {
             get { return sort_types; }
         }
-        
+
         public SourceSortType ActiveChildSort {
             get { return child_sort; }
         }
-        
+
         public virtual SourceSortType DefaultChildSort {
             get { return null; }
         }
@@ -689,38 +692,38 @@ namespace Banshee.Sources
                 SortChildSources ();
             }
         }
-        
+
 #endregion
 
-#region Status Message Stuff        
-        
+#region Status Message Stuff
+
         private static DurationStatusFormatters duration_status_formatters = new DurationStatusFormatters ();
         public static DurationStatusFormatters DurationStatusFormatters {
             get { return duration_status_formatters; }
         }
-        
+
         protected virtual int StatusFormatsCount {
             get { return duration_status_formatters.Count; }
         }
-        
+
         public virtual int CurrentStatusFormat {
             get { return ConfigurationClient.Get<int> (String.Format ("sources.{0}", ParentConfigurationId), "status_format", 0); }
             set { ConfigurationClient.Set<int> (String.Format ("sources.{0}", ParentConfigurationId), "status_format", value); }
         }
-        
+
         public SchemaEntry<T> CreateSchema<T> (string name)
         {
             return CreateSchema<T> (name, default(T), null, null);
         }
-        
+
         public SchemaEntry<T> CreateSchema<T> (string name, T defaultValue, string shortDescription, string longDescription)
         {
-            return new SchemaEntry<T> (String.Format ("sources.{0}", ParentConfigurationId), name, defaultValue, shortDescription, longDescription); 
+            return new SchemaEntry<T> (String.Format ("sources.{0}", ParentConfigurationId), name, defaultValue, shortDescription, longDescription);
         }
-        
+
         public SchemaEntry<T> CreateSchema<T> (string ns, string name, T defaultValue, string shortDescription, string longDescription)
         {
-            return new SchemaEntry<T> (String.Format ("sources.{0}.{1}", ParentConfigurationId, ns), name, defaultValue, shortDescription, longDescription); 
+            return new SchemaEntry<T> (String.Format ("sources.{0}.{1}", ParentConfigurationId, ns), name, defaultValue, shortDescription, longDescription);
         }
 
         public virtual string PreferencesPageId {
@@ -740,7 +743,7 @@ namespace Banshee.Sources
             if (new_status_format >= StatusFormatsCount) {
                 new_status_format = 0;
             }
-            
+
             CurrentStatusFormat = new_status_format;
         }
 
@@ -750,16 +753,19 @@ namespace Banshee.Sources
             StringBuilder builder = new StringBuilder ();
 
             int count = FilteredCount;
-            
+
             if (count == 0) {
                 return String.Empty;
             }
-            
+
             builder.AppendFormat (Catalog.GetPluralString ("{0} item", "{0} items", count), count);
-            
+
             if (this is IDurationAggregator && StatusFormatsCount > 0) {
-                builder.Append (STATUS_BAR_SEPARATOR);
-                duration_status_formatters[CurrentStatusFormat] (builder, ((IDurationAggregator)this).Duration);
+                var duration = ((IDurationAggregator)this).Duration;
+                if (duration > TimeSpan.Zero) {
+                    builder.Append (STATUS_BAR_SEPARATOR);
+                    duration_status_formatters[CurrentStatusFormat] (builder, ((IDurationAggregator)this).Duration);
+                }
             }
 
             if (this is IFileSizeAggregator) {
@@ -769,21 +775,21 @@ namespace Banshee.Sources
                     builder.AppendFormat (new FileSizeQueryValue (bytes).ToUserQuery ());
                 }
             }
-            
+
             return builder.ToString ();
         }
-        
+
 #endregion
 
         public override string ToString ()
         {
             return Name;
         }
-        
+
         /*string IService.ServiceName {
             get { return String.Format ("{0}{1}", DBusServiceManager.MakeDBusSafeString (Name), "Source"); }
         }*/
-        
+
         // FIXME: Replace ISource with IDBusExportable when it's enabled again
         ISource ISource.Parent {
             get {
diff --git a/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs b/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
index 0d2d20b..d89ea3c 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
@@ -38,27 +38,27 @@ namespace Banshee.Sources
 {
     public delegate void SourceEventHandler(SourceEventArgs args);
     public delegate void SourceAddedHandler(SourceAddedArgs args);
-    
+
     public class SourceEventArgs : EventArgs
     {
         public Source Source;
     }
-    
+
     public class SourceAddedArgs : SourceEventArgs
     {
         public int Position;
     }
-    
+
     public class SourceManager : /*ISourceManager,*/ IInitializeService, IRequiredService, IDBusExportable, IDisposable
     {
         private List<Source> sources = new List<Source>();
         private Dictionary<string, Source> extension_sources = new Dictionary<string, Source> ();
-        
+
         private Source active_source;
         private Source default_source;
         private MusicLibrarySource music_library;
         private VideoLibrarySource video_library;
-        
+
         public event SourceEventHandler SourceUpdated;
         public event SourceAddedHandler SourceAdded;
         public event SourceEventHandler SourceRemoved;
@@ -78,7 +78,7 @@ namespace Banshee.Sources
                 AddinManager.AddExtensionNodeHandler ("/Banshee/SourceManager/Source", OnExtensionChanged);
             }
         }
-        
+
         public void Dispose ()
         {
             lock (this) {
@@ -100,17 +100,17 @@ namespace Banshee.Sources
                 while (sources.Count > 0) {
                     RemoveSource (sources[0], false);
                 }
-                
+
                 sources.Clear ();
                 extension_sources.Clear ();
             }
         }
-        
-        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+
+        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             lock (this) {
                 TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-                
+
                 if (args.Change == ExtensionChange.Add && !extension_sources.ContainsKey (node.Id)) {
                     Source source = (Source)node.CreateInstance ();
                     extension_sources.Add (node.Id, source);
@@ -133,17 +133,17 @@ namespace Banshee.Sources
         {
             AddSource(source, false);
         }
-        
+
         public void AddSource(Source source, bool isDefault)
         {
             Banshee.Base.ThreadAssist.AssertInMainThread ();
             if(source == null || ContainsSource (source)) {
                 return;
             }
-            
+
             int position = FindSourceInsertPosition(source);
             sources.Insert(position, source);
-            
+
             if(isDefault) {
                 default_source = source;
             }
@@ -151,7 +151,7 @@ namespace Banshee.Sources
             source.Updated += OnSourceUpdated;
             source.ChildSourceAdded += OnChildSourceAdded;
             source.ChildSourceRemoved += OnChildSourceRemoved;
-            
+
             SourceAddedHandler handler = SourceAdded;
             if(handler != null) {
                 SourceAddedArgs args = new SourceAddedArgs();
@@ -165,22 +165,22 @@ namespace Banshee.Sources
             } else if (source is VideoLibrarySource) {
                 video_library = source as VideoLibrarySource;
             }
-            
+
             IDBusExportable exportable = source as IDBusExportable;
             if (exportable != null) {
                 ServiceManager.DBusServiceManager.RegisterObject (exportable);
             }
-            
+
             List<Source> children = new List<Source> (source.Children);
             foreach(Source child_source in children) {
                 AddSource (child_source, false);
             }
-                
+
             if(isDefault && ActiveSource == null) {
                 SetActiveSource(source);
             }
         }
-        
+
         public void RemoveSource (Source source)
         {
             RemoveSource (source, false);
@@ -195,7 +195,7 @@ namespace Banshee.Sources
             if(source == default_source) {
                 default_source = null;
             }
-            
+
             source.Updated -= OnSourceUpdated;
             source.ChildSourceAdded -= OnChildSourceAdded;
             source.ChildSourceRemoved -= OnChildSourceRemoved;
@@ -205,7 +205,7 @@ namespace Banshee.Sources
             foreach(Source child_source in source.Children) {
                 RemoveSource (child_source, recursivelyDispose);
             }
-            
+
             IDBusExportable exportable = source as IDBusExportable;
             if (exportable != null) {
                 ServiceManager.DBusServiceManager.UnregisterObject (exportable);
@@ -231,27 +231,27 @@ namespace Banshee.Sources
                 }
             });
         }
-        
+
         public void RemoveSource(Type type)
         {
             Queue<Source> remove_queue = new Queue<Source>();
-            
+
             foreach(Source source in Sources) {
                 if(source.GetType() == type) {
                     remove_queue.Enqueue(source);
                 }
             }
-            
+
             while(remove_queue.Count > 0) {
                 RemoveSource(remove_queue.Dequeue());
             }
         }
-        
+
         public bool ContainsSource(Source source)
         {
             return sources.Contains(source);
         }
-        
+
         private void OnSourceUpdated(object o, EventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
@@ -268,29 +268,29 @@ namespace Banshee.Sources
         {
             AddSource (args.Source);
         }
-        
+
         private void OnChildSourceRemoved(SourceEventArgs args)
         {
             RemoveSource (args.Source);
         }
-        
+
         private int FindSourceInsertPosition(Source source)
         {
             for(int i = sources.Count - 1; i >= 0; i--) {
                 if((sources[i] as Source).Order == source.Order) {
                     return i;
-                } 
+                }
             }
-        
+
             for(int i = 0; i < sources.Count; i++) {
                 if((sources[i] as Source).Order >= source.Order) {
                     return i;
                 }
             }
-            
-            return sources.Count;    
+
+            return sources.Count;
         }
-        
+
         public Source DefaultSource {
             get { return default_source; }
             set { default_source = value; }
@@ -307,46 +307,46 @@ namespace Banshee.Sources
         public Source ActiveSource {
             get { return active_source; }
         }
-        
+
         /*ISource ISourceManager.DefaultSource {
             get { return DefaultSource; }
         }
-        
+
         ISource ISourceManager.ActiveSource {
             get { return ActiveSource; }
             set { value.Activate (); }
         }*/
-        
+
         public void SetActiveSource(Source source)
         {
             SetActiveSource(source, true);
         }
-        
+
         public void SetActiveSource(Source source, bool notify)
         {
             Banshee.Base.ThreadAssist.AssertInMainThread ();
             if(source == null || !source.CanActivate || active_source == source) {
                 return;
             }
-            
+
             if(active_source != null) {
                 active_source.Deactivate();
             }
-            
+
             active_source = source;
-            
+
             if(!notify) {
                 source.Activate();
                 return;
             }
-            
+
             SourceEventHandler handler = ActiveSourceChanged;
             if(handler != null) {
                 SourceEventArgs args = new SourceEventArgs();
                 args.Source = active_source;
                 handler(args);
             }
-            
+
             source.Activate();
         }
 
@@ -359,19 +359,19 @@ namespace Banshee.Sources
                 }
             }
         }
-     
+
         public ICollection<Source> Sources {
             get { return sources; }
         }
-        
+
         /*string [] ISourceManager.Sources {
             get { return DBusServiceManager.MakeObjectPathArray<Source>(sources); }
         }*/
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return null; }
         }
-        
+
         string Banshee.ServiceStack.IService.ServiceName {
             get { return "SourceManager"; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/SourceMessage.cs b/src/Core/Banshee.Services/Banshee.Sources/SourceMessage.cs
index caefc16..551e83c 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/SourceMessage.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/SourceMessage.cs
@@ -35,23 +35,23 @@ namespace Banshee.Sources
     {
         private bool updated_when_frozen;
         private int freeze_count;
-        
+
         private List<MessageAction> actions;
-        
+
         private Source source;
         private bool is_spinning;
         private bool is_hidden;
         private bool can_close;
         private string text;
         private string [] icon_names;
-        
+
         public event EventHandler Updated;
-        
+
         public SourceMessage (Source source)
         {
             this.source = source;
         }
-        
+
         public void AddAction (MessageAction action)
         {
             lock (this) {
@@ -62,7 +62,7 @@ namespace Banshee.Sources
                 OnUpdated ();
             }
         }
-        
+
         public void ClearActions ()
         {
             lock (this) {
@@ -72,51 +72,51 @@ namespace Banshee.Sources
                 OnUpdated ();
             }
         }
-        
+
         public void SetIconName (params string [] name)
         {
             icon_names = name;
         }
-        
+
         public string [] IconNames {
             get { return icon_names; }
         }
-        
+
         public void FreezeNotify ()
         {
             lock (this) {
                 freeze_count++;
             }
         }
-        
+
         public void ThawNotify ()
         {
             lock (this) {
                 if (freeze_count > 0) {
                     freeze_count--;
                 }
-                
+
                 if (freeze_count == 0 && updated_when_frozen) {
                     OnUpdated ();
                 }
             }
         }
-        
+
         protected virtual void OnUpdated ()
         {
             if (freeze_count != 0) {
                 updated_when_frozen = true;
                 return;
             }
-            
+
             updated_when_frozen = false;
-            
+
             EventHandler handler = Updated;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public bool IsSpinning {
             get { return is_spinning; }
             set { lock (this) { is_spinning = value; OnUpdated (); } }
@@ -131,17 +131,17 @@ namespace Banshee.Sources
             get { return can_close; }
             set { lock (this) { can_close = value; OnUpdated (); } }
         }
-        
+
         public Source Source {
             get { return source; }
             set { lock (this) { source = value; OnUpdated (); } }
         }
-        
+
         public string Text {
             get { return text; }
-            set { lock (this) { text = value; OnUpdated (); } }  
+            set { lock (this) { text = value; OnUpdated (); } }
         }
-        
+
         public IEnumerable<MessageAction> Actions {
             get { return actions; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/SourceSortType.cs b/src/Core/Banshee.Services/Banshee.Sources/SourceSortType.cs
index 0dc1a38..c690a54 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/SourceSortType.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/SourceSortType.cs
@@ -69,19 +69,19 @@ namespace Banshee.Sources
             this.comparer.SeparateTypes = separateTypes;
             sources.Sort (comparer);
         }
-        
+
         public string Id {
             get { return id; }
         }
-        
+
         public string Label {
             get { return label; }
         }
-        
+
         public SortType SortType {
             get { return sort_type; }
         }
-        
+
         private class SourceComparer : IComparer<Source>
         {
             private IComparer name_comparer = new CaseInsensitiveComparer ();
diff --git a/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
index eac60b4..89ef998 100644
--- a/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
@@ -40,12 +40,12 @@ using Banshee.ServiceStack;
 using Banshee.MediaEngine;
 using Banshee.PlaybackController;
 using Banshee.Playlists.Formats;
- 
+
 namespace Banshee.Streaming
-{   
+{
     public class RadioTrackInfo : TrackInfo
     {
-    
+
 #region Static Helper Methods
 
         public static RadioTrackInfo OpenPlay (string uri)
@@ -57,7 +57,7 @@ namespace Banshee.Streaming
                 return null;
             }
         }
-        
+
         public static RadioTrackInfo OpenPlay (SafeUri uri)
         {
             RadioTrackInfo track = Open (uri);
@@ -66,12 +66,12 @@ namespace Banshee.Streaming
             }
             return track;
         }
-    
+
         public static RadioTrackInfo Open (string uri)
         {
             return Open (new SafeUri (uri));
         }
-    
+
         public static RadioTrackInfo Open (SafeUri uri)
         {
             try {
@@ -79,23 +79,23 @@ namespace Banshee.Streaming
                 radio_track.ParsingPlaylistEvent += delegate {
                     ThreadAssist.ProxyToMain (delegate {
                         if (radio_track.PlaybackError != StreamPlaybackError.None) {
-                            Log.Error (Catalog.GetString ("Error opening stream"), 
+                            Log.Error (Catalog.GetString ("Error opening stream"),
                                 Catalog.GetString ("Could not open stream or playlist"), true);
                             radio_track = null;
                         }
                     });
                 };
-                
+
                 return radio_track;
             } catch {
-                Log.Error (Catalog.GetString ("Error opening stream"), 
+                Log.Error (Catalog.GetString ("Error opening stream"),
                     Catalog.GetString("Problem parsing playlist"), true);
                 return null;
             }
         }
 
 #endregion
-        
+
         private Track track;
         private SafeUri single_location;
         private List<SafeUri> stream_uris = new List<SafeUri>();
@@ -103,33 +103,33 @@ namespace Banshee.Streaming
         private bool loaded = false;
         private bool parsing_playlist = false;
         private bool trying_to_play;
-        
+
         private TrackInfo parent_track;
         public TrackInfo ParentTrack {
             get { return parent_track; }
             set { parent_track = value; }
         }
-        
+
         public event EventHandler ParsingPlaylistEvent;
-        
+
         protected RadioTrackInfo()
         {
             IsLive = true;
         }
-        
+
         public RadioTrackInfo(Track track) : this()
         {
             TrackTitle = track.Title;
             ArtistName = track.Creator;
-            
+
             this.track = track;
         }
-        
+
         public RadioTrackInfo(SafeUri uri) : this()
         {
             this.single_location = uri;
         }
-        
+
         public RadioTrackInfo (TrackInfo parentTrack) : this (parentTrack.Uri)
         {
             ArtistName = parentTrack.ArtistName;
@@ -205,10 +205,10 @@ namespace Banshee.Streaming
                 TrackTitle = track.Title;
                 ArtistName = track.Creator;
             }
-            
+
             AlbumTitle = null;
             Duration = TimeSpan.Zero;
-            
+
             lock(stream_uris) {
                 if(stream_uris.Count > 0) {
                     Uri = stream_uris[stream_index];
@@ -228,7 +228,7 @@ namespace Banshee.Streaming
 
             trying_to_play = false;
         }
-        
+
         public bool PlayNextStream()
         {
             if(stream_index < stream_uris.Count - 1) {
@@ -261,7 +261,7 @@ namespace Banshee.Streaming
                 } else {
                     LoadStreamUri(single_location.AbsoluteUri);
                 }
-                
+
                 loaded = true;
             }
 
@@ -283,7 +283,7 @@ namespace Banshee.Streaming
             }
             return false;
         }
-        
+
         private void LoadStreamUri(string uri)
         {
             try {
@@ -291,6 +291,11 @@ namespace Banshee.Streaming
                 if (parser.Parse(new SafeUri(uri))) {
                     foreach(Dictionary<string, object> element in parser.Elements) {
                         if(element.ContainsKey("uri")) {
+                            // mms can be a nested link
+                            string element_uri = element["uri"].ToString();
+                            if(element_uri.StartsWith("mms:", StringComparison.CurrentCultureIgnoreCase)){
+                                LoadStreamUri("http" + element_uri.Substring(element_uri.IndexOf(":")));
+                            }
                             stream_uris.Add(new SafeUri(((Uri)element["uri"]).AbsoluteUri));
                         }
                     }
@@ -306,19 +311,19 @@ namespace Banshee.Streaming
                 SavePlaybackError (StreamPlaybackError.Unknown);
             }
         }
-        
+
         private void OnParsingPlaylistStarted()
         {
             parsing_playlist = true;
             OnParsingPlaylistEvent();
         }
-        
+
         private void OnParsingPlaylistFinished()
         {
             parsing_playlist = false;
             OnParsingPlaylistEvent();
         }
-        
+
         private void OnParsingPlaylistEvent()
         {
             EventHandler handler = ParsingPlaylistEvent;
@@ -330,7 +335,7 @@ namespace Banshee.Streaming
         public Track XspfTrack {
             get { return track; }
         }
-        
+
         public bool ParsingPlaylist {
             get { return parsing_playlist; }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Web/BaseHttpServer.cs b/src/Core/Banshee.Services/Banshee.Web/BaseHttpServer.cs
new file mode 100644
index 0000000..ae8e2c3
--- /dev/null
+++ b/src/Core/Banshee.Services/Banshee.Web/BaseHttpServer.cs
@@ -0,0 +1,358 @@
+//
+// BaseWebServer.cs
+//
+// Author:
+//   Aaron Bockover <aaron at aaronbock.net>
+//   James Wilcox   <snorp at snorp.net>
+//   Neil Loknath   <neil.loknath at gmail.com
+//
+// Copyright (C) 2005-2006 Novell, Inc.
+// Copyright (C) 2009 Neil Loknath
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Text;
+using System.Web;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+using System.Collections;
+using System.Collections.Generic;
+
+using Hyena;
+
+namespace Banshee.Web
+{
+    public abstract class BaseHttpServer
+    {
+        protected Socket server;
+        private bool running;
+        private int backlog;
+        private ushort port;
+
+        protected readonly ArrayList clients = new ArrayList();
+
+        public BaseHttpServer (EndPoint endpoint, string name)
+        {
+            this.end_point = endpoint;
+            this.name = name;
+        }
+
+        public BaseHttpServer (EndPoint endpoint, string name, int chunk_length) : this (endpoint, name)
+        {
+            this.chunk_length = chunk_length;
+        }
+
+        private string name = "Banshee Web Server";
+        public string Name {
+            get { return name; }
+        }
+
+        public bool IsBound {
+            get { return server != null && server.IsBound; }
+        }
+
+        public bool IsRunning {
+            get { return running; }
+        }
+
+        private EndPoint end_point = new IPEndPoint (IPAddress.Any, 80);
+        protected EndPoint EndPoint {
+            get { return end_point; }
+            set {
+                if (value == null) {
+                    throw new ArgumentNullException ("end_point");
+                }
+                if (IsBound) {
+                    throw new InvalidOperationException ("Cannot set EndPoint while running.");
+                }
+                end_point = value;
+            }
+        }
+
+        private int chunk_length = 8192;
+        public int ChunkLength {
+            get { return chunk_length; }
+        }
+
+        public ushort Port {
+            get { return port; }
+        }
+
+        public void Start ()
+        {
+            Start (10);
+        }
+
+        public void Start (int backlog)
+        {
+            if (backlog < 0) {
+                throw new ArgumentOutOfRangeException ("backlog");
+            }
+
+            if (running) {
+                return;
+            }
+
+            this.backlog = backlog;
+            running = true;
+            Thread thread = new Thread (ServerLoop);
+            thread.Name = this.Name;
+            thread.IsBackground = true;
+            thread.Start ();
+        }
+
+        public virtual void Stop ()
+        {
+            running = false;
+
+            if (server != null) {
+                server.Close ();
+                server = null;
+            }
+
+            foreach (Socket client in (ArrayList)clients.Clone ()) {
+                client.Close ();
+            }
+        }
+
+        private void ServerLoop ()
+        {
+            if (!BindServerSocket ()) {
+                running = false;
+                return;
+            }
+
+            server.Listen (backlog);
+
+            IPEndPoint ip_endpoint;
+            if ((ip_endpoint = server.LocalEndPoint as IPEndPoint) != null) {
+                port = (ushort) ip_endpoint.Port;
+            }
+
+            Log.DebugFormat ("{0} listening for connections on port {1}", name, port);
+
+            while (true) {
+                try {
+                    if (!running) {
+                        break;
+                    }
+
+                    Socket client = server.Accept ();
+                    clients.Add (client);
+                    ThreadPool.QueueUserWorkItem (HandleConnection, client);
+                } catch (SocketException) {
+                    break;
+                }
+            }
+        }
+
+        private void HandleConnection (object o)
+        {
+            Socket client = (Socket) o;
+
+            try {
+                while (HandleRequest(client));
+            } catch (IOException) {
+            } catch (Exception e) {
+                Log.Exception (e);
+            } finally {
+                clients.Remove (client);
+                client.Close ();
+            }
+        }
+
+        protected virtual bool BindServerSocket ()
+        {
+            server = new Socket (this.EndPoint.AddressFamily, SocketType.Stream, ProtocolType.IP);
+            try {
+                server.Bind (this.EndPoint);
+            } catch (System.Net.Sockets.SocketException e) {
+                Log.Exception (e);
+                return false;
+            }
+
+            return true;
+        }
+
+        protected virtual long ParseRangeRequest (string line)
+        {
+            long offset = 0;
+            if (String.IsNullOrEmpty (line)) {
+                return offset;
+            }
+
+            string [] split_line = line.Split (' ', '=', '-');
+            foreach (string word in split_line) {
+                if (long.TryParse (word, out offset)) {
+                    return offset;
+                }
+            }
+
+            return offset;
+        }
+
+        protected virtual bool HandleRequest (Socket client)
+        {
+            if (client == null || !client.Connected) {
+                return false;
+            }
+
+            bool keep_connection = true;
+
+            using (StreamReader reader = new StreamReader (new NetworkStream (client, false))) {
+                string request_line = reader.ReadLine ();
+
+                if (request_line == null) {
+                    return false;
+                }
+
+                List <string> request_headers = new List <string> ();
+                string line = null;
+
+                do {
+                    line = reader.ReadLine ();
+                    if (line.ToLower () == "connection: close") {
+                        keep_connection = false;
+                    }
+                    request_headers.Add (line);
+                } while (line != String.Empty && line != null);
+
+                string [] split_request_line = request_line.Split ();
+
+                if (split_request_line.Length < 3) {
+                    WriteResponse (client, HttpStatusCode.BadRequest, "Bad Request");
+                    return keep_connection;
+                } else {
+                    try {
+                        HandleValidRequest (client, split_request_line, request_headers.ToArray () );
+                    } catch (IOException) {
+                        keep_connection = false;
+                    } catch (Exception e) {
+                        keep_connection = false;
+                        Console.Error.WriteLine("Trouble handling request {0}: {1}", split_request_line[1], e);
+                    }
+                }
+            }
+
+            return keep_connection;
+        }
+
+        protected abstract void HandleValidRequest(Socket client, string [] split_request, string [] request_headers);
+
+        protected void WriteResponse (Socket client, HttpStatusCode code, string body)
+        {
+            WriteResponse (client, code, Encoding.UTF8.GetBytes (body));
+        }
+
+        protected virtual void WriteResponse (Socket client, HttpStatusCode code, byte [] body)
+        {
+            if (client == null || !client.Connected) {
+                return;
+            }
+            else if (body == null) {
+                throw new ArgumentNullException ("body");
+            }
+
+            StringBuilder headers = new StringBuilder ();
+            headers.AppendFormat ("HTTP/1.1 {0} {1}\r\n", (int) code, code.ToString ());
+            headers.AppendFormat ("Content-Length: {0}\r\n", body.Length);
+            headers.Append ("Content-Type: text/html\r\n");
+            headers.Append ("Connection: close\r\n");
+            headers.Append ("\r\n");
+
+            using (BinaryWriter writer = new BinaryWriter (new NetworkStream (client, false))) {
+                writer.Write (Encoding.UTF8.GetBytes (headers.ToString ()));
+                writer.Write (body);
+            }
+
+            client.Close ();
+        }
+
+        protected void WriteResponseStream (Socket client, Stream response, long length, string filename)
+        {
+            WriteResponseStream (client, response, length, filename, 0);
+        }
+
+        protected virtual void WriteResponseStream (Socket client, Stream response, long length, string filename, long offset)
+        {
+            if (client == null || !client.Connected) {
+                return;
+            }
+            if (response == null) {
+                throw new ArgumentNullException ("response");
+            }
+            if (length < 1) {
+                throw new ArgumentOutOfRangeException ("length", "Must be > 0");
+            }
+            if (offset < 0) {
+                throw new ArgumentOutOfRangeException ("offset", "Must be positive.");
+            }
+
+            using (BinaryWriter writer = new BinaryWriter (new NetworkStream (client, false))) {
+                StringBuilder headers = new StringBuilder ();
+
+                if (offset > 0) {
+                    headers.Append ("HTTP/1.1 206 Partial Content\r\n");
+                    headers.AppendFormat ("Content-Range: {0}-{1}\r\n", offset, offset + length);
+                } else {
+                    headers.Append ("HTTP/1.1 200 OK\r\n");
+                }
+
+                if (length > 0) {
+                    headers.AppendFormat ("Content-Length: {0}\r\n", length);
+                }
+
+                if (filename != null) {
+                    headers.AppendFormat ("Content-Disposition: attachment; filename=\"{0}\"\r\n",
+                        filename.Replace ("\"", "\\\""));
+                }
+
+                headers.Append ("Connection: close\r\n");
+                headers.Append ("\r\n");
+
+                writer.Write (Encoding.UTF8.GetBytes (headers.ToString ()));
+
+                using (BinaryReader reader = new BinaryReader (response)) {
+                    while (true) {
+                        byte [] buffer = reader.ReadBytes (ChunkLength);
+                        if (buffer == null) {
+                            break;
+                        }
+
+                        writer.Write(buffer);
+
+                        if (buffer.Length < ChunkLength) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        protected static string Escape (string input)
+        {
+            return String.IsNullOrEmpty (input) ? "" : System.Web.HttpUtility.HtmlEncode (input);
+        }
+    }
+}
diff --git a/src/Core/Banshee.Services/Banshee.Web/Browser.cs b/src/Core/Banshee.Services/Banshee.Web/Browser.cs
index e9c5630..f067af0 100644
--- a/src/Core/Banshee.Services/Banshee.Web/Browser.cs
+++ b/src/Core/Banshee.Services/Banshee.Web/Browser.cs
@@ -40,13 +40,13 @@ namespace Banshee.Web
     public class Browser
     {
         public delegate bool OpenUrlHandler (string uri);
-        
+
         private static OpenUrlHandler open_handler = null;
         public static OpenUrlHandler OpenHandler {
             get { return open_handler; }
             set { open_handler = value; }
         }
-    
+
         public static bool Open (string url)
         {
             try {
@@ -59,13 +59,13 @@ namespace Banshee.Web
                 }
             } catch(Exception e) {
                 Log.Warning (Catalog.GetString ("Could not launch URL"),
-                    String.Format (Catalog.GetString ("{0} could not be opened: {1}\n\n " + 
+                    String.Format (Catalog.GetString ("{0} could not be opened: {1}\n\n " +
                         "Check your 'Preferred Applications' settings."), url, e.Message), true);
                 return false;
             }
         }
 
-        public static readonly string UserAgent = String.Format ("Banshee {0} (http://banshee-project.org/)", 
+        public static readonly string UserAgent = String.Format ("Banshee {0} (http://banshee-project.org/)",
             Application.Version);
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Web/HttpRequest.cs b/src/Core/Banshee.Services/Banshee.Web/HttpRequest.cs
index 54f8041..d96ba49 100644
--- a/src/Core/Banshee.Services/Banshee.Web/HttpRequest.cs
+++ b/src/Core/Banshee.Services/Banshee.Web/HttpRequest.cs
@@ -1,4 +1,4 @@
-// 
+//
 // HttpRequest.cs
 //
 // Author:
@@ -38,18 +38,18 @@ using Banshee.ServiceStack;
 using Banshee.Networking;
 
 namespace Banshee.Web
-{   
+{
     public class HttpRequest : IDisposable
     {
         private HttpWebRequest request;
         private HttpWebResponse response;
         private List<string> ignore_mimetypes;
-        
+
         public HttpRequest ()            { }
         public HttpRequest (string uri)  { CreateRequest (uri); }
         public HttpRequest (SafeUri uri) { CreateRequest (uri); }
         public HttpRequest (Uri uri)     { CreateRequest (uri); }
-        
+
         public void Dispose ()
         {
             lock (this) {
@@ -57,26 +57,26 @@ namespace Banshee.Web
                     response.Close ();
                     response = null;
                 }
-                
+
                 request = null;
             }
         }
-        
+
         public void CreateRequest (string uri)
         {
             CreateRequest (new Uri (uri));
         }
-        
+
         public void CreateRequest (SafeUri uri)
         {
             CreateRequest (new Uri (uri.AbsoluteUri));
         }
-        
+
         public virtual void CreateRequest (Uri uri)
         {
             lock (this) {
                 Dispose ();
-                
+
                 request = (HttpWebRequest)WebRequest.Create (uri.AbsoluteUri);
                 request.UserAgent = Browser.UserAgent;
                 request.Timeout = (int)Timeout.TotalMilliseconds;
@@ -84,25 +84,25 @@ namespace Banshee.Web
                 request.AllowAutoRedirect = true;
             }
         }
-        
+
         public virtual void GetResponse ()
         {
             lock (this) {
                 if (response != null) {
                     return;
                 }
-                
+
                 if (request == null) {
                     throw new InvalidOperationException ("CreateRequest must be called first");
                 } else if (!InternetConnected) {
                     throw new NetworkUnavailableException ();
                 }
-                
+
                 response = (HttpWebResponse)request.GetResponse ();
                 if (ignore_mimetypes == null) {
                     return;
                 }
-                
+
                 string [] content_types = response.Headers.GetValues ("Content-Type");
                 if (content_types != null && content_types.Length > 0) {
                     foreach (string content_type in content_types) {
@@ -114,7 +114,7 @@ namespace Banshee.Web
                 }
             }
         }
-        
+
         public void DumpResponseStream ()
         {
             using (Stream stream = GetResponseStream ()) {
@@ -123,34 +123,34 @@ namespace Banshee.Web
                 reader.Dispose ();
             }
         }
-        
+
         public void SaveResponseStream (SafeUri path)
         {
             SaveResponseStream (path, true);
         }
-        
+
         public void SaveResponseStream (SafeUri path, bool closeResponse)
         {
             SaveResponseStream (Banshee.IO.File.OpenWrite (path, true), closeResponse);
         }
-        
+
         public virtual void SaveResponseStream (Stream toStream, bool closeResponse)
         {
             if (response == null) {
                 throw new InvalidOperationException ("No response");
             }
-        
+
             Stream from_stream = response.GetResponseStream ();
             if (from_stream == null) {
                 if (response != null && closeResponse) {
                     response.Close ();
                 }
-                
+
                 throw new InvalidDataException ("Response has no content stream");
             }
-            
+
             Banshee.IO.StreamAssist.Save (from_stream, toStream);
-            
+
             from_stream.Close ();
             if (closeResponse) {
                 response.Close ();
@@ -160,7 +160,7 @@ namespace Banshee.Web
         public HttpWebRequest Request {
             get { return request; }
         }
-        
+
         public HttpWebResponse Response {
             get { return response; }
         }
@@ -187,25 +187,25 @@ namespace Banshee.Web
                 return response_body;
             }
         }
-        
+
         private static TimeSpan default_timeout = TimeSpan.FromSeconds (20);
         protected virtual TimeSpan Timeout {
             get { return default_timeout; }
         }
-        
+
 #region Mimetypes
-        
+
         public void AddIgnoreMimeType (string mimetype)
         {
             lock (this) {
                 if (ignore_mimetypes == null) {
                     ignore_mimetypes = new List<string> ();
                 }
-                
+
                 ignore_mimetypes.Add (mimetype);
             }
         }
-        
+
         public void RemoveIgnoreMimeType (string mimetype)
         {
              lock (this) {
@@ -214,7 +214,7 @@ namespace Banshee.Web
                 }
             }
         }
-        
+
         public void ClearIgnoreMimeTypes ()
         {
             lock (this) {
@@ -223,14 +223,14 @@ namespace Banshee.Web
                 }
             }
         }
-        
+
         public string [] IgnoreMimeTypes {
             get { lock (this) { return ignore_mimetypes == null ? new string[0] : ignore_mimetypes.ToArray (); } }
             set { lock (this) { ignore_mimetypes = new List<string> (value); } }
         }
-        
+
 #endregion
-        
+
         protected bool InternetConnected {
             get { return ServiceManager.Get<Network> ().Connected; }
         }
diff --git a/src/Core/Banshee.Services/Makefile.am b/src/Core/Banshee.Services/Makefile.am
index c36d426..1a325f2 100644
--- a/src/Core/Banshee.Services/Makefile.am
+++ b/src/Core/Banshee.Services/Makefile.am
@@ -29,6 +29,7 @@ SOURCES =  \
 	Banshee.Collection.Database/RandomByScore.cs \
 	Banshee.Collection.Database/RandomBySlot.cs \
 	Banshee.Collection.Database/RandomByTrack.cs \
+	Banshee.Collection.Database/Shuffler.cs \
 	Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs \
 	Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs \
 	Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs \
@@ -59,7 +60,6 @@ SOURCES =  \
 	Banshee.Database/SortKeyUpdater.cs \
 	Banshee.Equalizer/EqualizerManager.cs \
 	Banshee.Equalizer/EqualizerSetting.cs \
-	Banshee.Equalizer/EqualizerSettingEvent.cs \
 	Banshee.Hardware/DeviceCommand.cs \
 	Banshee.Hardware/HardwareManager.cs \
 	Banshee.Hardware/IBlockDevice.cs \
@@ -118,8 +118,11 @@ SOURCES =  \
 	Banshee.Metadata/MetadataServiceJob.cs \
 	Banshee.Metadata/SaveTrackMetadataJob.cs \
 	Banshee.Metadata/SaveTrackMetadataService.cs \
+	Banshee.Networking/INetworkAvailabilityService.cs \
 	Banshee.Networking/Network.cs \
 	Banshee.Networking/NetworkManager.cs \
+	Banshee.Networking/State.cs \
+	Banshee.Networking/Wicd.cs \
 	Banshee.PlatformServices/IScreensaverManager.cs \
 	Banshee.PlatformServices/ScreensaverManager.cs \
 	Banshee.PlaybackController/IBasicPlaybackController.cs \
@@ -157,6 +160,7 @@ SOURCES =  \
 	Banshee.Query/AbstractPlaylistQueryValue.cs \
 	Banshee.Query/BansheeQuery.cs \
 	Banshee.Query/NaturalIntegerQueryValue.cs \
+	Banshee.Query/PlaybackErrorQueryValue.cs \
 	Banshee.Query/PlaylistQueryValue.cs \
 	Banshee.Query/RatingQueryValue.cs \
 	Banshee.Query/SmartPlaylistQueryValue.cs \
@@ -207,6 +211,7 @@ SOURCES =  \
 	Banshee.Sources/SourceMessage.cs \
 	Banshee.Sources/SourceSortType.cs \
 	Banshee.Streaming/RadioTrackInfo.cs \
+	Banshee.Web/BaseHttpServer.cs \
 	Banshee.Web/Browser.cs \
 	Banshee.Web/HttpRequest.cs
 
diff --git a/src/Core/Banshee.Services/Makefile.in b/src/Core/Banshee.Services/Makefile.in
index aa5532f..a4ac773 100644
--- a/src/Core/Banshee.Services/Makefile.in
+++ b/src/Core/Banshee.Services/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -55,6 +57,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -74,17 +77,31 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(module_SCRIPTS)
-DIST_SOURCES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-moduleDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"
+SCRIPTS = $(module_SCRIPTS)
+DIST_SOURCES =
 DATA = $(module_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -148,6 +165,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -167,6 +186,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -180,29 +201,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -380,6 +382,7 @@ SOURCES = \
 	Banshee.Collection.Database/RandomByScore.cs \
 	Banshee.Collection.Database/RandomBySlot.cs \
 	Banshee.Collection.Database/RandomByTrack.cs \
+	Banshee.Collection.Database/Shuffler.cs \
 	Banshee.Collection.Database/Tests/DatabaseAlbumInfoTests.cs \
 	Banshee.Collection.Database/Tests/DatabaseArtistInfoTests.cs \
 	Banshee.Collection.Database/Tests/DatabaseTrackInfoTests.cs \
@@ -410,7 +413,6 @@ SOURCES = \
 	Banshee.Database/SortKeyUpdater.cs \
 	Banshee.Equalizer/EqualizerManager.cs \
 	Banshee.Equalizer/EqualizerSetting.cs \
-	Banshee.Equalizer/EqualizerSettingEvent.cs \
 	Banshee.Hardware/DeviceCommand.cs \
 	Banshee.Hardware/HardwareManager.cs \
 	Banshee.Hardware/IBlockDevice.cs \
@@ -469,8 +471,11 @@ SOURCES = \
 	Banshee.Metadata/MetadataServiceJob.cs \
 	Banshee.Metadata/SaveTrackMetadataJob.cs \
 	Banshee.Metadata/SaveTrackMetadataService.cs \
+	Banshee.Networking/INetworkAvailabilityService.cs \
 	Banshee.Networking/Network.cs \
 	Banshee.Networking/NetworkManager.cs \
+	Banshee.Networking/State.cs \
+	Banshee.Networking/Wicd.cs \
 	Banshee.PlatformServices/IScreensaverManager.cs \
 	Banshee.PlatformServices/ScreensaverManager.cs \
 	Banshee.PlaybackController/IBasicPlaybackController.cs \
@@ -508,6 +513,7 @@ SOURCES = \
 	Banshee.Query/AbstractPlaylistQueryValue.cs \
 	Banshee.Query/BansheeQuery.cs \
 	Banshee.Query/NaturalIntegerQueryValue.cs \
+	Banshee.Query/PlaybackErrorQueryValue.cs \
 	Banshee.Query/PlaylistQueryValue.cs \
 	Banshee.Query/RatingQueryValue.cs \
 	Banshee.Query/SmartPlaylistQueryValue.cs \
@@ -558,6 +564,7 @@ SOURCES = \
 	Banshee.Sources/SourceMessage.cs \
 	Banshee.Sources/SourceSortType.cs \
 	Banshee.Streaming/RadioTrackInfo.cs \
+	Banshee.Web/BaseHttpServer.cs \
 	Banshee.Web/Browser.cs \
 	Banshee.Web/HttpRequest.cs
 
@@ -587,6 +594,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -690,11 +698,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -712,6 +721,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -741,6 +751,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -760,14 +771,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Banshee.Services/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Banshee.Services/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Banshee.Services/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Banshee.Services/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -785,25 +796,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -813,20 +840,23 @@ clean-libtool:
 install-moduleDATA: $(module_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_DATA)'; for p in $$list; do \
+	@list='$(module_DATA)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	  $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(moduledir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \
 	done
 
 uninstall-moduleDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_DATA)'; test -n "$(moduledir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -850,13 +880,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -888,6 +922,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -908,6 +943,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -917,18 +954,28 @@ install-data-am: install-data-local install-moduleDATA \
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -990,7 +1037,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -1007,6 +1054,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs
index a839d91..fc8c1f2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinDetailsDialog.cs
@@ -44,52 +44,52 @@ namespace Banshee.Addins.Gui
         public AddinDetailsDialog (Addin addin, Window parent) : base (String.Empty, parent)
         {
             SetDefaultSize (400, -1);
-            
+
             AddinHeader info = SetupService.GetAddinHeader (addin);
-            
+
             HBox box = new HBox ();
             box.BorderWidth = 10;
             box.Spacing = 10;
             VBox.PackStart (box, false, false, 0);
-            
+
             Image image = new Image ();
             image.IconName = "package-x-generic";
             image.IconSize = (int)IconSize.Dialog;
             image.Yalign = 0.0f;
-            
+
             box.PackStart (image, false, false, 0);
-            
+
             StringBuilder builder = new StringBuilder ();
-            
+
             builder.AppendFormat ("<b><big>{0}</big></b>\n\n", GLib.Markup.EscapeText (addin.Name));
             builder.AppendFormat (GLib.Markup.EscapeText (addin.Description.Description)).Append ("\n\n");
-            
+
             builder.Append ("<small>");
-            
-            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Version:"), 
+
+            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Version:"),
                 GLib.Markup.EscapeText (addin.Description.Version));
-            
-            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Authors:"), 
+
+            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Authors:"),
                 GLib.Markup.EscapeText (addin.Description.Author));
-            
-            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Copyright/License:"), 
+
+            builder.AppendFormat ("<b>{0}</b> {1}\n\n", Catalog.GetString ("Copyright/License:"),
                 GLib.Markup.EscapeText (addin.Description.Copyright));
-            
+
             if (info.Dependencies.Count > 0) {
                 builder.AppendFormat ("<b>{0}</b>\n", Catalog.GetString ("Extension Dependencies:"));
                 foreach (AddinDependency dep in info.Dependencies) {
                     builder.Append (GLib.Markup.EscapeText (dep.Name)).Append ('\n');
                 }
             }
-            
+
             builder.Append ("</small>");
-            
+
             WrapLabel label = new WrapLabel ();
             label.Markup = builder.ToString ();
             box.PackStart (label, true, true, 0);
-            
+
             VBox.ShowAll ();
-        
+
             AddDefaultCloseButton ();
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs
index 5a111ad..2f50f7b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinTile.cs
@@ -34,155 +34,181 @@ using Mono.Addins;
 using Hyena.Widgets;
 
 namespace Banshee.Addins.Gui
-{    
+{
     public class AddinTile : Table
     {
         private Addin addin;
         private Button activate_button;
         private Button details_button;
         private Box button_box;
-        
+
         private Label title;
         private WrapLabel description;
         private WrapLabel authors;
-        
+
         private bool last;
         public bool Last {
             get { return last; }
             set { last = value; }
         }
-        
+
         public event EventHandler ActiveChanged;
-        
+
         public AddinTile (Addin addin) : base (3, 3, false)
         {
             this.addin = addin;
             BuildTile ();
         }
-        
+
         private void BuildTile ()
         {
             BorderWidth = 5;
             RowSpacing = 1;
             ColumnSpacing = 5;
-            
+
             Image image = new Image ();
             image.IconName = "package-x-generic";
             image.IconSize = (int)IconSize.Dnd;
             image.Yalign = 0.0f;
             image.Show ();
             Attach (image, 0, 1, 0, 3, AttachOptions.Shrink, AttachOptions.Fill | AttachOptions.Expand, 0, 0);
-            
+
             title = new Label ();
+            SetLabelStyle (title);
             title.Show ();
             title.Xalign = 0.0f;
             title.Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText (addin.Name));
-            
-            Attach (title, 1, 3, 0, 1, 
-                AttachOptions.Expand | AttachOptions.Fill, 
+
+            Attach (title, 1, 3, 0, 1,
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-            
+
             description = new WrapLabel ();
+            SetLabelStyle (description);
             description.Show ();
             description.Text = addin.Description.Description;
             description.Wrap = false;
-            
+
             Attach (description, 1, 3, 1, 2,
-                AttachOptions.Expand | AttachOptions.Fill, 
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
+
             authors = new WrapLabel ();
+            SetLabelStyle (authors);
             authors.Markup = String.Format (
-                "<small><b>{0}</b> <i>{1}</i></small>", 
+                "<small><b>{0}</b> <i>{1}</i></small>",
                 Catalog.GetString ("Authors:"),
                 GLib.Markup.EscapeText (addin.Description.Author)
             );
-            
+
             Attach (authors, 1, 2, 2, 3,
-                AttachOptions.Expand | AttachOptions.Fill, 
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill,  0, 4);
-            
+
             button_box = new VBox ();
             HBox box = new HBox ();
             box.Spacing = 3;
-            
+
             button_box.PackEnd (box, false, false, 0);
-            
+
             Pango.FontDescription font = PangoContext.FontDescription.Copy ();
             font.Size = (int)(font.Size * Pango.Scale.Small);
-            
+
             Label label = new Label ("Details");
             label.ModifyFont (font);
             details_button = new Button ();
             details_button.Add (label);
             details_button.Clicked += OnDetailsClicked;
             box.PackStart (details_button, false, false, 0);
-            
+
             label = new Label ();
             label.ModifyFont (font);
             activate_button = new Button ();
             activate_button.Add (label);
             activate_button.Clicked += OnActivateClicked;
             box.PackStart (activate_button, false, false, 0);
-            
+
             Attach (button_box, 2, 3, 2, 3, AttachOptions.Shrink, AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
+
             Show ();
-            
+
             UpdateState ();
         }
-        
+
+        private void SetLabelStyle (Widget label)
+        {
+            bool changing_styles = false;
+            label.StyleSet += delegate {
+                if (changing_styles) {
+                    return;
+                }
+
+                changing_styles = true;
+                label.ModifyBg (StateType.Normal, label.Style.Base (StateType.Normal));
+                label.ModifyBg (StateType.Active, label.Style.Base (StateType.Active));
+                label.ModifyBg (StateType.Prelight, label.Style.Base (StateType.Prelight));
+                label.ModifyBg (StateType.Selected, label.Style.Base (StateType.Selected));
+                label.ModifyBg (StateType.Insensitive, label.Style.Base (StateType.Insensitive));
+                label.ModifyFg (StateType.Normal, label.Style.Text (StateType.Normal));
+                label.ModifyFg (StateType.Active, label.Style.Text (StateType.Active));
+                label.ModifyFg (StateType.Prelight, label.Style.Text (StateType.Prelight));
+                label.ModifyFg (StateType.Selected, label.Style.Text (StateType.Selected));
+                label.ModifyFg (StateType.Insensitive, label.Style.Text (StateType.Insensitive));
+                changing_styles = false;
+            };
+        }
+
         protected override void OnRealized ()
         {
             WidgetFlags |= WidgetFlags.NoWindow;
             GdkWindow = Parent.GdkWindow;
             base.OnRealized ();
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (State == StateType.Selected) {
-                Gtk.Style.PaintFlatBox (Style, evnt.Window, State, ShadowType.None, evnt.Area, 
-                    this, "cell_odd", Allocation.X, Allocation.Y, 
+                Gtk.Style.PaintFlatBox (Style, evnt.Window, State, ShadowType.None, evnt.Area,
+                    this, "cell_odd", Allocation.X, Allocation.Y,
                     Allocation.Width, Allocation.Height - (last ? 0 : 1));
             }
-            
-            if (!last) {            
-                Gtk.Style.PaintHline (Style, evnt.Window, StateType.Normal, evnt.Area, this, null, 
+
+            if (!last) {
+                Gtk.Style.PaintHline (Style, evnt.Window, StateType.Normal, evnt.Area, this, null,
                     Allocation.X, Allocation.Right, Allocation.Bottom - 1);
             }
-            
+
             return base.OnExposeEvent (evnt);
         }
-        
+
         private void OnActivateClicked (object o, EventArgs args)
         {
             addin.Enabled = !addin.Enabled;
             ActiveChanged (this, EventArgs.Empty);
         }
-        
+
         private void OnDetailsClicked (object o, EventArgs args)
         {
             AddinDetailsDialog dialog = new AddinDetailsDialog (addin, Toplevel as Window);
             dialog.Run ();
             dialog.Destroy ();
         }
-        
+
         public void UpdateState ()
         {
             bool enabled = addin.Enabled;
             bool sensitive = enabled || (!enabled && State == StateType.Selected);
-            
+
             title.Sensitive = sensitive;
             description.Sensitive = sensitive;
             description.Wrap = State == StateType.Selected;
             authors.Visible = State == StateType.Selected;
-            
-            ((Label)activate_button.Child).Text = enabled 
-                ? Catalog.GetString ("Disable") 
+
+            ((Label)activate_button.Child).Text = enabled
+                ? Catalog.GetString ("Disable")
                 : Catalog.GetString ("Enable");
         }
-        
+
         public void Select (bool select)
         {
             State = select ? StateType.Selected : StateType.Normal;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinView.cs b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinView.cs
index d2ba6b0..7fb361a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Addins.Gui/AddinView.cs
@@ -38,49 +38,49 @@ namespace Banshee.Addins.Gui
     {
         private List<AddinTile> tiles = new List<AddinTile> ();
         private VBox box = new VBox ();
-        
+
         private int selected_index = -1;
-    
+
         public AddinView ()
         {
             CanFocus = true;
             VisibleWindow = false;
-            
+
             box.Show ();
             Add (box);
-            
+
             LoadAddins ();
         }
-        
+
         private void LoadAddins ()
         {
             foreach (Addin addin in AddinManager.Registry.GetAddins ()) {
-                if (addin.Name != addin.Id && addin.Description != null && 
+                if (addin.Name != addin.Id && addin.Description != null &&
                     addin.Description.Category != null && !addin.Description.Category.StartsWith ("required:") &&
                     (!addin.Description.Category.Contains ("Debug") || Banshee.Base.ApplicationContext.Debugging)) {
                     AppendAddin (addin);
                 }
             }
-            
+
             if (tiles.Count > 0) {
                 tiles[tiles.Count - 1].Last = true;
             }
         }
-        
+
         private bool changing_styles = false;
-        
+
         protected override void OnStyleSet (Style previous_style)
         {
             if (changing_styles) {
                 return;
             }
-            
+
             changing_styles = true;
             base.OnStyleSet (previous_style);
             Parent.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
             changing_styles = false;
         }
-        
+
         private void AppendAddin (Addin addin)
         {
             AddinTile tile = new AddinTile (addin);
@@ -88,35 +88,35 @@ namespace Banshee.Addins.Gui
             tile.SizeAllocated += OnAddinSizeAllocated;
             tile.Show ();
             tiles.Add (tile);
-            
+
             box.PackStart (tile, false, false, 0);
         }
-        
+
         private void OnAddinActiveChanged (object o, EventArgs args)
         {
             foreach (AddinTile tile in tiles) {
                 tile.UpdateState ();
             }
         }
-        
+
         private void OnAddinSizeAllocated (object o, SizeAllocatedArgs args)
         {
             ScrolledWindow scroll;
-            
+
             if (Parent == null || (scroll = Parent.Parent as ScrolledWindow) == null) {
                 return;
             }
-            
+
             AddinTile tile = (AddinTile)o;
-            
+
             if (tiles.IndexOf (tile) != selected_index) {
                 return;
             }
-            
+
             Gdk.Rectangle ta = ((AddinTile)o).Allocation;
-            Gdk.Rectangle va = new Gdk.Rectangle (0, (int)scroll.Vadjustment.Value, 
+            Gdk.Rectangle va = new Gdk.Rectangle (0, (int)scroll.Vadjustment.Value,
                 Allocation.Width, Parent.Allocation.Height);
-            
+
             if (!va.Contains (ta)) {
                 double delta = 0.0;
                 if (ta.Bottom > va.Bottom) {
@@ -128,29 +128,29 @@ namespace Banshee.Addins.Gui
                 QueueDraw();
             }
         }
-        
+
         protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
         {
             HasFocus = true;
-            
+
             ClearSelection ();
-            
+
             for (int i = 0; i < tiles.Count; i++) {
                 if (tiles[i].Allocation.Contains ((int)evnt.X, (int)evnt.Y)) {
                     Select (i);
                     break;
                 }
             }
-            
+
             QueueDraw ();
-            
+
             return base.OnButtonPressEvent (evnt);
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
         {
             int index = selected_index;
-        
+
             switch (evnt.Key) {
                  case Gdk.Key.Up:
                  case Gdk.Key.uparrow:
@@ -167,16 +167,16 @@ namespace Banshee.Addins.Gui
                      }
                      break;
             }
-            
+
             if (index != selected_index) {
                 ClearSelection ();
                 Select (index);
                 return true;
             }
-        
+
             return base.OnKeyPressEvent (evnt);
         }
-        
+
         private void Select (int index)
         {
             if (index >= 0 && index < tiles.Count) {
@@ -185,20 +185,20 @@ namespace Banshee.Addins.Gui
             } else {
                 ClearSelection ();
             }
-            
+
             if (Parent != null && Parent.IsRealized) {
                 Parent.GdkWindow.InvalidateRect (Parent.Allocation, true);
             }
-            
+
             QueueResize ();
         }
-        
+
         private void ClearSelection ()
         {
             if (selected_index >= 0 && selected_index < tiles.Count) {
                 tiles[selected_index].Select (false);
             }
-            
+
             selected_index = -1;
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs
index f9d67a8..be530e2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/AlbumListView.cs
@@ -45,12 +45,12 @@ namespace Banshee.Collection.Gui
             ColumnCellAlbum renderer = new ColumnCellAlbum ();
             column_controller.Add (new Column ("Album", renderer, 1.0));
             ColumnController = column_controller;
-            
+
             RowHeightProvider = renderer.ComputeRowHeight;
 
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.TrackInfoUpdated);
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             // TODO: a) Figure out if the track that changed is actually in view
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs
index 692be7a..ce33003 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs
@@ -47,13 +47,13 @@ namespace Banshee.Collection.Gui
     public class ArtworkManager : IService
     {
         private Dictionary<int, SurfaceCache> scale_caches  = new Dictionary<int, SurfaceCache> ();
-            
+
         private class SurfaceCache : LruCache<string, Cairo.ImageSurface>
         {
             public SurfaceCache (int max_items) : base (max_items)
             {
             }
-        
+
             protected override void ExpireItem (Cairo.ImageSurface item)
             {
                 if (item != null) {
@@ -61,7 +61,7 @@ namespace Banshee.Collection.Gui
                 }
             }
         }
-    
+
         public ArtworkManager ()
         {
             try {
@@ -70,93 +70,93 @@ namespace Banshee.Collection.Gui
                 Log.Error ("Could not migrate old album artwork to new location.", e.Message, true);
             }
         }
-        
+
         private void MigrateLegacyAlbumArt ()
         {
             if (Directory.Exists (CoverArtSpec.RootPath)) {
                 return;
             }
-            
+
             // FIXME: Replace with Directory.Move for release
-            
+
             Directory.CreateDirectory (CoverArtSpec.RootPath);
-            
+
             string legacy_artwork_path = Path.Combine (Paths.LegacyApplicationData, "covers");
             int artwork_count = 0;
-            
+
             if (Directory.Exists (legacy_artwork_path)) {
                 foreach (string path in Directory.GetFiles (legacy_artwork_path)) {
                     string dest_path = Path.Combine (CoverArtSpec.RootPath, Path.GetFileName (path));
-                        
+
                     File.Copy (path, dest_path);
                     artwork_count++;
                 }
             }
-            
+
             Log.Debug (String.Format ("Migrated {0} album art images.", artwork_count));
         }
-        
+
         public Cairo.ImageSurface LookupSurface (string id)
         {
             return LookupScaleSurface (id, 0);
         }
-        
+
         public Cairo.ImageSurface LookupScaleSurface (string id, int size)
         {
             return LookupScaleSurface (id, size, false);
         }
-        
+
         public Cairo.ImageSurface LookupScaleSurface (string id, int size, bool useCache)
         {
             SurfaceCache cache = null;
             Cairo.ImageSurface surface = null;
-            
+
             if (id == null) {
                 return null;
             }
-            
+
             if (useCache && scale_caches.TryGetValue (size, out cache) && cache.TryGetValue (id, out surface)) {
                 return surface;
             }
-        
+
             Pixbuf pixbuf = LookupScalePixbuf (id, size);
             if (pixbuf == null || pixbuf.Handle == IntPtr.Zero) {
                 return null;
             }
-            
+
             try {
                 surface = PixbufImageSurface.Create (pixbuf);
                 if (surface == null) {
                     return null;
                 }
-                
+
                 if (!useCache) {
                     return surface;
                 }
-                
+
                 if (cache == null) {
                     int bytes = 4 * size * size;
                     int max = (1 << 20) / bytes;
-                    
+
                     Log.DebugFormat ("Creating new surface cache for {0} KB (max) images, capped at 1 MB ({1} items)",
                         bytes, max);
-                        
+
                     cache = new SurfaceCache (max);
                     scale_caches.Add (size, cache);
                 }
-                
+
                 cache.Add (id, surface);
                 return surface;
             } finally {
                 DisposePixbuf (pixbuf);
             }
         }
-        
+
         public Pixbuf LookupPixbuf (string id)
         {
             return LookupScalePixbuf (id, 0);
         }
-        
+
         public Pixbuf LookupScalePixbuf (string id, int size)
         {
             if (id == null || (size != 0 && size < 10)) {
@@ -187,7 +187,7 @@ namespace Banshee.Collection.Gui
                             Hyena.Log.DebugFormat ("Ignoring cover art {0} because less than 50x50", unconverted_path);
                             return null;
                         }
-                        
+
                         pixbuf.Save (orig_path, "jpeg");
                         orig_exists = true;
                     } catch {
@@ -196,7 +196,7 @@ namespace Banshee.Collection.Gui
                     }
                 }
             }
-            
+
             if (orig_exists && size >= 10) {
                 try {
                     Pixbuf pixbuf = new Pixbuf (orig_path);
@@ -207,18 +207,18 @@ namespace Banshee.Collection.Gui
                     return scaled_pixbuf;
                 } catch {}
             }
-            
+
             return null;
         }
-        
+
         private static int dispose_count = 0;
         public static void DisposePixbuf (Pixbuf pixbuf)
         {
             if (pixbuf != null && pixbuf.Handle != IntPtr.Zero) {
                 pixbuf.Dispose ();
                 pixbuf = null;
-                
-                // There is an issue with disposing Pixbufs where we need to explicitly 
+
+                // There is an issue with disposing Pixbufs where we need to explicitly
                 // call the GC otherwise it doesn't get done in a timely way.  But if we
                 // do it every time, it slows things down a lot; so only do it every 100th.
                 if (++dispose_count % 100 == 0) {
@@ -227,7 +227,7 @@ namespace Banshee.Collection.Gui
                 }
             }
         }
-        
+
         string IService.ServiceName {
             get { return "ArtworkManager"; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkRenderer.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkRenderer.cs
index cf4ba18..dcd0a40 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkRenderer.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkRenderer.cs
@@ -37,68 +37,68 @@ namespace Banshee.Collection.Gui
     {
         private static Color cover_border_light_color = new Color (1.0, 1.0, 1.0, 0.5);
         private static Color cover_border_dark_color = new Color (0.0, 0.0, 0.0, 0.65);
-        
+
         public static void RenderThumbnail (Cairo.Context cr, ImageSurface image, bool dispose,
             double x, double y, double width, double height, bool drawBorder, double radius)
         {
-            RenderThumbnail (cr, image, dispose, x, y, width, height, 
+            RenderThumbnail (cr, image, dispose, x, y, width, height,
                 drawBorder, radius, false, cover_border_light_color);
         }
-        
+
         public static void RenderThumbnail (Cairo.Context cr, ImageSurface image, bool dispose,
-            double x, double y, double width, double height, bool drawBorder, double radius, 
+            double x, double y, double width, double height, bool drawBorder, double radius,
             bool fill, Color fillColor)
         {
-            RenderThumbnail (cr, image, dispose, x, y, width, height, drawBorder, radius, 
+            RenderThumbnail (cr, image, dispose, x, y, width, height, drawBorder, radius,
                 fill, fillColor, CairoCorners.All);
         }
-        
+
         public static void RenderThumbnail (Cairo.Context cr, ImageSurface image, bool dispose,
-            double x, double y, double width, double height, bool drawBorder, double radius, 
+            double x, double y, double width, double height, bool drawBorder, double radius,
             bool fill, Color fillColor, CairoCorners corners)
         {
             if (image == null || image.Handle == IntPtr.Zero) {
                 return;
             }
-            
+
             double p_x = x;
             double p_y = y;
             p_x += image.Width < width ? (width - image.Width) / 2 : 0;
             p_y += image.Height < height ? (height - image.Height) / 2 : 0;
-            
+
             cr.Antialias = Cairo.Antialias.Default;
-            
+
             if (fill) {
                 cr.Rectangle (x, y, width, height);
                 cr.Color = fillColor;
                 cr.Fill();
             }
-            
+
             CairoExtensions.RoundedRectangle (cr, p_x, p_y, image.Width, image.Height, radius, corners);
             cr.SetSource (image, p_x, p_y);
             cr.Fill ();
-            
+
             if (!drawBorder) {
                 if (dispose) {
                     ((IDisposable)image).Dispose ();
                 }
-                
+
                 return;
             }
-            
+
             cr.LineWidth = 1.0;
             if (radius < 1) {
                 cr.Antialias = Antialias.None;
-                
+
                 CairoExtensions.RoundedRectangle (cr, x + 1.5, y + 1.5, width - 3, height - 3, radius, corners);
                 cr.Color = cover_border_light_color;
                 cr.Stroke ();
             }
-            
+
             CairoExtensions.RoundedRectangle (cr, x + 0.5, y + 0.5, width - 1, height - 1, radius, corners);
             cr.Color = cover_border_dark_color;
             cr.Stroke ();
-            
+
             if (dispose) {
                 ((IDisposable)image).Dispose ();
             }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
index fb52f7e..5f6f6c6 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
@@ -51,13 +51,13 @@ namespace Banshee.Collection.Gui
             RulesHint = true;
             RowOpaquePropertyName = "Enabled";
             RowBoldPropertyName = "IsPlaying";
-            
+
             ServiceManager.PlayerEngine.ConnectEvent (
                 OnPlayerEvent, PlayerEvent.StartOfStream | PlayerEvent.StateChange);
-            
+
             ForceDragSourceSet = true;
             IsEverReorderable = true;
-            
+
             RowActivated += delegate (object o, RowActivatedArgs<TrackInfo> args) {
                 ITrackModelSource source = ServiceManager.SourceManager.ActiveSource as ITrackModelSource;
                 if (source != null && source.TrackModel == Model) {
@@ -75,7 +75,7 @@ namespace Banshee.Collection.Gui
         protected override TargetEntry [] DragDropSourceEntries {
             get { return source_targets; }
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey press)
         {
             // Have o act the same as enter - activate the selection
@@ -155,7 +155,7 @@ namespace Banshee.Collection.Gui
             base.OnDragSourceSet ();
             Drag.SourceSetIconName (this, "audio-x-generic");
         }
-        
+
         protected override bool OnDragDrop (Gdk.DragContext context, int x, int y, uint time_)
         {
             y = TranslateToListY (y);
@@ -167,17 +167,17 @@ namespace Banshee.Collection.Gui
                     if (row != GetRowAtY (y + RowHeight / 2)) {
                         row += 1;
                     }
-                    
+
                     if (playlist.TrackModel.Selection.Contains (row)) {
                         // can't drop within the selection
                         return false;
                     }
-                    
+
                     playlist.ReorderSelectedTracks (row);
                     return true;
                 }
             }
-            
+
             return false;
         }
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellAlbum.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellAlbum.cs
index f8d43ca..8371884 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellAlbum.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellAlbum.cs
@@ -33,6 +33,7 @@ using Cairo;
 using Hyena.Gui;
 using Hyena.Gui.Theming;
 using Hyena.Data.Gui;
+using Hyena.Data.Gui.Accessibility;
 
 using Banshee.Gui;
 using Banshee.ServiceStack;
@@ -43,61 +44,78 @@ namespace Banshee.Collection.Gui
     {
         private static int image_spacing = 4;
         private static int image_size = 48;
-        
-        private static ImageSurface default_cover_image 
+
+        private static ImageSurface default_cover_image
             = PixbufImageSurface.Create (IconThemeUtils.LoadIcon (image_size, "media-optical", "browser-album-cover"));
-        
+
         private ArtworkManager artwork_manager;
 
         public ColumnCellAlbum () : base (null, true)
         {
             artwork_manager = ServiceManager.Get<ArtworkManager> ();
         }
-    
+
+        private class ColumnCellAlbumAccessible : ColumnCellAccessible
+        {
+            public ColumnCellAlbumAccessible (object bound_object, ColumnCellAlbum cell, ICellAccessibleParent parent)
+                : base (bound_object, cell as ColumnCell, parent)
+            {
+                AlbumInfo bound_album_info = (AlbumInfo)bound_object;
+                Name = String.Format ("{0} - {1}",
+                                     bound_album_info.DisplayTitle,
+                                     bound_album_info.DisplayArtistName);
+            }
+        }
+
+        public override Atk.Object GetAccessible (ICellAccessibleParent parent)
+        {
+            return new ColumnCellAlbumAccessible (BoundObject, this, parent);
+        }
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             if (BoundObject == null) {
                 return;
             }
-            
+
             if (!(BoundObject is AlbumInfo)) {
-                throw new InvalidCastException("ColumnCellAlbum can only bind to AlbumInfo objects");
+                throw new InvalidCastException ("ColumnCellAlbum can only bind to AlbumInfo objects");
             }
-            
+
             AlbumInfo album = (AlbumInfo)BoundObject;
-            
-            bool is_default = false;          
-            ImageSurface image = artwork_manager == null ? null 
+
+            bool is_default = false;
+            ImageSurface image = artwork_manager == null ? null
                 : artwork_manager.LookupScaleSurface (album.ArtworkId, image_size, true);
-            
+
             if (image == null) {
                 image = default_cover_image;
                 is_default = true;
             }
-            
+
             // int image_render_size = is_default ? image.Height : (int)cellHeight - 8;
             int image_render_size = image_size;
             int x = image_spacing;
             int y = ((int)cellHeight - image_render_size) / 2;
-            
-            ArtworkRenderer.RenderThumbnail (context.Context, image, false, x, y, 
+
+            ArtworkRenderer.RenderThumbnail (context.Context, image, false, x, y,
                 image_render_size, image_render_size, !is_default, context.Theme.Context.Radius);
-                
+
             int fl_width = 0, fl_height = 0, sl_width = 0, sl_height = 0;
             Cairo.Color text_color = context.Theme.Colors.GetWidgetColor (GtkColorClass.Text, state);
             text_color.A = 0.75;
-            
+
             Pango.Layout layout = context.Layout;
             layout.Width = (int)((cellWidth - cellHeight - x - 10) * Pango.Scale.PangoScale);
             layout.Ellipsize = Pango.EllipsizeMode.End;
             layout.FontDescription.Weight = Pango.Weight.Bold;
-            
+
             // Compute the layout sizes for both lines for centering on the cell
             int old_size = layout.FontDescription.Size;
-            
+
             layout.SetText (album.DisplayTitle);
             layout.GetPixelSize (out fl_width, out fl_height);
-            
+
             if (!String.IsNullOrEmpty (album.ArtistName)) {
                 layout.FontDescription.Weight = Pango.Weight.Normal;
                 layout.FontDescription.Size = (int)(old_size * Pango.Scale.Small);
@@ -105,54 +123,54 @@ namespace Banshee.Collection.Gui
                 layout.SetText (album.ArtistName);
                 layout.GetPixelSize (out sl_width, out sl_height);
             }
-            
+
             // Calculate the layout positioning
             x = ((int)cellHeight - x) + 10;
             y = (int)((cellHeight - (fl_height + sl_height)) / 2);
-            
+
             // Render the second line first since we have that state already
             if (!String.IsNullOrEmpty (album.ArtistName)) {
                 context.Context.MoveTo (x, y + fl_height);
                 context.Context.Color = text_color;
                 PangoCairoHelper.ShowLayout (context.Context, layout);
             }
-            
+
             // Render the first line, resetting the state
             layout.SetText (album.DisplayTitle);
             layout.FontDescription.Weight = Pango.Weight.Bold;
             layout.FontDescription.Size = old_size;
             layout.FontDescription.Style = Pango.Style.Normal;
-            
+
             layout.SetText (album.DisplayTitle);
-            
+
             context.Context.MoveTo (x, y);
             text_color.A = 1;
             context.Context.Color = text_color;
             PangoCairoHelper.ShowLayout (context.Context, layout);
         }
-        
+
         public int ComputeRowHeight (Widget widget)
         {
             int height;
             int text_w, text_h;
-            
+
             Pango.Layout layout = new Pango.Layout (widget.PangoContext);
             layout.FontDescription = widget.PangoContext.FontDescription.Copy ();
-            
+
             layout.FontDescription.Weight = Pango.Weight.Bold;
             layout.SetText ("W");
             layout.GetPixelSize (out text_w, out text_h);
             height = text_h;
-            
+
             layout.FontDescription.Weight = Pango.Weight.Normal;
             layout.FontDescription.Size = (int)(layout.FontDescription.Size * Pango.Scale.Small);
             layout.FontDescription.Style = Pango.Style.Italic;
             layout.SetText ("W");
             layout.GetPixelSize (out text_w, out text_h);
             height += text_h;
-            
+
             layout.Dispose ();
-            
+
             return (height < image_size ? image_size : height) + 6;
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
index 170e473..77eebb8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellCreativeCommons.cs
 //
 // Author:
@@ -27,6 +27,8 @@
 //
 
 using System;
+using System.Linq;
+using System.Collections.Generic;
 using Gtk;
 using Cairo;
 
@@ -40,70 +42,103 @@ using Banshee.ServiceStack;
 
 namespace Banshee.Collection.Gui
 {
-    public class ColumnCellCreativeCommons : ColumnCell
+    public class ColumnCellCreativeCommons : ColumnCell, ISizeRequestCell, ITooltipCell
     {
         private static Gdk.Pixbuf [] pixbufs;
-        private static string [] attributes = new string [] {"by", "nc", "nd", "sa", "pd"};
+        private static string [] attributes = new string [] {"by", "nc", "nd", "sa", "pd", "publicdomain"};
+        private static string [] attributes_uc = new string [] {"BY", "NC", "ND", "SA", "PD", "Public Domain"};
         private const string CC_ID = "creativecommons.org/licenses/";
         private static int CC_ID_LEN = CC_ID.Length;
+        private const int ICON_SIZE = 16;
 
         public ColumnCellCreativeCommons (string property, bool expand) : base (property, expand)
         {
             LoadPixbufs ();
         }
 
+        public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
+        {
+            context.Context.Translate (0, 0.5);
+            int draw_x = 0;
+
+            foreach (int i in AttributesForBoundObject) {
+                Gdk.Pixbuf render_pixbuf = pixbufs[i];
+
+                Cairo.Rectangle pixbuf_area = new Cairo.Rectangle (draw_x,
+                    (cellHeight - render_pixbuf.Height) / 2, render_pixbuf.Width, render_pixbuf.Height);
+
+                if (!context.Opaque) {
+                    context.Context.Save ();
+                }
+
+                Gdk.CairoHelper.SetSourcePixbuf (context.Context, render_pixbuf, pixbuf_area.X, pixbuf_area.Y);
+                context.Context.Rectangle (pixbuf_area);
+
+                if (!context.Opaque) {
+                    context.Context.Clip ();
+                    context.Context.PaintWithAlpha (0.5);
+                    context.Context.Restore ();
+                } else {
+                    context.Context.Fill ();
+                }
+
+                draw_x += render_pixbuf.Width;
+            }
+        }
+
+        public string GetTooltipMarkup (CellContext cellContext, double columnWidth)
+        {
+            var our_attributes = AttributesForBoundObject.Select (i => attributes_uc[i]);
+            return our_attributes.Count () > 0
+                ? String.Format ("Creative Commons {0}", String.Join ("-", our_attributes.ToArray ()))
+                : null;
+        }
+
         private void LoadPixbufs ()
         {
             if (pixbufs == null) {
                 pixbufs = new Gdk.Pixbuf[attributes.Length];
             }
-            
-            for (int i = 0; i < attributes.Length; i++) {
-                pixbufs[i] = IconThemeUtils.LoadIcon (16, String.Format ("creative-commons-{0}", attributes[i]));
+
+            for (int i = 0; i < attributes.Length - 1; i++) {
+                pixbufs[i] = IconThemeUtils.LoadIcon (ICON_SIZE, String.Format ("creative-commons-{0}", attributes[i]));
             }
+
+            // HACK to enable 'publicdomain' to work
+            pixbufs[attributes.Length - 1] = pixbufs[attributes.Length - 2];
         }
 
-        public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
-        {
-            string license_uri = BoundObject as string;
-            if (String.IsNullOrEmpty (license_uri)) {
-                return;
-            }
+        private IEnumerable<int> AttributesForBoundObject {
+            get {
+                string license_uri = BoundObject as string;
+                if (String.IsNullOrEmpty (license_uri)) {
+                    yield break;
+                }
 
-            int start_index = license_uri.IndexOf (CC_ID);
-            if (start_index == -1) {
-                return;
-            }
+                int start_index = license_uri.IndexOf (CC_ID);
+                if (start_index == -1) {
+                    yield break;
+                }
 
-            start_index += CC_ID_LEN;
-            context.Context.Translate (0, 0.5);
+                start_index += CC_ID_LEN;
 
-            int draw_x = 0;
-            for (int i = 0; i < attributes.Length; i++) {
-                if (license_uri.IndexOf (attributes[i], start_index) != -1) {
-                    Gdk.Pixbuf render_pixbuf = pixbufs[i];
-
-                    Cairo.Rectangle pixbuf_area = new Cairo.Rectangle (draw_x,
-                        (cellHeight - render_pixbuf.Height) / 2, render_pixbuf.Width, render_pixbuf.Height);
-                    
-                    if (!context.Opaque) {
-                        context.Context.Save ();
-                    }
-                    
-                    Gdk.CairoHelper.SetSourcePixbuf (context.Context, render_pixbuf, pixbuf_area.X, pixbuf_area.Y);
-                    context.Context.Rectangle (pixbuf_area);
-                    
-                    if (!context.Opaque) {
-                        context.Context.Clip ();
-                        context.Context.PaintWithAlpha (0.5);
-                        context.Context.Restore ();
-                    } else {
-                        context.Context.Fill ();
+                for (int i = 0; i < attributes.Length; i++) {
+                    if (license_uri.IndexOf (attributes[i], start_index) != -1) {
+                        yield return i;
                     }
-
-                    draw_x += render_pixbuf.Width;
                 }
             }
         }
+
+        public bool RestrictSize {
+            get { return true; }
+            set {}
+        }
+
+        public void GetWidthRange (Pango.Layout layout, out int min, out int max)
+        {
+            // -1 b/c of 2 public domain entries
+            min = max = ICON_SIZE * attributes.Length - 1;
+        }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs
index 953574c..bd0795d 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellDateTime.cs
 //
 // Author:
@@ -32,7 +32,7 @@ using Hyena.Data.Gui;
 
 namespace Banshee.Collection.Gui
 {
-    public enum DateTimeFormat 
+    public enum DateTimeFormat
     {
         Long,
         ShortDate,
@@ -40,19 +40,19 @@ namespace Banshee.Collection.Gui
         ShortTime,
         LongTime
     }
-        
+
     public class ColumnCellDateTime : ColumnCellText
     {
         public ColumnCellDateTime (string property, bool expand) : base (property, expand)
         {
         }
-        
+
         private DateTimeFormat format = DateTimeFormat.Long;
         public DateTimeFormat Format {
             get { return format; }
             set { format = value; }
         }
-        
+
         protected override string GetText (object obj)
         {
             if (obj == null) {
@@ -60,7 +60,7 @@ namespace Banshee.Collection.Gui
             }
 
             DateTime dt = (DateTime) obj;
-            
+
             if (dt == DateTime.MinValue) {
                 return String.Empty;
             }
@@ -72,7 +72,7 @@ namespace Banshee.Collection.Gui
             case DateTimeFormat.ShortTime:    return dt.ToShortTimeString ();
             case DateTimeFormat.LongTime:     return dt.ToLongTimeString ();
             }
-            
+
             return String.Empty;
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs
index f639e90..9de5f6f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDiscAndCount.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellDiscAndCount.cs
 //
 // Author:
@@ -45,7 +45,7 @@ namespace Banshee.Collection.Gui
             MaxString = String.Format (format, 55, 55);
             RestrictSize = true;
         }
-        
+
         protected override string GetText (object obj)
         {
             Banshee.Collection.TrackInfo track = BoundObjectParent as Banshee.Collection.TrackInfo;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs
index a7905cb..420b030 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellDuration.cs
 //
 // Author:
@@ -39,22 +39,22 @@ namespace Banshee.Collection.Gui
             Alignment = Pango.Alignment.Right;
             SetMinMaxStrings (TimeSpan.FromHours (5.73), TimeSpan.FromDays (7.34));
         }
-        
+
         protected override string GetText (object obj)
         {
             if (!(obj is TimeSpan)) {
                 return base.GetText (obj);
             }
-            
+
             // Fancy rounding commented out since it's not consistent with what is
             // done in libbanshee.  See http://bugzilla.gnome.org/show_bug.cgi?id=520648
             //int seconds = (int)Math.Round(((TimeSpan)obj).TotalSeconds);
             int seconds = (int) ((TimeSpan)obj).TotalSeconds;
-            
+
             if (seconds == 0) {
                 return String.Empty;
             }
-                
+
             return Banshee.Sources.DurationStatusFormatters.ConfusingPreciseFormatter (TimeSpan.FromSeconds (seconds));
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs
index ef1d444..6924003 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellFileSize.cs
 //
 // Author:
@@ -40,7 +40,7 @@ namespace Banshee.Collection.Gui
             Alignment = Pango.Alignment.Right;
             SetMinMaxStrings ((long)1023, (long)(1024 * 1024 * 575.5));
         }
-        
+
         protected override string GetText (object obj)
         {
             if (obj == null) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellLocation.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellLocation.cs
index 82563c8..0733d70 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellLocation.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellLocation.cs
@@ -38,7 +38,7 @@ namespace Banshee.Collection.Gui
         public ColumnCellLocation (string property, bool expand) : base (property, expand)
         {
         }
-        
+
         protected override string GetText (object obj)
         {
             SafeUri uri = obj as SafeUri;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs
index de455c4..4e89a01 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellPositiveInt.cs
 //
 // Author:
@@ -34,12 +34,26 @@ namespace Banshee.Collection.Gui
 {
     public class ColumnCellPositiveInt : ColumnCellText
     {
+        private readonly int min_digits;
+        private readonly int max_digits;
+        private bool culture_formatted;
+
         public ColumnCellPositiveInt (string property, bool expand, int min_digits, int max_digits) : base (property, expand)
         {
-            SetMinMaxStrings ((int)Math.Pow (10, min_digits) - 1, (int)Math.Pow (10, max_digits) - 1);
+            this.min_digits = min_digits;
+            this.max_digits = max_digits;
             Alignment = Pango.Alignment.Right;
+            CultureFormatted = true;
         }
-        
+
+        public bool CultureFormatted {
+            get { return culture_formatted; }
+            set {
+                culture_formatted = value;
+                SetMinMaxStrings ((int)Math.Pow (10, min_digits) - 1, (int)Math.Pow (10, max_digits) - 1);
+            }
+        }
+
         protected override string GetText (object obj)
         {
             if (obj == null) {
@@ -47,7 +61,13 @@ namespace Banshee.Collection.Gui
             }
 
             int val = (int) obj;
-            return val > 0 ? val.ToString () : String.Empty;
+
+            if (val <= 0)
+                return "";
+            else if (CultureFormatted)
+                return val.ToString ("N0");
+            else
+                return val.ToString ();
         }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs
index d550f63..8cd1cb8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs
@@ -39,7 +39,7 @@ namespace Banshee.Collection.Gui
         {
             this.blank = blank;
         }
-        
+
         protected override string GetText (object obj)
         {
             string text = base.GetText (obj);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
index 134c1f1..ecc012e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
@@ -29,9 +29,11 @@
 using System;
 using Gtk;
 using Cairo;
+using Mono.Unix;
 
 using Hyena.Gui;
 using Hyena.Data.Gui;
+using Hyena.Data.Gui.Accessibility;
 using Banshee.Gui;
 
 using Banshee.Streaming;
@@ -40,50 +42,150 @@ using Banshee.ServiceStack;
 
 namespace Banshee.Collection.Gui
 {
-    public class ColumnCellStatusIndicator : ColumnCell
+    class ColumnCellStatusIndicatorAccessible : ColumnCellAccessible, Atk.ImageImplementor
     {
+        private string image_description;
+
+        public ColumnCellStatusIndicatorAccessible (object bound_object, ColumnCellStatusIndicator cell, ICellAccessibleParent parent) : base (bound_object, cell as ColumnCell, parent)
+        {
+            image_description = cell.GetTextAlternative (bound_object);
+        }
+
+        public override void Redrawn ()
+        {
+            string new_image_description = cell.GetTextAlternative (bound_object);
+
+            if (image_description != new_image_description)
+                GLib.Signal.Emit (this, "visible-data-changed");
+
+            image_description = new_image_description;
+        }
+
+        public string ImageLocale { get { return null; } }
+
+        public bool SetImageDescription (string description)
+        {
+            return false;
+        }
+
+        public void GetImageSize (out int width, out int height)
+        {
+            if (!String.IsNullOrEmpty (cell.GetTextAlternative (bound_object)))
+                width = height = 16;
+            else
+                width = height = Int32.MinValue;
+        }
+
+        public string ImageDescription {
+            get {
+                return image_description;
+            }
+        }
+
+        public void GetImagePosition (out int x, out int y, Atk.CoordType coordType)
+        {
+            if (!String.IsNullOrEmpty (cell.GetTextAlternative (bound_object))) {
+                GetPosition (out x, out y, coordType);
+                x += 4;
+                y += 4;
+            } else {
+                x = y = Int32.MinValue;
+            }
+        }
+    }
+
+    public class ColumnCellStatusIndicator : ColumnCell, ISizeRequestCell
+    {
+        const int padding = 2;
+
         protected enum Icon : int {
             Playing,
             Paused,
             Error,
             Protected
         }
-        
+
+        private string [] status_names;
+        protected string [] StatusNames {
+            get { return status_names; }
+        }
+
         private int pixbuf_size = 16;
         protected virtual int PixbufSize {
             get { return pixbuf_size; }
             set { pixbuf_size = value; }
         }
-        
+
         private int pixbuf_spacing = 4;
         protected virtual int PixbufSpacing {
             get { return pixbuf_spacing; }
             set { pixbuf_spacing = value; }
         }
-        
+
         private Gdk.Pixbuf [] pixbufs;
         protected Gdk.Pixbuf [] Pixbufs {
             get { return pixbufs; }
         }
-        
+
         public ColumnCellStatusIndicator (string property) : this (property, true)
         {
         }
-        
+
         public ColumnCellStatusIndicator (string property, bool expand) : base (property, expand)
         {
             LoadPixbufs ();
+            RestrictSize = true;
+        }
+
+        public bool RestrictSize { get; set; }
+
+        public void GetWidthRange (Pango.Layout layout, out int min_width, out int max_width)
+        {
+            min_width = max_width = pixbuf_size + 2 * padding;
         }
-        
+
+        public override Atk.Object GetAccessible (ICellAccessibleParent parent)
+        {
+            return new ColumnCellStatusIndicatorAccessible (BoundObject, this, parent);
+        }
+
+        public override string GetTextAlternative (object obj)
+        {
+            var track = obj as TrackInfo;
+            if (track == null)
+                return "";
+
+            int icon_index = GetIconIndex (track);
+
+            if ((icon_index < 0) || (icon_index >= status_names.Length))
+                return "";
+            else
+                return status_names[icon_index];
+        }
+
         protected virtual int PixbufCount {
             get { return 4; }
         }
-        
+
         protected virtual int GetIconIndex (TrackInfo track)
         {
-            return -1;
+            int icon_index = -1;
+
+            if (track.PlaybackError != StreamPlaybackError.None) {
+                icon_index = (int)(track.PlaybackError == StreamPlaybackError.Drm
+                    ? Icon.Protected
+                    : Icon.Error);
+            } else if (track.IsPlaying) {
+                icon_index = (int)(ServiceManager.PlayerEngine.CurrentState == PlayerState.Paused
+                    ? Icon.Paused
+                    : Icon.Playing);
+            } else {
+                icon_index = -1;
+            }
+
+            return icon_index;
         }
-        
+
         protected virtual void LoadPixbufs ()
         {
             if (pixbufs != null && pixbufs.Length > 0) {
@@ -94,17 +196,28 @@ namespace Banshee.Collection.Gui
                     }
                 }
             }
-            
+
             if (pixbufs == null) {
                 pixbufs = new Gdk.Pixbuf[PixbufCount];
             }
-            
-            pixbufs[(int)Icon.Playing] = IconThemeUtils.LoadIcon (PixbufSize, "media-playback-start");
-            pixbufs[(int)Icon.Paused] = IconThemeUtils.LoadIcon (PixbufSize, "media-playback-pause");
-            pixbufs[(int)Icon.Error] = IconThemeUtils.LoadIcon (PixbufSize, "emblem-unreadable", "dialog-error");
+
+            pixbufs[(int)Icon.Playing]   = IconThemeUtils.LoadIcon (PixbufSize, "media-playback-start");
+            pixbufs[(int)Icon.Paused]    = IconThemeUtils.LoadIcon (PixbufSize, "media-playback-pause");
+            pixbufs[(int)Icon.Error]     = IconThemeUtils.LoadIcon (PixbufSize, "emblem-unreadable", "dialog-error");
             pixbufs[(int)Icon.Protected] = IconThemeUtils.LoadIcon (PixbufSize, "emblem-readonly", "dialog-error");
+
+            if (status_names == null) {
+                status_names = new string[PixbufCount];
+                for (int i=0; i<PixbufCount; i++)
+                    status_names[i] = "";
+            }
+
+            status_names[(int)Icon.Playing]   = Catalog.GetString ("Playing");
+            status_names[(int)Icon.Paused]    = Catalog.GetString ("Paused");
+            status_names[(int)Icon.Error]     = Catalog.GetString ("Error");
+            status_names[(int)Icon.Protected] = Catalog.GetString ("Protected");
         }
-        
+
         public override void NotifyThemeChange ()
         {
             LoadPixbufs ();
@@ -116,39 +229,27 @@ namespace Banshee.Collection.Gui
             if (track == null) {
                 return;
             }
-            
-            int icon_index = -1;
 
-            if (track.PlaybackError != StreamPlaybackError.None) {
-                icon_index = (int)(track.PlaybackError == StreamPlaybackError.Drm
-                    ? Icon.Protected
-                    : Icon.Error);
-            } else if (track.IsPlaying) {
-                icon_index = (int)(ServiceManager.PlayerEngine.CurrentState == PlayerState.Paused
-                    ? Icon.Paused
-                    : Icon.Playing);
-            } else {
-                icon_index = GetIconIndex (track);
-            }
-            
+            int icon_index = GetIconIndex (track);
+
             if (icon_index < 0 || pixbufs == null || pixbufs[icon_index] == null) {
                 return;
             }
-            
+
             context.Context.Translate (0, 0.5);
-            
+
             Gdk.Pixbuf render_pixbuf = pixbufs[icon_index];
-            
-            Cairo.Rectangle pixbuf_area = new Cairo.Rectangle ((cellWidth - render_pixbuf.Width) / 2, 
+
+            Cairo.Rectangle pixbuf_area = new Cairo.Rectangle ((cellWidth - render_pixbuf.Width) / 2,
                 (cellHeight - render_pixbuf.Height) / 2, render_pixbuf.Width, render_pixbuf.Height);
-            
+
             if (!context.Opaque) {
                 context.Context.Save ();
             }
-            
+
             Gdk.CairoHelper.SetSourcePixbuf (context.Context, render_pixbuf, pixbuf_area.X, pixbuf_area.Y);
             context.Context.Rectangle (pixbuf_area);
-            
+
             if (!context.Opaque) {
                 context.Context.Clip ();
                 context.Context.PaintWithAlpha (0.5);
@@ -157,7 +258,7 @@ namespace Banshee.Collection.Gui
                 context.Context.Fill ();
             }
         }
-        
+
         protected TrackInfo BoundTrack {
             get { return BoundObject as TrackInfo; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
index 31783cf..4aebd48 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
@@ -43,7 +43,7 @@ namespace Banshee.Collection.Gui
         public ColumnCellTrack () : base (null, true)
         {
         }
-        
+
         public int ComputeRowHeight (Widget widget)
         {
             int lw, lh;
@@ -53,37 +53,37 @@ namespace Banshee.Collection.Gui
             layout.Dispose ();
             return lh + 8;
         }
-        
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             if (BoundObject == null) {
                 return;
             }
-            
+
             if (!(BoundObject is TrackInfo)) {
                 throw new InvalidCastException ("ColumnCellAlbum can only bind to AlbumInfo objects");
             }
-            
+
             TrackInfo track = (TrackInfo)BoundObject;
 
             context.Layout.Width = (int)((cellWidth - 8) * Pango.Scale.PangoScale);
             context.Layout.Ellipsize = Pango.EllipsizeMode.End;
             //context.Layout.FontDescription = context.Widget.PangoContext.FontDescription.Copy ();
             context.Layout.FontDescription.Weight = font_weight;
-            context.Layout.SetMarkup (String.Format ("<b>{0}</b>\n<small><i>{1}</i></small>", 
-                GLib.Markup.EscapeText (track.DisplayTrackTitle), 
+            context.Layout.SetMarkup (String.Format ("<b>{0}</b>\n<small><i>{1}</i></small>",
+                GLib.Markup.EscapeText (track.DisplayTrackTitle),
                 GLib.Markup.EscapeText (track.DisplayArtistName)));
 
             int text_width;
             int text_height;
             context.Layout.GetPixelSize (out text_width, out text_height);
-            
+
             context.Context.MoveTo (4, ((int)cellHeight - text_height) / 2);
             Cairo.Color color = context.Theme.Colors.GetWidgetColor (
                 context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
             color.A = (!context.Opaque) ? 0.3 : 1.0;
             context.Context.Color = color;
-            
+
             PangoCairoHelper.ShowLayout (context.Context, context.Layout);
         }
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs
index 822bd97..d8371e9 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackAndCount.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellTrackAndCount.cs
 //
 // Author:
@@ -45,7 +45,7 @@ namespace Banshee.Collection.Gui
             MaxString = String.Format (format, 555, 555);
             RestrictSize = true;
         }
-        
+
         protected override string GetText (object obj)
         {
             Banshee.Collection.TrackInfo track = BoundObjectParent as Banshee.Collection.TrackInfo;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs
index 892f1bd..80aa492 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ColumnCellTrackNumber.cs
 //
 // Author:
@@ -37,9 +37,9 @@ namespace Banshee.Collection.Gui
         public ColumnCellTrackNumber (string property, bool expand) : base (property, expand)
         {
             SetMinMaxStrings (99, 999);
-            Alignment = Pango.Alignment.Right;    
+            Alignment = Pango.Alignment.Right;
         }
-        
+
         protected override string GetText (object obj)
         {
             if (obj == null || (int) obj == 0) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
index 5c475db..7fa1cdc 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
@@ -49,8 +49,8 @@ namespace Banshee.Collection.Gui
         public DefaultColumnController () : this (true)
         {
         }
-        
-        public DefaultColumnController (bool loadDefault) : base (String.Format ("{0}.{1}", 
+
+        public DefaultColumnController (bool loadDefault) : base (String.Format ("{0}.{1}",
             Application.ActiveClient.ClientId, "track_view_columns"))
         {
             CreateDefaultColumns ();
@@ -61,7 +61,7 @@ namespace Banshee.Collection.Gui
                 Load ();
             }
         }
-        
+
         public void AddDefaultColumns ()
         {
             AddRange (
@@ -104,7 +104,7 @@ namespace Banshee.Collection.Gui
             // Visible-by-default column
             track_column        = Create (BansheeQuery.TrackNumberField, 0.10, true, new ColumnCellTrackNumber (null, true));
             track_column.Title = String.Empty; // don't show any text in the header for this column, so it can be smaller
-            
+
             title_column        = CreateText (BansheeQuery.TitleField, 0.25, true);
             artist_column       = CreateText (BansheeQuery.ArtistField, 0.225, true);
             album_column        = CreateText (BansheeQuery.AlbumField, 0.225, true);
@@ -113,7 +113,7 @@ namespace Banshee.Collection.Gui
             album_artist_column = CreateText (BansheeQuery.AlbumArtistField, 0.225);
             genre_column        = CreateText (BansheeQuery.GenreField, 0.25);
             duration_column     = Create (BansheeQuery.DurationField, 0.10, true, new ColumnCellDuration (null, true));
-            year_column         = Create (BansheeQuery.YearField, 0.15, false, new ColumnCellPositiveInt (null, true, 4, 4));
+            year_column         = Create (BansheeQuery.YearField, 0.15, false, new ColumnCellPositiveInt (null, true, 4, 4) { CultureFormatted = false });
             file_size_column    = Create (BansheeQuery.FileSizeField, 0.15, false, new ColumnCellFileSize (null, true));
             bpm_column          = Create (BansheeQuery.BpmField, 0.10, false, new ColumnCellPositiveInt (null, true, 3, 3));
 
@@ -123,16 +123,16 @@ namespace Banshee.Collection.Gui
             track_combined_column.Id = "track_and_count";
             track_combined_column.Title = Catalog.GetString ("Track #");
             track_combined_column.LongTitle = Catalog.GetString ("Track & Count");
-            
+
             disc_combined_column = Create (BansheeQuery.DiscNumberField, 0.10, false, new ColumnCellDiscAndCount (null, true));
             disc_combined_column.Property = null;
             disc_combined_column.Title = Catalog.GetString ("Disc #");
             disc_combined_column.LongTitle = Catalog.GetString ("Disc & Count");
 
-            ColumnCellPositiveInt br_cell = new ColumnCellPositiveInt (null, true, 3, 3);
+            ColumnCellPositiveInt br_cell = new ColumnCellPositiveInt (null, true, 3, 4);
             br_cell.TextFormat  = Catalog.GetString ("{0} kbps");
             bitrate_column      = Create (BansheeQuery.BitRateField, 0.10, false, br_cell);
-            
+
             rating_column       = Create (BansheeQuery.RatingField, 0.15, false, new ColumnCellRating (null, true));
             score_column        = Create (BansheeQuery.ScoreField, 0.15, false, new ColumnCellPositiveInt (null, true, 2, 5));
             composer_column     = CreateText (BansheeQuery.ComposerField, 0.25);
@@ -146,7 +146,7 @@ namespace Banshee.Collection.Gui
             ColumnCellText uri_cell = new ColumnCellLocation (BansheeQuery.UriField.PropertyName, true);
             uri_cell.EllipsizeMode = Pango.EllipsizeMode.Start;
             uri_column          = Create (BansheeQuery.UriField, 0.15, false, uri_cell);
-            
+
             mime_type_column    = CreateText (BansheeQuery.MimeTypeField, 0.15);
             license_uri_column  = Create (BansheeQuery.LicenseUriField, 0.15, false, new ColumnCellCreativeCommons (null, true));
 
@@ -178,19 +178,19 @@ namespace Banshee.Collection.Gui
 
             return col;
         }
-        
+
 #region Column Properties
 
         private Column indicator_column;
         public Column IndicatorColumn {
             get { return indicator_column; }
         }
-        
+
         private SortableColumn track_column;
         public SortableColumn TrackColumn {
             get { return track_column; }
         }
-        
+
         private SortableColumn title_column;
         public SortableColumn TitleColumn {
             get { return title_column; }
@@ -200,22 +200,22 @@ namespace Banshee.Collection.Gui
         public SortableColumn ArtistColumn {
             get { return artist_column; }
         }
-        
+
         private SortableColumn album_column;
         public SortableColumn AlbumColumn {
             get { return album_column; }
         }
-        
+
         private SortableColumn duration_column;
         public SortableColumn DurationColumn {
             get { return duration_column; }
         }
-        
+
         private SortableColumn genre_column;
         public SortableColumn GenreColumn {
             get { return genre_column; }
         }
-        
+
         private SortableColumn year_column;
         public SortableColumn YearColumn {
             get { return year_column; }
@@ -225,37 +225,37 @@ namespace Banshee.Collection.Gui
         public SortableColumn FileSizeColumn {
             get { return file_size_column; }
         }
-        
+
         private SortableColumn composer_column;
         public SortableColumn ComposerColumn {
             get { return composer_column; }
         }
-        
+
         private SortableColumn comment_column;
         public SortableColumn CommentColumn {
             get { return comment_column; }
         }
-        
+
         private SortableColumn play_count_column;
         public SortableColumn PlayCountColumn {
             get { return play_count_column; }
         }
-        
+
         private SortableColumn skip_count_column;
         public SortableColumn SkipCountColumn {
             get { return skip_count_column; }
         }
-        
+
         private SortableColumn disc_combined_column;
         public SortableColumn DiscNumberAndCountColumn {
             get { return disc_combined_column; }
         }
-        
+
         private SortableColumn rating_column;
         public SortableColumn RatingColumn {
             get { return rating_column; }
         }
-        
+
         private SortableColumn score_column;
         public SortableColumn ScoreColumn {
             get { return score_column; }
@@ -265,17 +265,17 @@ namespace Banshee.Collection.Gui
         public SortableColumn LastPlayedColumn {
             get { return last_played_column; }
         }
-        
+
         private SortableColumn last_skipped_column;
         public SortableColumn LastSkippedColumn {
             get { return last_skipped_column; }
         }
-        
+
         private SortableColumn date_added_column;
         public SortableColumn DateAddedColumn {
             get { return date_added_column; }
         }
-        
+
         private SortableColumn uri_column;
         public SortableColumn UriColumn {
             get { return uri_column; }
@@ -285,17 +285,17 @@ namespace Banshee.Collection.Gui
         public SortableColumn AlbumArtistColumn {
             get { return album_artist_column; }
         }
-        
+
         private SortableColumn track_combined_column;
         public SortableColumn TrackNumberAndCountColumn {
             get { return track_combined_column; }
         }
-        
+
         private SortableColumn bpm_column;
         public SortableColumn BpmColumn {
             get { return bpm_column; }
         }
-        
+
         private SortableColumn bitrate_column;
         public SortableColumn BitRateColumn {
             get { return bitrate_column; }
@@ -310,7 +310,7 @@ namespace Banshee.Collection.Gui
         public SortableColumn GroupingColumn {
             get { return grouping_column; }
         }
-        
+
         private SortableColumn mime_type_column;
         public SortableColumn MimeTypeColumn {
             get { return mime_type_column; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/PersistentColumnController.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/PersistentColumnController.cs
index 96386f9..2f7641e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/PersistentColumnController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/PersistentColumnController.cs
@@ -42,7 +42,7 @@ namespace Banshee.Collection.Gui
         private bool loaded = false;
         private bool pending_changes;
         private uint timer_id = 0;
-        
+
         private string source_id, unique_source_id;
         private Source source;
         public Source Source {
@@ -51,14 +51,14 @@ namespace Banshee.Collection.Gui
                 if (source == value) {
                     return;
                 }
-                
+
                 if (source != null) {
                     Save ();
                 }
-                
+
                 source = value;
                 source_id = unique_source_id = null;
-                
+
                 if (source != null) {
                     // If we have a parent, use their UniqueId so all children of a parent persist the same columns
                     source_id = source.ParentConfigurationId;
@@ -67,42 +67,42 @@ namespace Banshee.Collection.Gui
                 }
             }
         }
-        
+
         public PersistentColumnController (string rootNamespace) : base ()
         {
             if (String.IsNullOrEmpty (rootNamespace)) {
                 throw new ArgumentException ("Argument must not be null or empty", "rootNamespace");
             }
-            
+
             root_namespace = rootNamespace;
         }
-        
+
         public void Load ()
         {
             lock (this) {
                 if (source == null) {
                     return;
                 }
-                
+
                 loaded = false;
-                
+
                 foreach (Column column in this) {
                     if (column.Id != null) {
-                        string @namespace = MakeNamespace (column.Id); 
+                        string @namespace = MakeNamespace (column.Id);
                         column.Visible = ConfigurationClient.Get<bool> (@namespace, "visible", column.Visible);
                         column.Width = ConfigurationClient.Get<double> (@namespace, "width", column.Width);
                     }
                 }
-                
+
                 // Create a copy so we can read the original index
                 List<Column> columns = new List<Column> (Columns);
-            
+
                 Columns.Sort (delegate (Column a, Column b) {
                     int a_order = a.Id == null ? -1 : ConfigurationClient.Get<int> (
                         MakeNamespace (a.Id), "order", columns.IndexOf (a));
                     int b_order = b.Id == null ? -1 : ConfigurationClient.Get<int> (
                         MakeNamespace (b.Id), "order", columns.IndexOf (b));
-                    
+
                     return a_order.CompareTo (b_order);
                 });
 
@@ -129,14 +129,14 @@ namespace Banshee.Collection.Gui
 
                 loaded = true;
             }
-            
+
             OnUpdated ();
         }
 
         public override ISortableColumn SortColumn {
             set { base.SortColumn = value; Save (); }
         }
-        
+
         public void Save ()
         {
             if (timer_id == 0) {
@@ -145,7 +145,7 @@ namespace Banshee.Collection.Gui
                 pending_changes = true;
             }
         }
-        
+
         private bool OnTimeout ()
         {
             if (pending_changes) {
@@ -157,14 +157,14 @@ namespace Banshee.Collection.Gui
                 return false;
             }
         }
-        
+
         private void SaveCore ()
         {
             lock (this) {
                 if (source == null) {
                     return;
                 }
-            
+
                 for (int i = 0; i < Count; i++) {
                     if (Columns[i].Id != null) {
                         Save (Columns[i], i);
@@ -178,7 +178,7 @@ namespace Banshee.Collection.Gui
                 }
             }
         }
-        
+
         private void Save (Column column, int index)
         {
             string @namespace = MakeNamespace (column.Id);
@@ -186,21 +186,21 @@ namespace Banshee.Collection.Gui
             ConfigurationClient.Set<bool> (@namespace, "visible", column.Visible);
             ConfigurationClient.Set<double> (@namespace, "width", column.Width);
         }
-        
+
         protected override void OnWidthsChanged ()
         {
             if (loaded) {
                 Save ();
             }
-            
+
             base.OnWidthsChanged ();
         }
-        
+
         private string MakeNamespace (string name)
         {
             return String.Format ("{0}.{1}.{2}", root_namespace, source_id, name);
         }
-        
+
         public override bool EnableColumnMenu {
             get { return true; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs
index b5ab22e..bd24875 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs
@@ -40,16 +40,16 @@ namespace Banshee.Collection.Gui
     public class TerseTrackListView : BaseTrackListView
     {
         private ColumnController column_controller;
-        
+
         public TerseTrackListView () : base ()
         {
             column_controller = new ColumnController ();
 
             ColumnCellTrack renderer = new ColumnCellTrack ();
             column_controller.Add (new Column ("Track", renderer, 1.0));
-            
+
             ColumnController = column_controller;
-            
+
             RowHeightProvider = renderer.ComputeRowHeight;
             HeaderVisible = false;
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
index 259188d..4e7629b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
@@ -41,14 +41,14 @@ namespace Banshee.Collection.Gui
     public class TrackFilterListView<T> : ListView<T>
     {
         protected ColumnController column_controller;
-        
+
         public TrackFilterListView () : base ()
         {
             column_controller = new ColumnController ();
 
             ForceDragSourceSet = true;
             HeaderVisible = false;
-            
+
             RowActivated += OnRowActivated;
         }
 
@@ -78,7 +78,7 @@ namespace Banshee.Collection.Gui
             ServiceManager.Get<InterfaceActionService> ().TrackActions.SuppressSelectActions ();
             return base.OnFocusInEvent(evnt);
         }
-        
+
         protected override bool OnFocusOutEvent(Gdk.EventFocus evnt)
         {
             ServiceManager.Get<InterfaceActionService> ().TrackActions.UnsuppressSelectActions ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
index e0d8e9c..e1ebe21 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
@@ -46,20 +46,20 @@ namespace Banshee.Collection.Gui
     public class TrackListView : BaseTrackListView
     {
         private ColumnController default_column_controller;
-        
+
         public TrackListView () : base ()
         {
             default_column_controller = new DefaultColumnController ();
         }
-        
+
         public override void SetModel (IListModel<TrackInfo> value, double vpos)
         {
             //Console.WriteLine ("TrackListView.SetModel for {0} with vpos {1}", value, vpos);
-            
+
             if (value != null) {
                 Source source = ServiceManager.SourceManager.ActiveSource;
                 ColumnController controller = null;
-                
+
                 // Get the controller from this source, or its parent(s) if it doesn't have one
                 while (source != null && controller == null) {
                     controller = source.Properties.Get<ColumnController> ("TrackView.ColumnController");
@@ -73,18 +73,18 @@ namespace Banshee.Collection.Gui
                     }
                     source = source.Parent;
                 }
-                
+
                 controller = controller ?? default_column_controller;
-                
+
                 PersistentColumnController persistent_controller = controller as PersistentColumnController;
                 if (persistent_controller != null) {
                     //Hyena.Log.InformationFormat ("Setting controller source to {0}", ServiceManager.SourceManager.ActiveSource.Name);
                     persistent_controller.Source = ServiceManager.SourceManager.ActiveSource;
                 }
-                
+
                 ColumnController = controller;
             }
-            
+
             base.SetModel (value, vpos);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs
index 51853ab..a3998c7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs
@@ -42,21 +42,21 @@ namespace Banshee.Collection.Gui
         public XmlColumnController (string xml) : base (false)
         {
             XmlTextReader reader = new XmlTextReader (new StringReader (xml));
-            
+
             while (reader.Read ()) {
                 if (reader.NodeType == XmlNodeType.Element && reader.Name == "column-controller") {
                     ReadColumnController (reader, reader.Depth);
                 }
             }
-            
+
             Load ();
         }
-        
+
         private void ReadColumnController (XmlTextReader reader, int depth)
         {
             string sort_column = null;
             bool sort_asc = true;
-            
+
             while (reader.Read ()) {
                 if (reader.NodeType == XmlNodeType.Element) {
                     switch (reader.Name) {
@@ -87,7 +87,7 @@ namespace Banshee.Collection.Gui
                     break;
                 }
             }
-            
+
             if (sort_column != null) {
                 foreach (Column col in Columns) {
                     if (col.Id == sort_column) {
@@ -102,11 +102,11 @@ namespace Banshee.Collection.Gui
                 }
             }
         }
-        
+
         private void ReadColumn (XmlTextReader reader, int depth)
         {
             string modify_default = null;
-            
+
             string title = null;
             string long_title = null;
             string sort_key = null;
@@ -114,25 +114,25 @@ namespace Banshee.Collection.Gui
             int max_width = -1;
             int min_width = -1;
             bool visible = true;
-            
+
             string renderer_type = null;
             string renderer_property = null;
             bool renderer_expand = true;
-            
+
             while (reader.MoveToNextAttribute ()) {
                 if (reader.Name == "modify-default") {
                     modify_default = reader.Value;
                     break;
                 }
             }
-                
+
             while (reader.Read ()) {
                 if (reader.NodeType == XmlNodeType.EndElement && reader.Depth == depth) {
                     break;
                 } else if (reader.NodeType != XmlNodeType.Element) {
                     continue;
                 }
-                
+
                 switch (reader.Name) {
                     case "title": title = reader.ReadString (); break;
                     case "long-title": long_title = reader.ReadString (); break;
@@ -152,10 +152,10 @@ namespace Banshee.Collection.Gui
                         break;
                 }
             }
-            
+
             if (modify_default != null) {
                 Column column = GetDefaultColumn (modify_default);
-                    
+
                 if (title != null) {
                     column.Title = title;
                 }
@@ -163,27 +163,27 @@ namespace Banshee.Collection.Gui
                 if (long_title != null) {
                     column.LongTitle = long_title;
                 }
-                
+
                 if (renderer_type != null) {
                     ColumnCell renderer = GetCellRenderer (renderer_type, renderer_property, renderer_expand);
                     column.RemoveCell (0);
                     column.PackStart (renderer);
                 }
-                
+
                 if (renderer_property != null) {
                     column.GetCell (0).Property = renderer_property;
                 }
-                
+
                 if (column.Visible != visible) {
                     column.Visible = visible;
                 }
-                
+
                 if (column is SortableColumn && sort_key != null) {
                     ((SortableColumn)column).SortKey = sort_key;
                 }
             } else {
                 ColumnCell renderer = GetCellRenderer (renderer_type, renderer_property, renderer_expand);
-                
+
                 Column column = sort_key == null
                     ? new Column (title, renderer, width, visible)
                     : new SortableColumn (title, renderer, width, sort_key, visible);
@@ -195,35 +195,35 @@ namespace Banshee.Collection.Gui
                 if (min_width != -1) {
                     column.MinWidth = min_width;
                 }
-                
+
                 Add (column);
             }
         }
-        
+
         private ColumnCell GetCellRenderer (string typeName, string property, bool expand)
         {
             Type type = null;
-                
+
             foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies ()) {
                 type = asm.GetType (typeName, false, true);
                 if (type != null) {
                     break;
                 }
             }
-            
+
             if (type == null) {
                 throw new TypeLoadException (typeName);
             }
-            
+
             return (ColumnCell)Activator.CreateInstance (type, property, expand);
         }
-        
+
         private bool ParseBoolean (string value)
         {
             value = value.ToLower ();
             return value == "true";
         }
-        
+
         private Column GetDefaultColumn (string propertyName)
         {
             PropertyInfo property = GetType ().GetProperty (propertyName);
diff --git a/src/Core/Banshee.ThickClient/Banshee.ContextPane/BaseContextPage.cs b/src/Core/Banshee.ThickClient/Banshee.ContextPane/BaseContextPage.cs
index 20cf12a..f13d25d 100644
--- a/src/Core/Banshee.ThickClient/Banshee.ContextPane/BaseContextPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.ContextPane/BaseContextPage.cs
@@ -67,7 +67,7 @@ namespace Banshee.ContextPane
 
         public abstract Widget Widget { get; }
         public abstract void SetTrack (TrackInfo track);
-        
+
         public virtual void Dispose () {}
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPageManager.cs b/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPageManager.cs
index 6c13736..8f33b75 100644
--- a/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPageManager.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPageManager.cs
@@ -45,10 +45,10 @@ namespace Banshee.ContextPane
             Mono.Addins.AddinManager.AddExtensionNodeHandler ("/Banshee/ThickClient/ContextPane", OnExtensionChanged);
         }
 
-        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-            
+
             if (args.Change == ExtensionChange.Add) {
                 var page = (BaseContextPage) node.CreateInstance ();
                 pane.AddPage (page);
diff --git a/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs b/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs
index d4a62d1..2a92568 100644
--- a/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.ContextPane/ContextPane.cs
@@ -73,7 +73,7 @@ namespace Banshee.ContextPane
         public bool Large {
             get { return large; }
         }
-        
+
         public ContextPane ()
         {
             HeightRequest = 200;
@@ -117,11 +117,11 @@ namespace Banshee.ContextPane
             var max = new Button (new Image (IconThemeUtils.LoadIcon ("context-pane-maximize", 7)));
             max.Clicked += (o, a) => { large = !large; expand_handler (large); };
             TooltipSetter.Set (tooltip_host, max, Catalog.GetString ("Make the context pane larger or smaller"));
-            
+
             var close = new Button (new Image (IconThemeUtils.LoadIcon ("context-pane-close", 7)));
             close.Clicked += (o, a) => ShowAction.Activate ();
             TooltipSetter.Set (tooltip_host, close, Catalog.GetString ("Hide context pane"));
-            
+
             max.Relief = close.Relief = ReliefStyle.None;
             hbox.PackStart (max, false, false, 0);
             hbox.PackStart (close, false, false, 0);
@@ -153,7 +153,7 @@ namespace Banshee.ContextPane
 
             PackStart (notebook, true, true, 0);
             notebook.Show ();
-            
+
         }
 
         private void OnPlayerEvent (PlayerEventArgs args)
@@ -215,7 +215,7 @@ namespace Banshee.ContextPane
                 large = false;
                 Hide ();
             }
-            
+
             vbox.Visible = true;//enabled && npages > 1;
         }
 
@@ -252,7 +252,7 @@ namespace Banshee.ContextPane
                 frame.DragDataReceived += delegate(object o, DragDataReceivedArgs args) {
                 };
             }*/
-            
+
             page.Widget.Show ();
             notebook.AppendPage (frame, null);
             pane_pages[page] = frame;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerBandScale.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerBandScale.cs
index 880ac93..248a85f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerBandScale.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerBandScale.cs
@@ -37,13 +37,13 @@ namespace Banshee.Equalizer.Gui
         private Scale scale;
         private Label label;
         private object tooltip_host;
-        
+
         public event EventHandler ValueChanged;
-    
+
         public EqualizerBandScale (uint band, int median, int min, int max, string labelText)
         {
             this.band = band;
-            
+
             label = new Label ();
             label.Markup = String.Format ("<small>{0}</small>", GLib.Markup.EscapeText (labelText));
             label.Xalign = 0.0f;
@@ -55,38 +55,38 @@ namespace Banshee.Equalizer.Gui
             scale.DrawValue = false;
             scale.Inverted = true;
             scale.ValueChanged += OnValueChanged;
-            
+
             scale.Show ();
             label.Show ();
-            
+
             PackStart (scale, false, false, 0);
             PackStart (label, false, false, 0);
-            
+
             tooltip_host = Hyena.Gui.TooltipSetter.CreateHost ();
         }
-        
+
         private void OnValueChanged (object o, EventArgs args)
         {
             EventHandler handler = ValueChanged;
             if(handler != null) {
                 handler(this, new EventArgs ());
             }
-            
+
             Hyena.Gui.TooltipSetter.Set (tooltip_host, scale, ((int)Math.Round (scale.Value / 10.0)).ToString ());
         }
-        
+
         public int Value {
             get { return (int)Math.Round (scale.Value); }
             set { scale.Value = (double) value; }
         }
-        
+
         public bool LabelVisible {
             get { return label.Visible; }
             set { label.Visible = value; }
         }
-        
+
         public uint Band {
             get { return band; }
         }
-    }   
+    }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerLevelsBox.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerLevelsBox.cs
index 2ef235b..acd1a23 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerLevelsBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerLevelsBox.cs
@@ -40,7 +40,7 @@ namespace Banshee.Equalizer.Gui
             for (int i = 0; i < levels.Length && i < 3; i++) {
                 Label label = CreateLabel (levels[i]);
                 switch (i) {
-                    case 0: 
+                    case 0:
                         label.Yalign = 0.05f;
                          break;
                     case 1:
@@ -51,11 +51,11 @@ namespace Banshee.Equalizer.Gui
                         label.Yalign = 0.95f;
                         break;
                 }
-                
+
                 PackStart (label, true, true, 0);
             }
         }
-        
+
         private Label CreateLabel (string value)
         {
             Label label = new Label ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
index 417c141..2daf799 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
@@ -28,6 +28,7 @@
 
 using System;
 using Gtk;
+using Hyena;
 
 namespace Banshee.Equalizer.Gui
 {
@@ -36,40 +37,40 @@ namespace Banshee.Equalizer.Gui
         private EqualizerManager manager;
         private ListStore store;
         private EqualizerSetting active_eq;
-        
+
         public EqualizerPresetComboBox () : this (EqualizerManager.Instance)
         {
         }
-        
+
         public EqualizerPresetComboBox (EqualizerManager manager) : base ()
         {
             if (manager == null) {
                 throw new ArgumentNullException ("provide an EqualizerManager or use default constructor");
             }
-            
+
             this.manager = manager;
             BuildWidget ();
         }
-        
+
         private void BuildWidget ()
         {
             store = new ListStore (typeof (string), typeof (EqualizerSetting));
             Model = store;
             TextColumn = 0;
-            
+
             foreach (EqualizerSetting eq in manager) {
                 AddEqualizerSetting(eq);
             }
-            
-            manager.EqualizerAdded += delegate (object o, EqualizerSettingEventArgs args) {
-                AddEqualizerSetting (args.EqualizerSetting);
+
+            manager.EqualizerAdded += delegate (object o, EventArgs<EqualizerSetting> args) {
+                AddEqualizerSetting (args.Value);
             };
-            
-            manager.EqualizerRemoved += delegate (object o, EqualizerSettingEventArgs args) {
-                RemoveEqualizerSetting (args.EqualizerSetting);
+
+            manager.EqualizerRemoved += delegate (object o, EventArgs<EqualizerSetting> args) {
+                RemoveEqualizerSetting (args.Value);
             };
         }
-        
+
         protected override void OnChanged ()
         {
             EqualizerSetting eq = ActiveEqualizer;
@@ -81,24 +82,24 @@ namespace Banshee.Equalizer.Gui
             } else if (eq == null) {
                 eq = active_eq;
             }
-            
+
             if (Entry == null) {
                 return;
             }
 
             eq.Name = Entry.Text;
-            
+
             TreeIter iter;
             if (GetIterForEqualizerSetting (eq, out iter)) {
                 store.SetValue (iter, 0, eq.Name);
             }
-            
+
             if (eq != ActiveEqualizer) {
                 ActiveEqualizer = eq;
                 base.OnChanged ();
             }
         }
-        
+
         public bool ActivatePreferredEqualizer (string name)
         {
             if (name == null || name == "") {
@@ -110,35 +111,35 @@ namespace Banshee.Equalizer.Gui
                         return true;
                     }
                 }
-                
+
                 return false;
             }
         }
-        
+
         public bool ActivateFirstEqualizer ()
         {
             TreeIter iter;
-        
+
             if (store.IterNthChild (out iter, 0)) {
                 ActiveEqualizer = GetEqualizerSettingForIter (iter);
                 return true;
             }
-            
+
             return false;
         }
-        
+
         private void AddEqualizerSetting (EqualizerSetting eq)
         {
             store.AppendValues (eq.Name, eq);
         }
-        
+
         private void RemoveEqualizerSetting (EqualizerSetting eq)
         {
             TreeIter iter;
             if (GetIterForEqualizerSetting (eq, out iter)) {
                 store.Remove (ref iter);
             }
-            
+
             if (!ActivateFirstEqualizer ()) {
                 active_eq = null;
                 if (Entry != null) {
@@ -146,12 +147,12 @@ namespace Banshee.Equalizer.Gui
                 }
             }
         }
-        
+
         private EqualizerSetting GetEqualizerSettingForIter (TreeIter iter)
         {
             return store.GetValue (iter, 1) as EqualizerSetting;
         }
-        
+
         private bool GetIterForEqualizerSetting (EqualizerSetting eq, out TreeIter iter)
         {
             for (int i = 0, n = store.IterNChildren (); i < n; i++) {
@@ -159,20 +160,20 @@ namespace Banshee.Equalizer.Gui
                     return true;
                 }
             }
-            
+
             iter = TreeIter.Zero;
             return false;
         }
-        
+
         public EqualizerSetting ActiveEqualizer {
             get {
                 TreeIter iter;
                 return GetActiveIter (out iter) ? GetEqualizerSettingForIter (iter) : null;
             }
-            
+
             set {
                 active_eq = value;
-                
+
                 TreeIter iter;
                 if (GetIterForEqualizerSetting (value, out iter)) {
                     SetActiveIter (iter);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
index 6bbe058..6e7dc94 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
@@ -34,6 +34,7 @@ using System.Collections;
 using Gtk;
 using Gdk;
 
+using Hyena;
 using Banshee.ServiceStack;
 using Banshee.MediaEngine;
 
@@ -47,48 +48,48 @@ namespace Banshee.Equalizer.Gui
         private EqualizerBandScale amplifier_scale;
         private EqualizerSetting active_eq;
         private int [] range = new int[3];
-        
+
         public event EqualizerChangedEventHandler EqualizerChanged;
         public event AmplifierChangedEventHandler AmplifierChanged;
-        
+
         public EqualizerView () : base ()
         {
             BuildWidget ();
         }
-        
+
         private void BuildWidget ()
         {
             Spacing = 10;
-        
+
             int [] br = ((IEqualizer)ServiceManager.PlayerEngine.ActiveEngine).BandRange;
             int mid = (br[0] + br[1]) / 2;
-            
+
             range[0] = br[0];
             range[1] = mid;
             range[2] = br[1];
-            
+
             amplifier_scale = new EqualizerBandScale (0, range[1] * 10, range[0] * 10, range[2] * 10, "Preamp");
             amplifier_scale.ValueChanged += OnAmplifierValueChanged;
             amplifier_scale.Show ();
-            PackStart (amplifier_scale, false, false, 0);            
-            
+            PackStart (amplifier_scale, false, false, 0);
+
             EqualizerLevelsBox eq_levels = new EqualizerLevelsBox (
                 FormatDecibelString (range[2]),
                 FormatDecibelString (range[1]),
                 FormatDecibelString (range[0])
             );
-            
+
             eq_levels.Show ();
             PackStart (eq_levels, false, false, 0);
-            
+
             band_box = new HBox ();
             band_box.Homogeneous = true;
             band_box.Show ();
             PackStart (band_box, true, true, 0);
-            
+
             BuildBands ();
         }
-        
+
         private string FormatDecibelString (int db)
         {
             if (db > 0) {
@@ -97,30 +98,30 @@ namespace Banshee.Equalizer.Gui
                 return String.Format ("{0} dB", db);
             }
         }
-        
+
         private void BuildBands ()
         {
             foreach (Widget widget in band_box.Children) {
                 band_box.Remove (widget);
             }
-            
+
             if (frequencies == null || frequencies.Length <= 0) {
                 frequencies = new uint[0];
                 band_scales = new EqualizerBandScale[0];
                 return;
             }
-            
+
             band_scales = new EqualizerBandScale[10];
-            
+
             for (uint i = 0; i < 10; i++) {
-                string label = frequencies[i] < 1000 ? 
+                string label = frequencies[i] < 1000 ?
                     String.Format ("{0} Hz", frequencies[i]) :
                     String.Format ("{0} kHz", (int)Math.Round (frequencies[i] / 1000.0));
-                
+
                 band_scales[i] = new EqualizerBandScale (i, range[1] * 10, range[0] * 10, range[2] * 10, label);
                 band_scales[i].ValueChanged += OnEqualizerValueChanged;
                 band_scales[i].Show ();
-                
+
                 band_box.PackStart (band_scales[i], true, true, 0);
             }
         }
@@ -128,11 +129,11 @@ namespace Banshee.Equalizer.Gui
         private void OnEqualizerValueChanged (object o, EventArgs args)
         {
             EqualizerBandScale scale = o as EqualizerBandScale;
-            
+
             if (active_eq != null) {
                 active_eq.SetGain (scale.Band, (double)scale.Value / 10);
             }
-            
+
             if (EqualizerChanged != null) {
                 EqualizerChanged (this, new EqualizerChangedEventArgs (scale.Band, scale.Value));
             }
@@ -144,37 +145,37 @@ namespace Banshee.Equalizer.Gui
             if (active_eq != null) {
                 active_eq.AmplifierLevel = (double) (scale.Value / 10.0);
             }
-            
+
             if (AmplifierChanged != null) {
-                AmplifierChanged (this, new AmplifierChangedEventArgs (scale.Value));
+                AmplifierChanged (this, new EventArgs<int> (scale.Value));
             }
-        }    
-            
+        }
+
         public uint [] Frequencies {
             get { return (uint [])frequencies.Clone (); }
-            set { 
+            set {
                 frequencies = (uint [])value.Clone ();
                 BuildBands ();
             }
         }
-        
+
         public int [] Preset {
             get {
                 int [] result = new int[band_scales.Length];
                 for (int i = 0; i < band_scales.Length; i++) {
                     result[i] = (int) band_scales[i].Value;
                 }
-                
+
                 return result;
             }
-            
+
             set {
                 for (int i = 0; i < value.Length; i++) {
-                    band_scales[i].Value = value[i];                   
+                    band_scales[i].Value = value[i];
                 }
             }
         }
-        
+
         public void SetBand(uint band, double value)
         {
             band_scales[band].Value = (int) (value * 10);
@@ -184,19 +185,19 @@ namespace Banshee.Equalizer.Gui
             get { return (double) amplifier_scale.Value / 10; }
             set { amplifier_scale.Value = (int) (value * 10); }
         }
-        
+
         public EqualizerSetting EqualizerSetting {
             get { return active_eq; }
-            set { 
-                active_eq = value; 
-                
+            set {
+                active_eq = value;
+
                 if (active_eq == null) {
                     AmplifierLevel = 0;
                     return;
                 }
-                
+
                 AmplifierLevel = active_eq.AmplifierLevel;
-                
+
                 for (int i = 0; i < active_eq.BandCount; i++) {
                     uint x = (uint) i;
                     SetBand (x, active_eq[x]);
@@ -206,8 +207,8 @@ namespace Banshee.Equalizer.Gui
     }
 
     public delegate void EqualizerChangedEventHandler (object o, EqualizerChangedEventArgs args);
-    public delegate void AmplifierChangedEventHandler (object o, AmplifierChangedEventArgs args);
-    
+    public delegate void AmplifierChangedEventHandler (object o, EventArgs<int> args);
+
     public sealed class EqualizerChangedEventArgs : EventArgs
     {
         private uint band;
@@ -227,18 +228,4 @@ namespace Banshee.Equalizer.Gui
             get { return this.value; }
         }
     }
-
-    public sealed class AmplifierChangedEventArgs : EventArgs
-    {
-        private int value;
-
-        public AmplifierChangedEventArgs (int value)
-        {
-            this.value = value;
-        }
-
-        public int Value {
-            get { return this.value; }
-        }
-    }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
index 5db5503..07caa71 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
@@ -43,84 +43,84 @@ namespace Banshee.Equalizer.Gui
         private EqualizerPresetComboBox eq_preset_combo;
         private CheckButton eq_enabled_checkbox;
         private HBox header_box;
-        
+
         private static EqualizerWindow instance;
         public static EqualizerWindow Instance {
             get { return instance; }
         }
-        
+
         public EqualizerWindow (Window parent) : base (Catalog.GetString ("Equalizer"))
         {
             if (instance == null) {
                 instance = this;
             }
-            
+
             TransientFor = parent;
             WindowPosition = WindowPosition.CenterOnParent;
             TypeHint = Gdk.WindowTypeHint.Dialog;
             SkipPagerHint = true;
             SkipTaskbarHint = true;
             AppPaintable = true;
-            
+
             SetDefaultSize (-1, 180);
-            
+
             VBox box = new VBox ();
             header_box = new HBox ();
             header_box.BorderWidth = 4;
             header_box.Spacing = 2;
-            
+
             box.PackStart (header_box, false, false, 0);
             box.PackStart (new HSeparator (), false, false, 0);
-        
+
             eq_view = new EqualizerView ();
             eq_view.BorderWidth = 10;
             eq_view.SetSizeRequest (-1, 110);
             eq_view.Frequencies = ((IEqualizer)ServiceManager.PlayerEngine.ActiveEngine).EqualizerFrequencies;
             eq_view.Show ();
-            
+
             eq_enabled_checkbox = new CheckButton (Catalog.GetString ("Enabled"));
-            
+
             eq_preset_combo = new EqualizerPresetComboBox ();
             eq_preset_combo.Changed += OnPresetChanged;
             eq_preset_combo.Show ();
-            
+
             Button new_preset_button = new Button (new Image (Stock.Add, IconSize.Button));
             new_preset_button.Relief = ReliefStyle.None;
             new_preset_button.Clicked += OnNewPreset;
-            
+
             Button delete_preset_button = new Button (new Image (Stock.Remove, IconSize.Button));
             delete_preset_button.Relief = ReliefStyle.None;
             delete_preset_button.Clicked += OnDeletePreset;
-            
+
             VBox combo_box = new VBox ();
             combo_box.PackStart (eq_preset_combo, true, false, 0);
-            
+
             header_box.PackStart (combo_box, false, false, 0);
             header_box.PackStart (new_preset_button, false, false, 0);
             header_box.PackStart (delete_preset_button, false, false, 0);
             header_box.PackEnd (eq_enabled_checkbox, false, false, 0);
-            
+
             box.PackStart (eq_view, true, true, 0);
-            
+
             eq_enabled_checkbox.Active = EqualizerSetting.EnabledSchema.Get ();
             eq_preset_combo.ActivatePreferredEqualizer (EqualizerSetting.PresetSchema.Get ());
-            
+
             if (eq_enabled_checkbox.Active) {
                 // enable equalizer if was enabled last session
                 EqualizerManager.Instance.Enable (eq_preset_combo.ActiveEqualizer);
             }
-            
+
             if (eq_preset_combo.ActiveEqualizer == null) {
                 // user has no presets, so create one
                 OnNewPreset (null, null);
-                
+
                 // enable our new preset (it has no effect though, since all bands are 0db)
                 eq_enabled_checkbox.Active = true;
                 OnEnableDisable (null, null);
             }
-            
+
             eq_enabled_checkbox.Clicked += OnEnableDisable;
-            
+
             Gdk.Geometry limits = new Gdk.Geometry ();
             limits.MinWidth = -1;
             limits.MaxWidth = -1;
@@ -152,7 +152,7 @@ namespace Banshee.Equalizer.Gui
             GdkWindow.DrawRectangle (Style.BackgroundGC (StateType.Active), true, header_box.Allocation);
             return base.OnExposeEvent (evnt);
         }
-         
+
         private void OnNewPreset (object o, EventArgs args)
         {
             EqualizerSetting eq = new EqualizerSetting (Catalog.GetString ("New Preset"));
@@ -160,12 +160,12 @@ namespace Banshee.Equalizer.Gui
             eq_preset_combo.ActiveEqualizer = eq;
             eq_preset_combo.Entry.SelectRegion (0, eq_preset_combo.Entry.Text.Length);
         }
-        
+
         private void OnDeletePreset (object o, EventArgs args)
         {
             EqualizerManager.Instance.Remove (eq_preset_combo.ActiveEqualizer);
         }
-        
+
         private void OnPresetChanged (object o, EventArgs args)
         {
             if (eq_preset_combo.ActiveEqualizer != eq_view.EqualizerSetting) {
@@ -173,7 +173,7 @@ namespace Banshee.Equalizer.Gui
                 OnEnableDisable (null, null);
             }
         }
-        
+
         private void OnEnableDisable (object o, EventArgs args)
         {
             if (eq_enabled_checkbox.Active) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
index 330f986..e86daef 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
@@ -27,7 +27,7 @@
 //
 
 #pragma warning disable 0618
- 
+
 using System;
 using System.Text;
 using System.Collections.Generic;
@@ -50,27 +50,27 @@ namespace Banshee.Gui.Dialogs
         public AboutDialog() : base()
         {
             // build authors page
-            List<string> authors = new List<string> ();            
+            List<string> authors = new List<string> ();
             authors.Add (Catalog.GetString ("Primary Development"));
             authors.Add (String.Empty);
-            
+
             foreach (ProductAuthor author in ProductInformation.Authors) {
                 authors.Add (String.Format("    {0} ({1})", author.Name, author.Role));
             }
-            
+
             authors.Add (String.Empty);
             authors.Add (Catalog.GetString("Contributors"));
             authors.Add (String.Empty);
-            
+
             foreach (string author in ProductInformation.Contributors) {
                 authors.Add (String.Format("    {0}", author));
             }
-            
+
             authors.Add (String.Empty);
-            
+
             // build translators page
             StringBuilder translation_credits = new StringBuilder ();
-            
+
             foreach (ProductTranslation translation in ProductInformation.Translations) {
                 translation_credits.Append (String.Format ("{0}\n", translation.LanguageName));
                 foreach (string person in translation.Translators) {
@@ -78,35 +78,35 @@ namespace Banshee.Gui.Dialogs
                 }
                 translation_credits.Append ("\n");
             }
-            
+
             SetUrlHook (delegate (Gtk.AboutDialog dialog, string link) {
                 Banshee.Web.Browser.Open (link);
             });
-            
+
             // TODO: We should really use ProgramName in the future rather
             // than plain Name, since it's been depreciated. We can't do that
-            // yet though since it breaks stuff for other people. 
+            // yet though since it breaks stuff for other people.
             Name = "Banshee";
             Logo = Gdk.Pixbuf.LoadFromResource (ApplicationContext.Debugging ? /*"jcastro.png"*/ "banshee-logo.png" : "banshee-logo.png");
-            Version = Banshee.ServiceStack.Application.DisplayVersion == Banshee.ServiceStack.Application.Version 
+            Version = Banshee.ServiceStack.Application.DisplayVersion == Banshee.ServiceStack.Application.Version
                 ? Banshee.ServiceStack.Application.DisplayVersion
-                : String.Format ("{0} ({1})", 
-                    Banshee.ServiceStack.Application.DisplayVersion, 
+                : String.Format ("{0} ({1})",
+                    Banshee.ServiceStack.Application.DisplayVersion,
                     Banshee.ServiceStack.Application.Version);
             Comments = Catalog.GetString ("Extraordinary Multimedia Management and Playback");
             Copyright = String.Format (Catalog.GetString (
-                "Copyright \u00a9 2005\u2013{0} Novell, Inc.\n" + 
+                "Copyright \u00a9 2005\u2013{0} Novell, Inc.\n" +
                 "Copyright \u00a9 2005\u2013{0} Others\n" +
                 "Copyright \u00a9 2005 Aaron Bockover"
             ), "2009");
-            
+
             Website = "http://banshee-project.org/";
             WebsiteLabel = Catalog.GetString ("Banshee Website");
 
             Authors = authors.ToArray ();
             Artists = ProductInformation.Artists;
             TranslatorCredits = translation_credits.ToString ();
-            
+
             License = ProductInformation.License;
             WrapLicense = true;
             Response += OnResponse;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs
index cea924e..e6e28bc 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs
@@ -40,18 +40,18 @@ namespace Banshee.Gui.Dialogs
         protected AccelGroup AccelGroup {
             get { return accel_group; }
         }
-        
+
         public BansheeDialog (string title) : this (title, null)
         {
         }
-        
+
         public BansheeDialog (string title, Window parent) : base ()
         {
             Title = title;
             BorderWidth = 5;
             Visible = false;
             HasSeparator = false;
-            
+
             if (parent == null) {
                 GtkElementsService service = ServiceManager.Get<GtkElementsService> ();
                 if (service != null) {
@@ -60,24 +60,24 @@ namespace Banshee.Gui.Dialogs
             } else {
                 TransientFor = parent;
             }
-            
+
             WindowPosition = WindowPosition.CenterOnParent;
             DestroyWithParent = true;
-            
+
             accel_group = new AccelGroup ();
             AddAccelGroup (accel_group);
         }
-        
+
         public Button AddDefaultCloseButton ()
         {
             return AddStockButton (Stock.Close, ResponseType.Close);
         }
-        
+
         public new Button AddButton (string message, ResponseType response)
         {
             return AddButton (message, response, false);
         }
-        
+
         public Button AddStockButton (string stock, ResponseType response)
         {
             return AddStockButton (stock, response, false);
@@ -92,7 +92,7 @@ namespace Banshee.Gui.Dialogs
         {
             return AddButton (stock, response, isDefault, true);
         }
-        
+
         public new Button AddButton (string message, ResponseType response, bool isDefault, bool isStock)
         {
             Button button = new Button (message);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs
index dc593bc..013a600 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ConfirmShutdownDialog.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using Gtk;
 using Mono.Unix;
@@ -50,11 +50,11 @@ namespace Banshee.Gui.Dialogs
             Message = Catalog.GetString(
                 "Closing Banshee now will cancel any currently running tasks. They cannot " +
                 "be resumed automatically the next time Banshee is run.");
-                
+
             IconNameStock = Stock.DialogQuestion;
-            
+
             Dialog.DefaultResponse = ResponseType.Cancel;
-            
+
             AddButton(Catalog.GetString("Quit anyway"), ResponseType.Ok, false);
             AddButton(Catalog.GetString("Continue running"), ResponseType.Cancel, true);
 
@@ -62,11 +62,11 @@ namespace Banshee.Gui.Dialogs
             foreach (Job job in scheduler.Jobs) {
                 AddJob (job);
             }
-            
+
             scheduler.JobAdded += AddJob;
             scheduler.JobRemoved += RemoveJob;
         }
-        
+
         public void AddString(string message)
         {
             (ListView.Model as ListStore).AppendValues(message, null);
@@ -93,13 +93,13 @@ namespace Banshee.Gui.Dialogs
             if (ListView == null || ListView.Model == null) {
                 return;
             }
-            
+
             for(int i = 0, n = ListView.Model.IterNChildren(); i < n; i++) {
                 TreeIter iter;
                 if(!ListView.Model.IterNthChild(out iter, i)) {
                     break;
                 }
-                    
+
                 if(ListView.Model.GetValue(iter, 1) == job) {
                     Banshee.Base.ThreadAssist.ProxyToMain(delegate {
                         (ListView.Model as ListStore).Remove(ref iter);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs
index 0d6385b..637af9b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/DefaultApplicationHelperDialog.cs
@@ -63,7 +63,7 @@ namespace Banshee.Gui.Dialogs
                 }
             }
         }
-        
+
         private CheckButton remember;
         private DefaultApplicationHelperDialog () : base (null, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.None,
                                                          Catalog.GetString ("Make Banshee the default media player?"),
@@ -79,9 +79,9 @@ namespace Banshee.Gui.Dialogs
             align.TopPadding = 6;
             align.Child = remember;
             align.Show ();
-            
+
             LabelVBox.PackEnd (align, false, false, 0);
-            
+
             AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.No, false);
             AddCustomButton (Catalog.GetString ("Make Banshee the Default"), Gtk.ResponseType.Yes, true).HasFocus = true;
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ErrorListDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ErrorListDialog.cs
index 353a8a5..b00dad0 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ErrorListDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ErrorListDialog.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Collections;
 using Mono.Unix;
@@ -41,32 +41,32 @@ namespace Banshee.Gui.Dialogs
         [Widget] private TreeView list_view;
         [Widget] private Image icon_image;
         [Widget] private Expander details_expander;
-        
+
         private ListStore simple_model;
         private AccelGroup accel_group;
-        
+
         public ErrorListDialog() : base("ErrorListDialog")
         {
             accel_group = new AccelGroup();
             Dialog.AddAccelGroup(accel_group);
-		    
+		
             list_view.SetSizeRequest(-1, 120);
             details_expander.Activated += delegate {
                 ConfigureGeometry();
             };
-            
+
             Dialog.Realized += delegate {
                 ConfigureGeometry();
             };
         }
-        
+
         private void ConfigureGeometry()
         {
             Gdk.Geometry limits = new Gdk.Geometry();
-            
+
             limits.MinWidth = Dialog.SizeRequest().Width;
             limits.MaxWidth = Gdk.Screen.Default.Width;
-            
+
             if(details_expander.Expanded) {
                 limits.MinHeight = Dialog.SizeRequest().Height + list_view.SizeRequest().Height;
                 limits.MaxHeight = Gdk.Screen.Default.Height;
@@ -74,8 +74,8 @@ namespace Banshee.Gui.Dialogs
                 limits.MinHeight = -1;
                 limits.MaxHeight = -1;
             }
-            
-            Dialog.SetGeometryHints(Dialog, limits, 
+
+            Dialog.SetGeometryHints(Dialog, limits,
                 Gdk.WindowHints.MaxSize | Gdk.WindowHints.MinSize);
         }
 
@@ -83,7 +83,7 @@ namespace Banshee.Gui.Dialogs
         {
             AddButton(message, response, false);
         }
-        
+
         public void AddStockButton(string stock, ResponseType response)
         {
             AddStockButton(stock, response, false);
@@ -98,7 +98,7 @@ namespace Banshee.Gui.Dialogs
         {
             AddButton(stock, response, isDefault, true);
         }
-        
+
         public void AddButton(string message, ResponseType response, bool isDefault, bool isStock)
         {
             Button button = new Button(message);
@@ -110,32 +110,32 @@ namespace Banshee.Gui.Dialogs
 
             if(isDefault) {
                 Dialog.DefaultResponse = response;
-                button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return, 
+                button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return,
                     0, AccelFlags.Visible);
             }
         }
-        
+
         public string Header {
-            set { 
+            set {
                 Dialog.Title = value;
-                header_label.Markup = String.Format("<b><big>{0}</big></b>", 
+                header_label.Markup = String.Format("<b><big>{0}</big></b>",
                     GLib.Markup.EscapeText(value));
             }
         }
-        
+
         public void AppendString(string item)
         {
             if(list_view.Model == null) {
                 CreateSimpleModel();
             }
-            
+
             if(list_view.Model != simple_model) {
                 throw new ApplicationException("A custom model is in use");
             }
-            
+
             simple_model.AppendValues(item);
         }
-        
+
         private void CreateSimpleModel()
         {
             simple_model = new ListStore(typeof(string));
@@ -143,19 +143,19 @@ namespace Banshee.Gui.Dialogs
             list_view.AppendColumn("Error", new CellRendererText(), "text", 0);
             list_view.HeadersVisible = false;
         }
-        
+
         public string Message {
             set { message_label.Text = value; }
         }
-        
+
         public string IconName {
             set { icon_image.SetFromIconName(value, IconSize.Dialog); }
         }
-        
+
         public string IconNameStock {
             set { icon_image.SetFromStock(value, IconSize.Dialog); }
         }
-        
+
         public TreeView ListView {
             get { return list_view; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
index 4019d3c..d82efc8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
@@ -1,4 +1,4 @@
-// 
+//
 // FileChooserDialog.cs
 //
 // Author:
@@ -30,30 +30,56 @@ using System;
 using Gtk;
 
 using Banshee.Configuration;
+using Banshee.ServiceStack;
 
 namespace Banshee.Gui.Dialogs
 {
     public class FileChooserDialog : Gtk.FileChooserDialog
     {
+        public static FileChooserDialog CreateForImport (string title, bool files)
+        {
+            var chooser = new Banshee.Gui.Dialogs.FileChooserDialog (
+                title,
+                ServiceManager.Get<Banshee.Gui.GtkElementsService> ().PrimaryWindow,
+                files ? FileChooserAction.Open : FileChooserAction.SelectFolder
+            );
+
+            chooser.DefaultResponse = ResponseType.Ok;
+            chooser.SelectMultiple = true;
+
+            chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
+            // Translators: verb
+            chooser.AddButton (Mono.Unix.Catalog.GetString("I_mport"), ResponseType.Ok);
+
+            Hyena.Gui.GtkUtilities.SetChooserShortcuts (chooser,
+                ServiceManager.SourceManager.MusicLibrary.BaseDirectory,
+                ServiceManager.SourceManager.VideoLibrary.BaseDirectory
+            );
+
+            return chooser;
+        }
+
         public FileChooserDialog (string title, FileChooserAction action) : this (title, null, action)
-        {            
+        {
         }
-        
-        public FileChooserDialog (string title, Window parent, FileChooserAction action) : 
+
+        public FileChooserDialog (string title, Window parent, FileChooserAction action) :
             base (title, parent, action)
         {
+            LocalOnly = Banshee.IO.Provider.LocalOnly;
             SetCurrentFolderUri (LastFileChooserUri.Get (Environment.GetFolderPath (Environment.SpecialFolder.Personal)));
+            WindowPosition = WindowPosition.Center;
         }
-        
+
         protected override void OnResponse (ResponseType response)
         {
             base.OnResponse (response);
-            
+
             if (CurrentFolderUri != null) {
                 LastFileChooserUri.Set (CurrentFolderUri);
             }
         }
-        
+
         public static readonly SchemaEntry<string> LastFileChooserUri = new SchemaEntry<string> (
             "player_window", "last_file_chooser_uri",
             String.Empty,
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs
index fc37c0c..1ffb414 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using Gtk;
 
@@ -40,12 +40,12 @@ namespace Banshee.Gui.Dialogs
         public GladeDialog(string name, Glade.XML resource) : base(name, resource)
         {
         }
-    
+
         public virtual ResponseType Run()
         {
             return (ResponseType)Dialog.Run();
         }
-        
+
         public Dialog Dialog {
             get { return (Dialog)Window; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeWindow.cs
index 11543b2..1afbe80 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeWindow.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeWindow.cs
@@ -25,36 +25,36 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using Gtk;
 using Glade;
 
 namespace Banshee.Gui.Dialogs
 {
-    public abstract class GladeWindow 
+    public abstract class GladeWindow
     {
         private string window_name;
         private Glade.XML glade;
         private Window window;
-        
+
         protected GladeWindow()
         {
         }
 
         public GladeWindow(string name) : this(name, new Glade.XML(
-            System.Reflection.Assembly.GetExecutingAssembly(), "banshee-dialogs.glade", name, 
+            System.Reflection.Assembly.GetExecutingAssembly(), "banshee-dialogs.glade", name,
             Banshee.ServiceStack.Application.InternalName))
         {
         }
 
         public GladeWindow(string name, Glade.XML glade)
         {
-            window_name = name;        
-            this.glade = glade; 
+            window_name = name;
+            this.glade = glade;
             this.glade.Autoconnect(this);
         }
-        
+
         public virtual void Destroy()
         {
             Window.Destroy();
@@ -67,13 +67,13 @@ namespace Banshee.Gui.Dialogs
         public string Name {
             get { return window_name; }
         }
-        
+
         public Window Window {
             get {
                 if(window == null) {
                     window = (Window)glade.GetWidget(window_name);
                 }
-                
+
                 return window;
             }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs
index 5d0fabf..2134476 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/ImageFileChooserDialog.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ImageFileChooserDialog.cs
 //
 // Author:
@@ -35,41 +35,41 @@ namespace Banshee.Gui.Dialogs
     public class ImageFileChooserDialog : Banshee.Gui.Dialogs.FileChooserDialog
     {
         private Image preview = new Image ();
-    
+
         public ImageFileChooserDialog () : base (Catalog.GetString("Select album cover image"), FileChooserAction.Open)
         {
             AddButton (Stock.Cancel, ResponseType.Cancel);
             AddButton (Stock.Open, ResponseType.Ok);
-            
+
             DefaultResponse = ResponseType.Ok;
-            
+
             FileFilter filter = new FileFilter ();
             filter.Name = Catalog.GetString ("All image files");
             filter.AddMimeType ("image/jpeg");
             filter.AddMimeType ("image/png");
             AddFilter (filter);
             Filter = filter;
-            
+
             filter = new FileFilter ();
             filter.Name = Catalog.GetString ("JPEG image files");
             filter.AddMimeType ("image/jpeg");
             AddFilter (filter);
-            
+
             filter = new FileFilter ();
             filter.Name = Catalog.GetString ("PNG image files");
             filter.AddMimeType ("image/png");
             AddFilter (filter);
-            
+
             PreviewWidget = preview;
         }
-        
+
         protected override void OnUpdatePreview()
         {
             try {
                 if (String.IsNullOrEmpty (PreviewFilename)) {
                     throw new ApplicationException ();
                 }
-                
+
                 Gdk.Pixbuf pixbuf = new Gdk.Pixbuf (PreviewFilename);
                 preview.Pixbuf = pixbuf.ScaleSimple (100, 100, Gdk.InterpType.Bilinear);
                 preview.Show ();
@@ -77,5 +77,5 @@ namespace Banshee.Gui.Dialogs
                 preview.Hide ();
             }
         }
-    }        
+    }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs
index 541ce61..b7cdba9 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/OpenLocationDialog.cs
@@ -1,4 +1,4 @@
-// 
+//
 // OpenLocationDialog.cs
 //
 // Author:
@@ -42,56 +42,56 @@ namespace Banshee.Gui.Dialogs
         [Widget] private HBox location_box;
         private ComboBoxEntry address_entry;
         private Button browse_button;
-        
+
         private List<string> history = new List<string>();
-    
+
         public OpenLocationDialog() : base("OpenLocationDialog")
         {
             address_entry = ComboBoxEntry.NewText();
             address_entry.Show();
             address_entry.Entry.Activated += OnEntryActivated;
-            
+
             browse_button = new Button(Catalog.GetString("Browse..."));
             browse_button.Clicked += OnBrowseClicked;
             browse_button.Show();
-            
+
             location_box.PackStart(address_entry, true, true, 0);
             location_box.PackStart(browse_button, false, false, 0);
-            
+
             Dialog.Response += OnResponse;
             LoadHistory();
-            
+
             address_entry.Entry.HasFocus = true;
         }
-        
+
         private void OnEntryActivated(object o, EventArgs args)
         {
             Dialog.Respond(ResponseType.Ok);
         }
-        
+
         private void OnResponse(object o, ResponseArgs args)
         {
             if(args.ResponseId != ResponseType.Ok) {
                 return;
             }
-            
+
             List<string> filtered_history = new List<string>();
-            
+
             history.Insert(0, Address);
             foreach(string uri in history) {
                 if(!filtered_history.Contains(uri)) {
                     filtered_history.Add(uri);
                 }
             }
-            
+
             string [] trimmed_history = new string[Math.Min(15, filtered_history.Count)];
             for(int i = 0; i < trimmed_history.Length; i++) {
                 trimmed_history[i] = filtered_history[i] as string;
             }
-            
+
             OpenLocationHistorySchema.Set(trimmed_history);
         }
-        
+
         private void OnBrowseClicked(object o, EventArgs args)
         {
             FileChooserDialog chooser = new FileChooserDialog(
@@ -99,37 +99,37 @@ namespace Banshee.Gui.Dialogs
                 null,
                 FileChooserAction.Open
             );
-            
+
             chooser.SetCurrentFolder(Environment.GetFolderPath(Environment.SpecialFolder.Personal));
             chooser.AddButton(Stock.Cancel, ResponseType.Cancel);
             chooser.AddButton(Stock.Open, ResponseType.Ok);
             chooser.DefaultResponse = ResponseType.Ok;
             chooser.LocalOnly = false;
-            
+
             if(chooser.Run() == (int)ResponseType.Ok) {
                 address_entry.Entry.Text = chooser.Uri;
             }
-            
+
             chooser.Destroy();
         }
-        
+
         private void LoadHistory()
         {
             string [] history_array = OpenLocationHistorySchema.Get();
             if(history_array == null || history_array.Length == 0) {
                 return;
             }
-            
+
             foreach(string uri in history_array) {
                 history.Add(uri);
                 address_entry.AppendText(uri);
             }
         }
-        
+
         public string Address {
             get { return address_entry.Entry.Text; }
         }
-        
+
         public static readonly SchemaEntry<string []> OpenLocationHistorySchema = new SchemaEntry<string []>(
             "player_window", "open_location_history",
             new string [] { String.Empty },
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/SeekDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/SeekDialog.cs
index ef01290..f644174 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/SeekDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/SeekDialog.cs
@@ -42,15 +42,15 @@ namespace Banshee.Gui.Dialogs
     {
         [Widget] private VBox seek_box;
         private ConnectedSeekSlider seek_slider;
-        
+
         public SeekDialog () : base ("SeekDialog")
         {
             seek_slider = new ConnectedSeekSlider ();
             seek_slider.StreamPositionLabel.FormatString = "<big>{0}</big>";
-            
+
             seek_box.PackStart (seek_slider, false, false, 0);
             seek_box.ShowAll ();
-            
+
             Dialog.SetSizeRequest (300, -1);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropList.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropList.cs
index 4619ea2..5525d8f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropList.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropList.cs
@@ -33,8 +33,8 @@ using System.Collections.Generic;
 using System.Runtime.InteropServices;
 using Gtk;
 
-namespace Banshee.Gui.DragDrop 
-{   
+namespace Banshee.Gui.DragDrop
+{
     public class DragDropList<T> : List<T>
     {
         public DragDropList() : base()
@@ -45,7 +45,7 @@ namespace Banshee.Gui.DragDrop
         {
             Add(o);
         }
-        
+
         public DragDropList(T o, Gtk.SelectionData selectionData, Gdk.Atom target) : base()
         {
             Add(o);
@@ -57,13 +57,13 @@ namespace Banshee.Gui.DragDrop
             byte [] data = this;
             selectionData.Set(target, 8, data, data.Length);
         }
-        
+
         public static implicit operator byte [](DragDropList<T> transferrable)
         {
             IntPtr handle = (IntPtr)GCHandle.Alloc(transferrable);
             return System.Text.Encoding.ASCII.GetBytes(Convert.ToString(handle));
         }
-        
+
         public static implicit operator DragDropList<T>(byte [] transferrable)
         {
             try {
@@ -77,7 +77,7 @@ namespace Banshee.Gui.DragDrop
                 return null;
             }
         }
-        
+
         public static implicit operator DragDropList<T>(Gtk.SelectionData transferrable)
         {
             return transferrable.Data;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropTarget.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropTarget.cs
index cd4fa36..7e7bf17 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropTarget.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropTarget.cs
@@ -35,14 +35,14 @@ namespace Banshee.Gui.DragDrop
         Source,
         UriList
     };
-        
+
     public static class DragDropTarget
     {
-        public static readonly TargetEntry Source = 
-            new TargetEntry ("application/x-banshee-source", TargetFlags.App, 
+        public static readonly TargetEntry Source =
+            new TargetEntry ("application/x-banshee-source", TargetFlags.App,
                 (uint)DragDropTargetType.Source);
 
-        public static readonly TargetEntry UriList = 
+        public static readonly TargetEntry UriList =
             new TargetEntry ("text/uri-list", 0, (uint)DragDropTargetType.UriList);
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropUtilities.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropUtilities.cs
index f334259..ca353db 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropUtilities.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.DragDrop/DragDropUtilities.cs
@@ -59,11 +59,11 @@ namespace Banshee.Gui.DragDrop
         {
             return data == null ? new string [0] : data.Split (newline, StringSplitOptions.RemoveEmptyEntries);
         }
-        
+
         public static TreePath [] SelectionDataToTreePaths(Gtk.SelectionData data)
         {
             string rawData = String.Empty;
-            
+
             try {
                 rawData = SelectionDataToString(data);
                 return SelectionDataToTreePaths(rawData);
@@ -71,12 +71,12 @@ namespace Banshee.Gui.DragDrop
                 return null;
             }
         }
-        
+
         public static TreePath [] SelectionDataToTreePaths(string data)
         {
             ArrayList pathList = new ArrayList();
             string [] strPaths = SplitSelectionData(data);
-            
+
             foreach(string strPath in strPaths) {
                 try {
                     string finalStrPath = strPath.Trim();
@@ -85,22 +85,22 @@ namespace Banshee.Gui.DragDrop
                     }
                 } catch(Exception) { }
             }
-        
+
             return pathList.ToArray(typeof(TreePath)) as TreePath [];
         }
-        
+
         public static byte [] TreeViewSelectionPathsToBytes(TreeView view)
         {
             if(view.Selection.CountSelectedRows() <= 0) {
                 return null;
             }
-            
+
             string selData = null;
 
             foreach(TreePath p in view.Selection.GetSelectedRows()) {
                 selData += p.ToString() + "\r\n";
             }
-            
+
             return System.Text.Encoding.ASCII.GetBytes(selData);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
index 899c515..f96ccb7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
@@ -43,13 +43,13 @@ namespace Banshee.Gui.TrackEditor
         private object tooltip_host = Hyena.Gui.TooltipSetter.CreateHost ();
         private Button track_artist_sync_button;
         private PageNavigationEntry track_artist_entry;
-        
-        public AlbumArtistEntry (Button trackArtistSyncButton, PageNavigationEntry titleEntry, 
+
+        public AlbumArtistEntry (Button trackArtistSyncButton, PageNavigationEntry titleEntry,
             PageNavigationEntry trackArtistEntry) : base ()
         {
             track_artist_sync_button = trackArtistSyncButton;
             track_artist_entry = trackArtistEntry;
-        
+
             enable_compilation.Label = Catalog.GetString ("Com_pilation Album Artist:");
             enable_compilation.UseUnderline = true;
 
@@ -82,7 +82,7 @@ namespace Banshee.Gui.TrackEditor
         public string Text {
             get { return entry.Text; }
             set { entry.Text = value ?? String.Empty; }
-        }   
+        }
 
         private void OnChanged (object o, EventArgs args)
         {
@@ -102,7 +102,7 @@ namespace Banshee.Gui.TrackEditor
                 track_artist_sync_button.Sensitive = !IsCompilation;
                 track_artist_sync_button.Visible = !IsCompilation;
             }
-            
+
             if (track_artist_entry.ForwardButton != null) {
                 track_artist_entry.ForwardButton.Visible = IsCompilation;
             }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs
index 4026596..d3fd95b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs
@@ -73,14 +73,14 @@ namespace Banshee.Gui.TrackEditor
             );
 
             PageNavigationEntry track_artist_entry = new PageNavigationEntry (Dialog, "CoreArtists", "Name");
-            FieldPage.FieldSlot track_artist_slot = AddField (left, track_artist_entry, 
+            FieldPage.FieldSlot track_artist_slot = AddField (left, track_artist_entry,
                 Catalog.GetString ("Set all track artists to this value"),
                 delegate { return Catalog.GetString ("Track _Artist:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((PageNavigationEntry)widget).Text = track.ArtistName; },
                 delegate (EditorTrackInfo track, Widget widget) { track.ArtistName = ((PageNavigationEntry)widget).Text; }
             );
 
-            AlbumArtistEntry album_artist_entry = new AlbumArtistEntry (track_artist_slot.SyncButton, 
+            AlbumArtistEntry album_artist_entry = new AlbumArtistEntry (track_artist_slot.SyncButton,
                 title_entry, track_artist_entry);
             AddField (left, null, album_artist_entry,
                 Catalog.GetString ("Set all compilation album artists to these values"), null,
@@ -102,14 +102,14 @@ namespace Banshee.Gui.TrackEditor
                 }
             };
 
-            AddField (left, new TextEntry ("CoreAlbums", "Title"), 
+            AddField (left, new TextEntry ("CoreAlbums", "Title"),
                 Catalog.GetString ("Set all album titles to this value"),
                 delegate { return Catalog.GetString ("Albu_m Title:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((TextEntry)widget).Text = track.AlbumTitle; },
                 delegate (EditorTrackInfo track, Widget widget) { track.AlbumTitle = ((TextEntry)widget).Text; }
             );
 
-            AddField (left, new GenreEntry (), 
+            AddField (left, new GenreEntry (),
                 Catalog.GetString ("Set all genres to this value"),
                 delegate { return Catalog.GetString ("_Genre:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((GenreEntry)widget).Value = track.Genre; },
@@ -119,14 +119,14 @@ namespace Banshee.Gui.TrackEditor
             // Right
 
             /* Translators: "of" is the word beteen a track/disc number and the total count. */
-            AddField (right, new RangeEntry (Catalog.GetString ("of"), !MultipleTracks 
+            AddField (right, new RangeEntry (Catalog.GetString ("of"), !MultipleTracks
                 ? null as RangeEntry.RangeOrderClosure
                 : delegate (RangeEntry entry) {
                     for (int i = 0, n = Dialog.TrackCount; i < n; i++) {
                         EditorTrackInfo track = Dialog.LoadTrack (i);
 
                         if (Dialog.CurrentTrackIndex == i) {
-                            // In this case the writeClosure is invoked, 
+                            // In this case the writeClosure is invoked,
                             // which will take care of updating the TrackInfo
                             entry.From.Value = i + 1;
                             entry.To.Value = n;
@@ -135,7 +135,7 @@ namespace Banshee.Gui.TrackEditor
                             track.TrackCount = n;
                         }
                     }
-                }, Catalog.GetString ("Automatically set track number and count")), 
+                }, Catalog.GetString ("Automatically set track number and count")),
                 null,
                 delegate { return Catalog.GetString ("Track _Number:"); },
                 delegate (EditorTrackInfo track, Widget widget) {
@@ -151,7 +151,7 @@ namespace Banshee.Gui.TrackEditor
                 FieldOptions.NoSync
             );
 
-            AddField (right, new RangeEntry (Catalog.GetString ("of")), 
+            AddField (right, new RangeEntry (Catalog.GetString ("of")),
                 // Catalog.GetString ("Automatically set disc number and count"),
                 Catalog.GetString ("Set all disc numbers and counts to these values"),
                 delegate { return Catalog.GetString ("_Disc Number:"); },
@@ -169,8 +169,8 @@ namespace Banshee.Gui.TrackEditor
             );
 
             Label year_label = EditorUtilities.CreateLabel (null);
-            album_artist_entry.LabelWidget.SizeAllocated += delegate { 
-                year_label.HeightRequest = album_artist_entry.LabelWidget.Allocation.Height; 
+            album_artist_entry.LabelWidget.SizeAllocated += delegate {
+                year_label.HeightRequest = album_artist_entry.LabelWidget.Allocation.Height;
             };
             SpinButtonEntry year_entry = new SpinButtonEntry (0, 3000, 1);
             year_entry.Numeric = true;
@@ -182,7 +182,7 @@ namespace Banshee.Gui.TrackEditor
                 FieldOptions.Shrink
             );
 
-            AddField (right, new RatingEntry (), 
+            AddField (right, new RatingEntry (),
                 Catalog.GetString ("Set all ratings to this value"),
                 delegate { return Catalog.GetString ("_Rating:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((RatingEntry)widget).Value = track.Rating; },
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorEditableUndoAdapter.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorEditableUndoAdapter.cs
index 0b47fe5..60934d8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorEditableUndoAdapter.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorEditableUndoAdapter.cs
@@ -36,7 +36,7 @@ namespace Banshee.Gui.TrackEditor
 {
     public class EditorEditableUndoAdapter<T> where T : Widget, Editable
     {
-        private Dictionary<EditorTrackInfo, EditableUndoAdapter<T>> undo_adapters 
+        private Dictionary<EditorTrackInfo, EditableUndoAdapter<T>> undo_adapters
             = new Dictionary<EditorTrackInfo, EditableUndoAdapter<T>> ();
         private EditableUndoAdapter<T> current_adapter;
 
@@ -47,18 +47,18 @@ namespace Banshee.Gui.TrackEditor
                 current_adapter = null;
             }
         }
-        
+
         public void ConnectUndo (T entry, EditorTrackInfo track)
         {
             DisconnectUndo ();
-        
+
             if (undo_adapters.ContainsKey (track)) {
                 current_adapter = undo_adapters[track];
             } else {
                 current_adapter = new EditableUndoAdapter<T> (entry);
                 undo_adapters.Add (track, current_adapter);
             }
-            
+
             current_adapter.Connect ();
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
index 89ce95c..ab4d8fb 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
@@ -30,7 +30,7 @@ using System;
 
 namespace Banshee.Gui.TrackEditor
 {
-    public enum EditorMode 
+    public enum EditorMode
     {
         Edit,
         View
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorTrackInfo.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorTrackInfo.cs
index 3ce7b90..5667056 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorTrackInfo.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorTrackInfo.cs
@@ -42,17 +42,17 @@ namespace Banshee.Gui.TrackEditor
     {
         private TagLib.File taglib_file;
         private bool taglib_file_exists = true;
-        
+
         public EditorTrackInfo (TrackInfo sourceTrack)
         {
             source_track = sourceTrack;
             TrackInfo.ExportableMerge (source_track, this);
         }
-        
+
         public void GenerateDiff ()
         {
             diff_count = 0;
-            
+
             foreach (KeyValuePair<string, PropertyInfo> iter in GetExportableProperties (typeof (TrackInfo))) {
                 try {
                     PropertyInfo property = iter.Value;
@@ -70,29 +70,29 @@ namespace Banshee.Gui.TrackEditor
                 }
             }
         }
-        
+
         private int diff_count;
         public int DiffCount {
             get { return diff_count; }
         }
-        
+
         private int editor_index;
         public int EditorIndex {
             get { return editor_index; }
             set { editor_index = value; }
         }
-        
+
         private int editor_count;
         public int EditorCount {
             get { return editor_count; }
             set { editor_count = value; }
         }
-        
+
         private TrackInfo source_track;
         public TrackInfo SourceTrack {
             get { return source_track; }
         }
-        
+
         public TagLib.File TaglibFile {
             get {
                 if (taglib_file != null) {
@@ -100,7 +100,7 @@ namespace Banshee.Gui.TrackEditor
                 } else if (!taglib_file_exists) {
                     return null;
                 }
-                    
+
                 try {
                     taglib_file = StreamTagger.ProcessUri (Uri);
                     if (taglib_file != null) {
@@ -111,7 +111,7 @@ namespace Banshee.Gui.TrackEditor
                         Hyena.Log.Exception ("Cannot load TagLib file", e);
                     }
                 }
-                
+
                 taglib_file_exists = false;
                 return null;
             }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorUtilities.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorUtilities.cs
index 5bee8f0..6e0a4c4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorUtilities.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorUtilities.cs
@@ -35,14 +35,14 @@ namespace Banshee.Gui.TrackEditor
     public static class EditorUtilities
     {
         public const int RowSpacing = 5;
-                
+
         public static Label CreateLabel (string text)
         {
             Label label = new Label (text);
             label.Xalign = 0.0f;
             return label;
         }
-    
+
         public static VBox CreateVBox ()
         {
             VBox box = new VBox ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs
index d43530e..8047cdf 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ExtraTrackDetailsPage.cs
@@ -35,15 +35,15 @@ using Banshee.Collection;
 namespace Banshee.Gui.TrackEditor
 {
     public class ExtraTrackDetailsPage : FieldPage, ITrackEditorPage
-    {        
+    {
         public int Order {
             get { return 20; }
         }
-                                    
+
         public string Title {
             get { return Catalog.GetString ("Extra"); }
         }
-        
+
         protected override void AddFields ()
         {
             AddField (this, new TextEntry ("CoreTracks", "Composer"),
@@ -52,19 +52,19 @@ namespace Banshee.Gui.TrackEditor
                 delegate (EditorTrackInfo track, Widget widget) { ((TextEntry)widget).Text = track.Composer; },
                 delegate (EditorTrackInfo track, Widget widget) {  track.Composer = ((TextEntry)widget).Text; }
             );
-            
+
             AddField (this, new TextEntry ("CoreTracks", "Conductor"),
                 Catalog.GetString ("Set all conductors to this value"),
                 delegate { return Catalog.GetString ("Con_ductor:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((TextEntry)widget).Text = track.Conductor; },
                 delegate (EditorTrackInfo track, Widget widget) { track.Conductor = ((TextEntry)widget).Text; }
             );
-            
+
             HBox box = new HBox ();
             box.Spacing = 12;
             box.Show ();
             PackStart (box, false, false, 0);
-            
+
             AddField (box, new TextEntry ("CoreTracks", "Grouping"),
                 Catalog.GetString ("Set all groupings to this value"),
                 delegate { return Catalog.GetString ("_Grouping:"); },
@@ -76,7 +76,7 @@ namespace Banshee.Gui.TrackEditor
             bpm_entry.Digits = 0;
             bpm_entry.MaxLength = 3;
             bpm_entry.Numeric = true;
-            AddField (box, bpm_entry, 
+            AddField (box, bpm_entry,
                 Catalog.GetString ("Set all beats per minute to this value"),
                 delegate { return Catalog.GetString ("Bea_ts Per Minute:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((SpinButtonEntry)widget).Value = track.Bpm; },
@@ -88,7 +88,7 @@ namespace Banshee.Gui.TrackEditor
             copyright_box.Spacing = 12;
             copyright_box.Show ();
             PackStart (copyright_box, true, true, 0);
-            
+
             AddField (copyright_box, new TextEntry ("CoreTracks", "Copyright"),
                 Catalog.GetString ("Set all copyrights to this value"),
                 delegate { return Catalog.GetString ("Copyrig_ht:"); },
@@ -106,7 +106,7 @@ namespace Banshee.Gui.TrackEditor
             TextViewEntry comment_entry = new TextViewEntry ();
             comment_entry.HscrollbarPolicy = PolicyType.Automatic;
             comment_entry.TextView.WrapMode = WrapMode.WordChar;
-            AddField (this, comment_entry, 
+            AddField (this, comment_entry,
                 Catalog.GetString ("Set all comments to this value"),
                 delegate { return Catalog.GetString ("Co_mment:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((TextViewEntry)widget).Text = track.Comment; },
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
index 355ddc8..6143f88 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
@@ -45,12 +45,12 @@ namespace Banshee.Gui.TrackEditor
         protected TrackEditorDialog Dialog {
             get { return dialog; }
         }
-        
+
         private EditorTrackInfo current_track;
         protected EditorTrackInfo CurrentTrack {
             get { return current_track; }
         }
-        
+
         public struct FieldSlot
         {
             public Widget Parent;
@@ -62,71 +62,71 @@ namespace Banshee.Gui.TrackEditor
             public FieldValueClosure ReadClosure;
             public FieldValueClosure WriteClosure;
         }
-        
+
         private object tooltip_host;
 
         private List<FieldSlot> field_slots = new List<FieldSlot> ();
         public IEnumerable<FieldSlot> FieldSlots {
             get { return field_slots; }
         }
-        
+
         public FieldPage ()
         {
             Spacing = EditorUtilities.RowSpacing;
             tooltip_host = TooltipSetter.CreateHost ();
         }
-        
+
         public void Initialize (TrackEditorDialog dialog)
         {
             this.dialog = dialog;
             AddFields ();
         }
-        
+
         protected virtual void AddFields ()
         {
         }
-        
+
         public virtual bool MultipleTracks {
             get { return dialog.TrackCount > 1; }
         }
-        
+
         public virtual Widget Widget {
             get { return this; }
         }
-        
+
         public Gtk.Widget TabWidget {
             get { return null; }
         }
-        
-        public virtual PageType PageType { 
+
+        public virtual PageType PageType {
             get { return PageType.Edit; }
         }
-    
-        public FieldSlot AddField (Box parent, Widget field, string syncTooltip, FieldLabelClosure labelClosure, 
+
+        public FieldSlot AddField (Box parent, Widget field, string syncTooltip, FieldLabelClosure labelClosure,
             FieldValueClosure readClosure, FieldValueClosure writeClosure)
         {
             return AddField (parent, EditorUtilities.CreateLabel (String.Empty), field, syncTooltip,
                 labelClosure, readClosure, writeClosure, FieldOptions.None);
         }
-        
-        public FieldSlot AddField (Box parent, Widget field, string syncTooltip, FieldLabelClosure labelClosure, 
+
+        public FieldSlot AddField (Box parent, Widget field, string syncTooltip, FieldLabelClosure labelClosure,
             FieldValueClosure readClosure, FieldValueClosure writeClosure, FieldOptions options)
         {
             return AddField (parent, EditorUtilities.CreateLabel (String.Empty), field, syncTooltip,
                 labelClosure, readClosure, writeClosure, options);
         }
-        
-        public FieldSlot AddField (Box parent, Widget label, Widget field, string syncTooltip, 
+
+        public FieldSlot AddField (Box parent, Widget label, Widget field, string syncTooltip,
             FieldLabelClosure labelClosure, FieldValueClosure readClosure, FieldValueClosure writeClosure)
         {
             return AddField (parent, label, field, syncTooltip, labelClosure, readClosure, writeClosure, FieldOptions.None);
         }
-        
-        public FieldSlot AddField (Box parent, Widget label, Widget field, string syncTooltip, FieldLabelClosure labelClosure, 
+
+        public FieldSlot AddField (Box parent, Widget label, Widget field, string syncTooltip, FieldLabelClosure labelClosure,
             FieldValueClosure readClosure, FieldValueClosure writeClosure, FieldOptions options)
         {
             FieldSlot slot = new FieldSlot ();
-            
+
             slot.Parent = parent;
             slot.Label = label;
             slot.Field = field;
@@ -144,14 +144,14 @@ namespace Banshee.Gui.TrackEditor
                     });
                 };
             }
-            
+
             Table table = new Table (1, 1, false);
             table.ColumnSpacing = 1;
-            
-            table.Attach (field, 0, 1, 1, 2, 
-                AttachOptions.Expand | AttachOptions.Fill, 
+
+            table.Attach (field, 0, 1, 1, 2,
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Fill, 0, 0);
-                
+
             IEditorField editor_field = field as IEditorField;
             if (editor_field != null) {
                 editor_field.Changed += delegate {
@@ -160,10 +160,10 @@ namespace Banshee.Gui.TrackEditor
                     }
                 };
             }
-            
+
             if (slot.SyncButton != null) {
-                table.Attach (slot.SyncButton, 1, 2, 1, 2, 
-                    AttachOptions.Fill, 
+                table.Attach (slot.SyncButton, 1, 2, 1, 2,
+                    AttachOptions.Fill,
                     AttachOptions.Fill, 0, 0);
             }
 
@@ -172,12 +172,12 @@ namespace Banshee.Gui.TrackEditor
                     ((Label)label).MnemonicWidget = field;
                 }
                 table.Attach (label, 0, table.NColumns, 0, 1,
-                    AttachOptions.Fill | AttachOptions.Expand, 
+                    AttachOptions.Fill | AttachOptions.Expand,
                     AttachOptions.Fill, 0, 0);
             }
-                
+
             table.ShowAll ();
-            
+
             if ((options & FieldOptions.Shrink) == 0) {
                 slot.Container = table;
                 parent.PackStart (table, false, false, 0);
@@ -188,7 +188,7 @@ namespace Banshee.Gui.TrackEditor
                 shrink.PackStart (table, false, false, 0);
                 parent.PackStart (shrink, false, false, 0);
             }
-            
+
             field_slots.Add (slot);
             return slot;
         }
@@ -197,19 +197,19 @@ namespace Banshee.Gui.TrackEditor
         {
             field_slots.Remove (slot);
         }
-        
+
         public virtual void LoadTrack (EditorTrackInfo track)
         {
             current_track = null;
-            
+
             foreach (FieldSlot slot in field_slots) {
                 UpdateLabel (track, slot);
                 slot.ReadClosure (track, slot.Field);
             }
-            
+
             current_track = track;
         }
-        
+
         private void UpdateLabel (EditorTrackInfo track, FieldSlot slot)
         {
             Label label = slot.Label as Label;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
index 13e27bd..1dbfb91 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
@@ -40,7 +40,7 @@ namespace Banshee.Gui.TrackEditor
     {
         private ListStore genre_model;
         private EditorEditableUndoAdapter<Entry> undo_adapter = new EditorEditableUndoAdapter<Entry> ();
-        
+
         public GenreEntry ()
         {
             genre_model = new ListStore (typeof (string));
@@ -55,7 +55,7 @@ namespace Banshee.Gui.TrackEditor
             //c.InlineSelection = true; // requires 2.12
             c.PopupSingleMatch = false;
             Entry.Completion = c;
-        
+
             foreach (string genre in ServiceManager.DbConnection.QueryEnumerable<string> (
                 "SELECT DISTINCT Genre FROM CoreTracks ORDER BY Genre")) {
                 if (!String.IsNullOrEmpty (genre)) {
@@ -63,17 +63,17 @@ namespace Banshee.Gui.TrackEditor
                 }
             }
         }
-        
+
         public void DisconnectUndo ()
         {
             undo_adapter.DisconnectUndo ();
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             undo_adapter.ConnectUndo (Entry, track);
         }
-        
+
         public string Value {
             get { return Entry.Text; }
             set { Entry.Text = value ?? String.Empty; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/HelpPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/HelpPage.cs
index 4602323..56d8497 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/HelpPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/HelpPage.cs
@@ -36,47 +36,47 @@ namespace Banshee.Gui.TrackEditor
     {
         private Box tab_widget;
         private TrackEditorDialog dialog;
-               
+
         public HelpPage () : base (0.5f, 0.5f, 0.0f, 0.0f)
         {
             Image help = new Image ();
             help.Pixbuf = Gdk.Pixbuf.LoadFromResource ("jcastro.png");
             help.Show ();
             Add (help);
-            
+
             tab_widget = new HBox ();
             tab_widget.Spacing = 2;
             tab_widget.PackStart (new Image (Stock.Help, IconSize.Menu), false, false, 0);
             tab_widget.PackStart (new Label (Title), true, true, 0);
             tab_widget.ShowAll ();
         }
-        
+
         public void Initialize (TrackEditorDialog dialog)
         {
             this.dialog = dialog;
         }
-        
+
         public void LoadTrack (EditorTrackInfo track)
         {
             dialog.Notebook.SetTabLabelPacking (this, false, false, PackType.End);
         }
-        
+
         public int Order {
             get { return 10000; }
         }
-        
+
         public string Title {
             get { return Catalog.GetString ("Help"); }
         }
-        
+
         public Widget TabWidget {
             get { return tab_widget; }
         }
-        
-        public PageType PageType { 
+
+        public PageType PageType {
             get { return PageType.Edit; }
         }
-        
+
         public Gtk.Widget Widget {
             get { return this; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ITrackEditorPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ITrackEditorPage.cs
index 475972e..957f7e1 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ITrackEditorPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/ITrackEditorPage.cs
@@ -33,10 +33,10 @@ using Banshee.Collection;
 namespace Banshee.Gui.TrackEditor
 {
     public interface ITrackEditorPage
-    {       
+    {
         void Initialize (TrackEditorDialog dialog);
         void LoadTrack (EditorTrackInfo track);
-        
+
         int Order { get; }
         string Title { get; }
         PageType PageType { get; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
index 33eaea3..3efae68 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
@@ -41,7 +41,7 @@ namespace Banshee.Gui.TrackEditor
     {
         private ListStore license_model;
         private EditorEditableUndoAdapter<Entry> undo_adapter = new EditorEditableUndoAdapter<Entry> ();
-        
+
         public LicenseEntry ()
         {
             license_model = new ListStore (typeof (string));
@@ -64,17 +64,17 @@ namespace Banshee.Gui.TrackEditor
                 }
             }
         }
-        
+
         public void DisconnectUndo ()
         {
             undo_adapter.DisconnectUndo ();
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             undo_adapter.ConnectUndo (Entry, track);
         }
-        
+
         public string Value {
             get { return Entry.Text; }
             set { Entry.Text = value ?? String.Empty; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LyricsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LyricsPage.cs
index a912024..133149a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LyricsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LyricsPage.cs
@@ -35,23 +35,23 @@ using Banshee.Collection;
 namespace Banshee.Gui.TrackEditor
 {
     public class LyricsPage : FieldPage, ITrackEditorPage
-    {    
+    {
         private TextViewEntry lyrics_entry;
-            
+
         public int Order {
             get { return 30; }
         }
-                                    
+
         public string Title {
             get { return Catalog.GetString ("Lyrics"); }
         }
-        
+
         public override void LoadTrack (EditorTrackInfo track)
         {
             BorderWidth = 2;
             lyrics_entry.Text = "Not supported";
         }
-        
+
         protected override void AddFields ()
         {
             PackStart (lyrics_entry = new TextViewEntry (), true, true, 0);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
index 9edeb98..a0d5100 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
@@ -35,18 +35,18 @@ namespace Banshee.Gui.TrackEditor
     public class PageNavigationEntry : HBox, IEditorField, ICanUndo
     {
         public event EventHandler Changed;
-        
+
         private TextEntry entry;
         private TrackEditorDialog dialog;
         private Button forward_button;
         public Button ForwardButton {
             get { return forward_button; }
         }
-        
+
         public PageNavigationEntry (TrackEditorDialog dialog) : this (dialog, null, null)
         {
         }
-        
+
         public PageNavigationEntry (TrackEditorDialog dialog, string completionTable, string completionColumn)
         {
             this.dialog = dialog;
@@ -54,20 +54,20 @@ namespace Banshee.Gui.TrackEditor
             entry.Changed += OnChanged;
             entry.Activated += EditNextTitle;
             entry.KeyPressEvent += delegate (object o, KeyPressEventArgs args) {
-                if ((args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter) && 
+                if ((args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter) &&
                     (args.Event.State & Gdk.ModifierType.ControlMask) != 0 && dialog.CanGoBackward) {
                     dialog.NavigateBackward ();
                     entry.GrabFocus ();
                 }
             };
             entry.Show ();
-            
+
             Spacing = 1;
             PackStart (entry, true, true, 0);
-            
+
             if (dialog.TrackCount > 1) {
-                dialog.Navigated += delegate { 
-                    forward_button.Sensitive = dialog.CanGoForward; 
+                dialog.Navigated += delegate {
+                    forward_button.Sensitive = dialog.CanGoForward;
                 };
                 forward_button = EditorUtilities.CreateSmallStockButton (Stock.GoForward);
                 object tooltip_host = Hyena.Gui.TooltipSetter.CreateHost ();
@@ -86,17 +86,17 @@ namespace Banshee.Gui.TrackEditor
                 entry.GrabFocus ();
             }
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             entry.ConnectUndo (track);
         }
-        
+
         public void DisconnectUndo ()
         {
             entry.DisconnectUndo ();
         }
-                
+
         private void OnChanged (object o, EventArgs args)
         {
             EventHandler handler = Changed;
@@ -108,11 +108,11 @@ namespace Banshee.Gui.TrackEditor
         protected override bool OnMnemonicActivated (bool group_cycling) {
             return entry.MnemonicActivate(group_cycling);
         }
-    
+
         public TextEntry Entry {
             get { return entry; }
         }
-        
+
         public string Text {
             get { return entry.Text; }
             set { entry.Text = value; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
index 8541235..b7a348a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
@@ -35,27 +35,27 @@ namespace Banshee.Gui.TrackEditor
     public class RangeEntry : HBox, IEditorField
     {
         public delegate void RangeOrderClosure (RangeEntry entry);
-        
+
         public event EventHandler Changed;
-    
+
         private SpinButton from_entry;
         public SpinButton From {
             get { return from_entry; }
         }
-        
+
         private SpinButton to_entry;
         public SpinButton To {
             get { return to_entry; }
         }
-    
+
         public RangeEntry (string rangeLabel) : this (rangeLabel, null, null)
         {
         }
-    
+
         public RangeEntry (string rangeLabel, RangeOrderClosure orderClosure, string orderTooltip)
         {
             AutoOrderButton auto_order_button;
-        
+
             PackStart (from_entry = new SpinButton (0, 999, 1), true, true, 0);
             PackStart (new Label (rangeLabel), false, false, 6);
             PackStart (to_entry = new SpinButton (0, 999, 1), true, true, 0);
@@ -66,23 +66,23 @@ namespace Banshee.Gui.TrackEditor
                     TooltipSetter.Set (TooltipSetter.CreateHost (), auto_order_button, orderTooltip);
                 }
             }
-            
+
             ShowAll ();
-            
+
             from_entry.WidthChars = 2;
             to_entry.WidthChars = 2;
-            
+
             from_entry.ValueChanged += OnChanged;
             to_entry.ValueChanged += OnChanged;
         }
-        
+
         protected override bool OnMnemonicActivated (bool group_cycling) {
             return from_entry.MnemonicActivate(group_cycling);
         }
 
         private class AutoOrderButton : Button
         {
-            public AutoOrderButton () 
+            public AutoOrderButton ()
             {
                 Image image = new Image (Gtk.Stock.SortAscending, IconSize.Menu);
                 Add (image);
@@ -90,7 +90,7 @@ namespace Banshee.Gui.TrackEditor
                 image.Show ();
             }
         }
-        
+
         private void OnChanged (object o, EventArgs args)
         {
             EventHandler handler = Changed;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs
index b8adeb6..243e3d8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SortingPage.cs
@@ -33,15 +33,15 @@ using Banshee.Collection;
 namespace Banshee.Gui.TrackEditor
 {
     public class SortingPage : FieldPage, ITrackEditorPage
-    {        
+    {
         public int Order {
             get { return 30; }
         }
-                                    
+
         public string Title {
             get { return Catalog.GetString ("Sorting"); }
         }
-        
+
         protected override void AddFields ()
         {
             AddField (this, new TextEntry (),
@@ -51,21 +51,21 @@ namespace Banshee.Gui.TrackEditor
                 delegate (EditorTrackInfo track, Widget widget) {  track.TrackTitleSort = ((TextEntry)widget).Text; },
                 FieldOptions.NoSync
             );
-            
+
             AddField (this, new TextEntry (),
                 Catalog.GetString ("Set all sort track artists to this value"),
                 delegate { return Catalog.GetString ("Sort Track Artist:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((TextEntry)widget).Text = track.ArtistNameSort; },
                 delegate (EditorTrackInfo track, Widget widget) {  track.ArtistNameSort = ((TextEntry)widget).Text; }
             );
-            
+
             AddField (this, new TextEntry (),
                 Catalog.GetString ("Set all sort album artists to this value"),
                 delegate { return Catalog.GetString ("Sort Album Artist:"); },
                 delegate (EditorTrackInfo track, Widget widget) { ((TextEntry)widget).Text = track.AlbumArtistSort; },
                 delegate (EditorTrackInfo track, Widget widget) {  track.AlbumArtistSort = ((TextEntry)widget).Text; }
             );
-            
+
             AddField (this, new TextEntry (),
                 Catalog.GetString ("Set all sort album titles to this value"),
                 delegate { return Catalog.GetString ("Sort Album Title:"); },
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
index 192a4d2..d3916bb 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
@@ -37,7 +37,7 @@ namespace Banshee.Gui.TrackEditor
             add { ValueChanged += value; }
             remove { ValueChanged -= value; }
         }
-        
+
         public SpinButtonEntry (double min, double max, double step) : base (min, max, step)
         {
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
index cd884f0..f5f0e47 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
@@ -55,25 +55,26 @@ namespace Banshee.Gui.TrackEditor
         private CellRendererText value_renderer;
         private ListStore model;
         private TreeView view;
-        
+
         public StatisticsPage ()
         {
             ShadowType = ShadowType.In;
             VscrollbarPolicy = PolicyType.Automatic;
             HscrollbarPolicy = PolicyType.Never;
-            
+            BorderWidth = 2;
+
             view = new FixedTreeView (model);
             view.HeadersVisible = false;
             view.RowSeparatorFunc = new TreeViewRowSeparatorFunc (RowSeparatorFunc);
             view.HasTooltip = true;
             view.QueryTooltip += HandleQueryTooltip;
-            
+
             name_renderer = new CellRendererText ();
             name_renderer.Alignment = Pango.Alignment.Right;
             name_renderer.Weight = (int)Pango.Weight.Bold;
             name_renderer.Xalign = 1.0f;
             name_renderer.Scale = Pango.Scale.Small;
-            
+
             value_renderer = new CellRendererText ();
             value_renderer.Ellipsize = Pango.EllipsizeMode.End;
             value_renderer.Editable = true;
@@ -84,14 +85,17 @@ namespace Banshee.Gui.TrackEditor
                     entry.IsEditable = false;
                 }
             };
-            
+
             view.AppendColumn (Catalog.GetString ("Name"), name_renderer, "text", 0);
             view.AppendColumn (Catalog.GetString ("Value"), value_renderer, "text", 1);
-            
+
             Add (view);
             ShowAll ();
         }
-        
+
+        public CellRendererText NameRenderer { get { return name_renderer; } }
+        public CellRendererText ValueRenderer { get { return value_renderer; } }
+
         private bool RowSeparatorFunc (TreeModel model, TreeIter iter)
         {
             return (bool)model.GetValue (iter, 2);
@@ -132,7 +136,7 @@ namespace Banshee.Gui.TrackEditor
                 args.Tooltip.Dispose ();
             }
         }
-        
+
         protected override void OnStyleSet (Style previous_style)
         {
             base.OnStyleSet (previous_style);
@@ -142,15 +146,14 @@ namespace Banshee.Gui.TrackEditor
         public void Initialize (TrackEditorDialog dialog)
         {
         }
-        
+
         public void LoadTrack (EditorTrackInfo track)
         {
-            BorderWidth = 2;
-            model = new ListStore (typeof (string), typeof (string), typeof (bool));
-            view.Model = model;
-            
+            model = null;
+            CreateModel ();
+
             TagLib.File file = track.TaglibFile;
-            
+
             if (track.Uri.IsLocalPath) {
                 string path = track.Uri.AbsolutePath;
                 AddItem (Catalog.GetString ("File Name:"), System.IO.Path.GetFileName (path));
@@ -164,84 +167,94 @@ namespace Banshee.Gui.TrackEditor
                 AddItem (Catalog.GetString ("URI:"), track.Uri.AbsoluteUri);
                 AddFileSizeItem (track.FileSize);
             }
-            
+
             AddSeparator ();
-            
+
             if (file != null) {
                 System.Text.StringBuilder builder = new System.Text.StringBuilder ();
                 Banshee.Sources.DurationStatusFormatters.ConfusingPreciseFormatter (builder, file.Properties.Duration);
-                AddItem (Catalog.GetString ("Duration:"), String.Format ("{0} ({1}ms)", 
+                AddItem (Catalog.GetString ("Duration:"), String.Format ("{0} ({1}ms)",
                     builder, file.Properties.Duration.TotalMilliseconds));
-                
-                AddItem (Catalog.GetString ("Audio Bitrate:"), String.Format ("{0} KB/sec", 
+
+                AddItem (Catalog.GetString ("Audio Bitrate:"), String.Format ("{0} KB/sec",
                     file.Properties.AudioBitrate));
-                AddItem (Catalog.GetString ("Audio Sample Rate:"), String.Format ("{0} Hz", 
-                    file.Properties.AudioSampleRate)); 
+                AddItem (Catalog.GetString ("Audio Sample Rate:"), String.Format ("{0} Hz",
+                    file.Properties.AudioSampleRate));
                 AddItem (Catalog.GetString ("Audio Channels:"), file.Properties.AudioChannels);
-                
+
                 if ((file.Properties.MediaTypes & TagLib.MediaTypes.Video) != 0) {
-                    AddItem (Catalog.GetString ("Video Dimensions:"), String.Format ("{0}x{1}", 
+                    AddItem (Catalog.GetString ("Video Dimensions:"), String.Format ("{0}x{1}",
                         file.Properties.VideoWidth, file.Properties.VideoHeight));
                 }
-                
+
                 foreach (TagLib.ICodec codec in file.Properties.Codecs) {
                     if (codec != null) {
                         /* Translators: {0} is the description of the codec */
-                        AddItem (String.Format (Catalog.GetString ("{0} Codec:"), 
+                        AddItem (String.Format (Catalog.GetString ("{0} Codec:"),
                             codec.MediaTypes.ToString ()), codec.Description);
                     }
                 }
-                
+
                 AddItem (Catalog.GetString ("Container Formats:"), file.TagTypes.ToString ());
                 AddSeparator ();
             }
-            
-            AddItem (Catalog.GetString ("Imported On:"), track.DateAdded > DateTime.MinValue 
+
+            AddItem (Catalog.GetString ("Imported On:"), track.DateAdded > DateTime.MinValue
                 ? track.DateAdded.ToString () : Catalog.GetString ("Unknown"));
-            AddItem (Catalog.GetString ("Last Played:"), track.LastPlayed > DateTime.MinValue 
+            AddItem (Catalog.GetString ("Last Played:"), track.LastPlayed > DateTime.MinValue
                 ? track.LastPlayed.ToString () : Catalog.GetString ("Unknown"));
-            AddItem (Catalog.GetString ("Last Skipped:"), track.LastSkipped > DateTime.MinValue 
+            AddItem (Catalog.GetString ("Last Skipped:"), track.LastSkipped > DateTime.MinValue
                 ? track.LastSkipped.ToString () : Catalog.GetString ("Unknown"));
             AddItem (Catalog.GetString ("Play Count:"), track.PlayCount);
             AddItem (Catalog.GetString ("Skip Count:"), track.SkipCount);
             AddItem (Catalog.GetString ("Score:"), track.Score);
         }
-        
+
         private void AddFileSizeItem (long bytes)
         {
             Hyena.Query.FileSizeQueryValue value = new Hyena.Query.FileSizeQueryValue (bytes);
-            AddItem (Catalog.GetString ("File Size:"), String.Format ("{0} ({1} {2})", 
+            AddItem (Catalog.GetString ("File Size:"), String.Format ("{0} ({1} {2})",
                 value.ToUserQuery (), bytes, Catalog.GetString ("bytes")));
         }
-        
+
+        private void CreateModel ()
+        {
+            if (model == null) {
+                model = new ListStore (typeof (string), typeof (string), typeof (bool));
+                view.Model = model;
+            }
+        }
+
         public void AddItem (string name, object value)
         {
+            CreateModel ();
             if (name != null && value != null) {
                 model.AppendValues (name, value.ToString (), false);
             }
         }
-        
+
         public void AddSeparator ()
         {
+            CreateModel ();
             model.AppendValues (String.Empty, String.Empty, true);
         }
-        
+
         public int Order {
             get { return 40; }
         }
-        
+
         public string Title {
             get { return Catalog.GetString ("Properties"); }
         }
-        
-        public PageType PageType { 
+
+        public PageType PageType {
             get { return PageType.View; }
         }
-        
-        public Gtk.Widget TabWidget { 
+
+        public Gtk.Widget TabWidget {
             get { return null; }
         }
-        
+
         public Gtk.Widget Widget {
             get { return this; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
index 81f3768..ce60f28 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
@@ -46,7 +46,7 @@ namespace Banshee.Gui.TrackEditor
             if (completionTable == null || completionColumn == null) {
                 return;
             }
-        
+
             ListStore completion_model = new ListStore (typeof (string));
             foreach (string val in ServiceManager.DbConnection.QueryEnumerable<string> (String.Format (
                 "SELECT DISTINCT {1} FROM {0} ORDER BY {1}", completionTable, completionColumn))) {
@@ -63,17 +63,17 @@ namespace Banshee.Gui.TrackEditor
             //Completion.InlineSelection = true; // requires 2.12
             Completion.PopupSingleMatch = false;
         }
-        
+
         public void DisconnectUndo ()
         {
             undo_adapter.DisconnectUndo ();
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             undo_adapter.ConnectUndo (this, track);
         }
-        
+
         public new string Text {
             get { return base.Text; }
             set { base.Text = value ?? String.Empty; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
index eb79899..4ec2f86 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
@@ -34,17 +34,17 @@ using Hyena.Widgets;
 namespace Banshee.Gui.TrackEditor
 {
     public class TextViewEntry : Gtk.ScrolledWindow, IEditorField, ICanUndo
-    {    
-        private EditorEditableUndoAdapter<TextViewEditable> undo_adapter 
+    {
+        private EditorEditableUndoAdapter<TextViewEditable> undo_adapter
             = new EditorEditableUndoAdapter<TextViewEditable> ();
-        
+
         public event EventHandler Changed;
-        
+
         private TextViewEditable entry;
         public TextView TextView {
             get { return entry; }
         }
-        
+
         public string Text {
             get { return entry.Buffer.Text; }
             set { entry.Buffer.Text = value ?? String.Empty; }
@@ -55,15 +55,15 @@ namespace Banshee.Gui.TrackEditor
             VscrollbarPolicy = PolicyType.Automatic;
             HscrollbarPolicy = PolicyType.Never;
             ShadowType = ShadowType.In;
-            
+
             Add (entry = new TextViewEditable ());
             entry.AcceptsTab = false;
             entry.Show ();
             entry.Buffer.Changed += OnChanged;
-            
+
             entry.SizeRequested += OnTextViewSizeRequested;
         }
-        
+
         private void OnTextViewSizeRequested (object o, SizeRequestedArgs args)
         {
             Pango.FontMetrics metrics = PangoContext.GetMetrics (entry.Style.FontDescription, PangoContext.Language);
@@ -71,17 +71,17 @@ namespace Banshee.Gui.TrackEditor
             metrics.Dispose ();
             HeightRequest = (line_height + 2) * 2;
         }
-        
+
         public void DisconnectUndo ()
         {
             undo_adapter.DisconnectUndo ();
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             undo_adapter.ConnectUndo (entry, track);
         }
-                
+
         protected override bool OnMnemonicActivated (bool group_cycling) {
             return entry.MnemonicActivate(group_cycling);
         }
@@ -95,4 +95,3 @@ namespace Banshee.Gui.TrackEditor
         }
     }
 }
-            
\ No newline at end of file
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
index 41cae3e..d322d4f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
@@ -52,9 +52,9 @@ namespace Banshee.Gui.TrackEditor
     public class TrackEditorDialog : BansheeDialog
     {
         public delegate void EditorTrackOperationClosure (EditorTrackInfo track);
-    
+
         private VBox main_vbox;
-    
+
         private Frame header_image_frame;
         private Image header_image;
         private Label header_title_label;
@@ -62,33 +62,33 @@ namespace Banshee.Gui.TrackEditor
         private Label header_album_label;
         private Label edit_notif_label;
         private object tooltip_host;
-        
+
         private DateTime dialog_launch_datetime = DateTime.Now;
-        
+
         private Notebook notebook;
         public Notebook Notebook {
             get { return notebook; }
         }
-    
+
         private Button nav_backward_button;
         private Button nav_forward_button;
         private PulsingButton sync_all_button;
-        
+
         private EditorMode mode;
-        
+
         private List<ITrackEditorPage> pages = new List<ITrackEditorPage> ();
-        
+
         public event EventHandler Navigated;
-        
+
         private TrackEditorDialog (TrackListModel model, EditorMode mode) : base (
             mode == EditorMode.Edit ? Catalog.GetString ("Track Editor") : Catalog.GetString ("Track Properties"))
         {
             this.mode = mode;
-            
+
             LoadTrackModel (model);
-        
+
             BorderWidth = 6;
-            
+
             if (mode == EditorMode.Edit) {
                 WidthRequest = 525;
                 AddStockButton (Stock.Cancel, ResponseType.Cancel);
@@ -97,26 +97,26 @@ namespace Banshee.Gui.TrackEditor
                 AddStockButton (Stock.Close, ResponseType.Close, true);
                 SetSizeRequest (400, 500);
             }
-            
+
             tooltip_host = TooltipSetter.CreateHost ();
-            
+
             AddNavigationButtons ();
-            
+
             main_vbox = new VBox ();
             main_vbox.Spacing = 10;
             main_vbox.BorderWidth = 6;
             main_vbox.Show ();
             VBox.PackStart (main_vbox, true, true, 0);
-            
+
             BuildHeader ();
             BuildNotebook ();
             BuildFooter ();
 
             LoadModifiers ();
-            
+
             LoadTrackToEditor ();
         }
-        
+
 #region UI Building
 
         private void AddNavigationButtons ()
@@ -124,48 +124,48 @@ namespace Banshee.Gui.TrackEditor
             if (TrackCount <= 1) {
                 return;
             }
-            
+
             nav_backward_button = new Button (Stock.GoBack);
             nav_backward_button.UseStock = true;
             nav_backward_button.Clicked += delegate { NavigateBackward (); };
             nav_backward_button.Show ();
             TooltipSetter.Set (tooltip_host, nav_backward_button, Catalog.GetString ("Show the previous track"));
-            
+
             nav_forward_button = new Button (Stock.GoForward);
             nav_forward_button.UseStock = true;
             nav_forward_button.Clicked += delegate { NavigateForward (); };
             nav_forward_button.Show ();
             TooltipSetter.Set (tooltip_host, nav_forward_button, Catalog.GetString ("Show the next track"));
-            
+
             ActionArea.PackStart (nav_backward_button, false, false, 0);
             ActionArea.PackStart (nav_forward_button, false, false, 0);
             ActionArea.SetChildSecondary (nav_backward_button, true);
             ActionArea.SetChildSecondary (nav_forward_button, true);
         }
-        
+
         private void BuildHeader ()
         {
             Table header = new Table (3, 3, false);
             header.ColumnSpacing = 5;
-            
+
             header_image_frame = new Frame ();
-            
+
             header_image = new Image ();
             header_image.IconName = "media-optical";
             header_image.PixelSize = 64;
             header_image_frame.Add (header_image);
-            
+
             header.Attach (header_image_frame, 0, 1, 0, 3,
                 AttachOptions.Fill, AttachOptions.Expand, 0, 0);
-            
+
             AddHeaderRow (header, 0, Catalog.GetString ("Title:"), out header_title_label);
             AddHeaderRow (header, 1, Catalog.GetString ("Artist:"), out header_artist_label);
             AddHeaderRow (header, 2, Catalog.GetString ("Album:"), out header_album_label);
-          
+
             header.ShowAll ();
             main_vbox.PackStart (header, false, false, 0);
         }
-        
+
         private void AddHeaderRow (Table header, uint row, string title, out Label label)
         {
             Label title_label = new Label ();
@@ -173,19 +173,19 @@ namespace Banshee.Gui.TrackEditor
             title_label.Xalign = 0.0f;
             header.Attach (title_label, 1, 2, row, row + 1,
                 AttachOptions.Fill, AttachOptions.Expand, 0, 0);
-            
+
             label = new Label ();
             label.Xalign = 0.0f;
             label.Ellipsize = Pango.EllipsizeMode.End;
-            header.Attach (label, 2, 3, row, row + 1, 
+            header.Attach (label, 2, 3, row, row + 1,
                 AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Expand, 0, 0);
         }
-        
+
         private void BuildNotebook ()
         {
             notebook = new Notebook ();
             notebook.Show ();
-            
+
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/Gui/TrackEditor/NotebookPage")) {
                 try {
                     ITrackEditorPage page = (ITrackEditorPage)node.CreateInstance ();
@@ -199,7 +199,7 @@ namespace Banshee.Gui.TrackEditor
                     Hyena.Log.Exception ("Failed to initialize NotebookPage extension node. Ensure it implements ITrackEditorPage.", e);
                 }
             }
-            
+
             pages.Sort (delegate (ITrackEditorPage a, ITrackEditorPage b) { return a.Order.CompareTo (b.Order); });
             foreach (ITrackEditorPage page in pages) {
                 Container container = page.Widget as Container;
@@ -211,19 +211,19 @@ namespace Banshee.Gui.TrackEditor
                 container.BorderWidth = 12;
                 notebook.AppendPage (container, page.TabWidget == null ? new Label (page.Title) : page.TabWidget);
             }
-            
+
             main_vbox.PackStart (notebook, true, true, 0);
         }
-        
+
         private void BuildFooter ()
         {
             if (mode == EditorMode.View) {
                 return;
             }
-        
+
             HBox button_box = new HBox ();
             button_box.Spacing = 6;
-                       
+
             if (TrackCount > 1) {
                 sync_all_button = new PulsingButton ();
                 sync_all_button.FocusInEvent += delegate {
@@ -231,22 +231,22 @@ namespace Banshee.Gui.TrackEditor
                         button.StartPulsing ();
                     });
                 };
-                
+
                 sync_all_button.FocusOutEvent += delegate {
                     if (sync_all_button.State == StateType.Prelight) {
                         return;
                     }
-                    
+
                     ForeachWidget<SyncButton> (delegate (SyncButton button) {
                         button.StopPulsing ();
                     });
                 };
-                
+
                 sync_all_button.StateChanged += delegate {
                     if (sync_all_button.HasFocus) {
                         return;
                     }
-                
+
                     ForeachWidget<SyncButton> (delegate (SyncButton button) {
                         if (sync_all_button.State == StateType.Prelight) {
                             button.StartPulsing ();
@@ -255,11 +255,11 @@ namespace Banshee.Gui.TrackEditor
                         }
                     });
                 };
-                
+
                 sync_all_button.Clicked += delegate {
                     InvokeFieldSync ();
                 };
-                
+
                 Alignment alignment = new Alignment (0.5f, 0.5f, 0.0f, 0.0f);
                 HBox box = new HBox ();
                 box.Spacing = 2;
@@ -267,21 +267,21 @@ namespace Banshee.Gui.TrackEditor
                 box.PackStart (new Label (Catalog.GetString ("Sync all field _values")), false, false, 0);
                 alignment.Add (box);
                 sync_all_button.Add (alignment);
-                
+
                 TooltipSetter.Set (tooltip_host, sync_all_button, Catalog.GetString (
                     "Apply the values of all common fields set for this track to all of the tracks selected in this editor"));
-                    
+
                 button_box.PackStart (sync_all_button, false, false, 0);
-                
+
                 foreach (Widget child in ActionArea.Children) {
                     child.SizeAllocated += OnActionAreaChildSizeAllocated;
                 }
-                
+
                 edit_notif_label = new Label ();
                 edit_notif_label.Xalign = 1.0f;
                 button_box.PackEnd (edit_notif_label, false, false, 0);
             }
-            
+
             main_vbox.PackStart (button_box, false, false, 0);
             button_box.ShowAll ();
         }
@@ -297,12 +297,12 @@ namespace Banshee.Gui.TrackEditor
                 }
             }
         }
-        
+
         public void ForeachWidget<T> (WidgetAction<T> action) where T : class
         {
             for (int i = 0; i < notebook.NPages; i++) {
                 GtkUtilities.ForeachWidget (notebook.GetNthPage (i) as Container, action);
-            }     
+            }
         }
 
         private void InvokeFieldSync ()
@@ -313,29 +313,29 @@ namespace Banshee.Gui.TrackEditor
                 }
             });
         }
-        
+
         private int action_area_children_allocated = 0;
-        
+
         private void OnActionAreaChildSizeAllocated (object o, SizeAllocatedArgs args)
         {
             Widget [] children = ActionArea.Children;
             if (++action_area_children_allocated != children.Length) {
                 return;
             }
-            
+
             sync_all_button.WidthRequest = Math.Max (sync_all_button.Allocation.Width,
                 (children[1].Allocation.X + children[1].Allocation.Width) - children[0].Allocation.X - 1);
         }
-        
+
 #endregion
-        
+
 #region Track Model/Changes API
-        
+
         private CachedList<DatabaseTrackInfo> db_selection;
         private List<TrackInfo> memory_selection;
         private Dictionary<TrackInfo, EditorTrackInfo> edit_map = new Dictionary<TrackInfo, EditorTrackInfo> ();
         private int current_track_index;
-        
+
         protected void LoadTrackModel (TrackListModel model)
         {
             DatabaseTrackListModel db_model = model as DatabaseTrackListModel;
@@ -348,7 +348,7 @@ namespace Banshee.Gui.TrackEditor
                 }
             }
         }
-        
+
         public void LoadTrackToEditor ()
         {
             TrackInfo current_track = null;
@@ -356,17 +356,17 @@ namespace Banshee.Gui.TrackEditor
             if (editor_track == null) {
                 return;
             }
-            
+
             // Update the Header
             header_title_label.Text = current_track.DisplayTrackTitle;
             header_artist_label.Text = current_track.DisplayArtistName;
             header_album_label.Text = current_track.DisplayAlbumTitle;
-            
+
             if (edit_notif_label != null) {
-                edit_notif_label.Markup = String.Format (Catalog.GetString ("<i>Editing {0} of {1} items</i>"), 
+                edit_notif_label.Markup = String.Format (Catalog.GetString ("<i>Editing {0} of {1} items</i>"),
                     CurrentTrackIndex + 1, TrackCount);
             }
-            
+
             ArtworkManager artwork = ServiceManager.Get<ArtworkManager> ();
             Gdk.Pixbuf cover_art = artwork.LookupScalePixbuf (current_track.ArtworkId, 64);
             header_image.Pixbuf = cover_art;
@@ -377,21 +377,21 @@ namespace Banshee.Gui.TrackEditor
             } else {
                 header_image_frame.ShadowType = ShadowType.In;
             }
-            
+
             // Disconnect all the undo adapters
             ForeachWidget<ICanUndo> (delegate (ICanUndo undoable) {
                 undoable.DisconnectUndo ();
             });
-            
+
             foreach (ITrackEditorPage page in pages) {
                 page.LoadTrack (editor_track);
             }
-            
+
             // Connect all the undo adapters
             ForeachWidget<ICanUndo> (delegate (ICanUndo undoable) {
                 undoable.ConnectUndo (editor_track);
             });
-            
+
             // Update Navigation
             if (TrackCount > 0 && nav_backward_button != null && nav_forward_button != null) {
                 nav_backward_button.Sensitive = CanGoBackward;
@@ -418,55 +418,55 @@ namespace Banshee.Gui.TrackEditor
                 if (i == current_track_index) {
                     continue;
                 }
-                
+
                 EditorTrackInfo track = LoadTrack (i);
                 if (track != null) {
                     closure (track);
                 }
             }
         }
-        
+
         public EditorTrackInfo LoadTrack (int index)
         {
             return LoadTrack (index, true);
         }
-        
+
         public EditorTrackInfo LoadTrack (int index, bool alwaysLoad)
         {
             TrackInfo source_track;
             return LoadTrack (index, alwaysLoad, out source_track);
         }
-        
+
         private EditorTrackInfo LoadTrack (int index, out TrackInfo sourceTrack)
         {
             return LoadTrack (index, true, out sourceTrack);
         }
-        
+
         private EditorTrackInfo LoadTrack (int index, bool alwaysLoad, out TrackInfo sourceTrack)
         {
             sourceTrack = GetTrack (index);
             EditorTrackInfo editor_track = null;
-            
+
             if (sourceTrack == null) {
                 // Something bad happened here
                 return null;
             }
-            
+
             if (!edit_map.TryGetValue (sourceTrack, out editor_track) && alwaysLoad) {
                 editor_track = new EditorTrackInfo (sourceTrack);
                 editor_track.EditorIndex = index;
                 editor_track.EditorCount = TrackCount;
                 edit_map.Add (sourceTrack, editor_track);
             }
-            
+
             return editor_track;
         }
-        
+
         private TrackInfo GetTrack (int index)
         {
             return db_selection != null ? db_selection[index] : memory_selection[index];
         }
-        
+
         protected virtual void OnNavigated ()
         {
             EventHandler handler = Navigated;
@@ -474,7 +474,7 @@ namespace Banshee.Gui.TrackEditor
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void NavigateForward ()
         {
             if (current_track_index < TrackCount - 1) {
@@ -483,7 +483,7 @@ namespace Banshee.Gui.TrackEditor
                 OnNavigated ();
             }
         }
-        
+
         public void NavigateBackward ()
         {
             if (current_track_index > 0) {
@@ -492,19 +492,19 @@ namespace Banshee.Gui.TrackEditor
                 OnNavigated ();
             }
         }
-        
+
         public int TrackCount {
             get { return db_selection != null ? db_selection.Count : memory_selection.Count; }
         }
-        
+
         public int CurrentTrackIndex {
             get { return current_track_index; }
         }
-        
+
         public bool CanGoBackward {
             get { return current_track_index > 0; }
         }
-        
+
         public bool CanGoForward {
             get { return current_track_index >= 0 && current_track_index < TrackCount - 1; }
         }
@@ -516,7 +516,7 @@ namespace Banshee.Gui.TrackEditor
         public void Save ()
         {
             List<int> primary_sources = new List<int> ();
-            
+
             // TODO: wrap in db transaction
             try {
                 DatabaseTrackInfo.NotifySaved = false;
@@ -527,9 +527,9 @@ namespace Banshee.Gui.TrackEditor
                     if (track == null || track.SourceTrack == null) {
                         continue;
                     }
-                    
+
                     SaveTrack (track);
-                    
+
                     if (track.SourceTrack is DatabaseTrackInfo) {
                         // If the source track is from the database, save its parent for notification later
                         int id = (track.SourceTrack as DatabaseTrackInfo).PrimarySourceId;
@@ -550,18 +550,18 @@ namespace Banshee.Gui.TrackEditor
                 DatabaseTrackInfo.NotifySaved = true;
             }
         }
-        
+
         private void SaveTrack (EditorTrackInfo track)
         {
             TrackInfo.ExportableMerge (track, track.SourceTrack);
             track.SourceTrack.Save ();
-                
+
             if (track.SourceTrack.TrackEqual (ServiceManager.PlayerEngine.CurrentTrack)) {
                 TrackInfo.ExportableMerge (track, ServiceManager.PlayerEngine.CurrentTrack);
                 ServiceManager.PlayerEngine.TrackInfoUpdated ();
             }
         }
-        
+
 #endregion
 
 #region Static Helpers
@@ -570,12 +570,12 @@ namespace Banshee.Gui.TrackEditor
         {
             Run (model, EditorMode.Edit);
         }
-        
+
         public static void RunView (TrackListModel model)
         {
             Run (model, EditorMode.View);
         }
-        
+
         public static void Run (TrackListModel model, EditorMode mode)
         {
             TrackEditorDialog track_editor = new TrackEditorDialog (model, mode);
@@ -593,23 +593,23 @@ namespace Banshee.Gui.TrackEditor
                             }
                         }
                     }
-                    
+
                     if (changed_count == 0) {
                         track_editor.Destroy ();
                         return;
                     }
-                
+
                     HigMessageDialog message_dialog = new HigMessageDialog (
-                        track_editor, DialogFlags.Modal, MessageType.Warning, ButtonsType.None, 
-                        
+                        track_editor, DialogFlags.Modal, MessageType.Warning, ButtonsType.None,
+
                         String.Format (Catalog.GetPluralString (
                             "Save the changes made to the open track?",
                             "Save the changes made to {0} of {1} open tracks?",
                             track_editor.TrackCount), changed_count, track_editor.TrackCount),
-                            
+
                         String.Empty
                     );
-                    
+
                     UpdateCancelMessage (track_editor, message_dialog);
                     uint timeout = 0;
                     timeout = GLib.Timeout.Add (1000, delegate {
@@ -619,11 +619,11 @@ namespace Banshee.Gui.TrackEditor
                         }
                         return result;
                     });
-                    
+
                     message_dialog.AddButton (Catalog.GetString ("Close _without Saving"), ResponseType.Close, false);
                     message_dialog.AddButton (Stock.Cancel, ResponseType.Cancel, false);
                     message_dialog.AddButton (Stock.Save, ResponseType.Ok, true);
-                    
+
                     try {
                         switch ((ResponseType)message_dialog.Run ()) {
                             case ResponseType.Ok:
@@ -642,29 +642,29 @@ namespace Banshee.Gui.TrackEditor
                         message_dialog.Destroy ();
                     }
                 }
-                
+
                 track_editor.Destroy ();
             };
-            
+
             track_editor.Run ();
         }
-        
+
         private static bool UpdateCancelMessage (TrackEditorDialog trackEditor, HigMessageDialog messageDialog)
         {
             if (messageDialog == null) {
                 return false;
             }
-            
+
             messageDialog.MessageLabel.Text = String.Format (Catalog.GetString (
                 "If you don't save, changes from the last {0} will be permanently lost."),
                 Banshee.Sources.DurationStatusFormatters.ApproximateVerboseFormatter (
                     DateTime.Now - trackEditor.dialog_launch_datetime
                 )
             );
-            
+
             return messageDialog.IsMapped;
         }
-    
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ArtworkPopup.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ArtworkPopup.cs
index 5db1e20..69dadf6 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ArtworkPopup.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ArtworkPopup.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ArtworkPopup.cs
 //
 // Author:
@@ -36,38 +36,38 @@ namespace Banshee.Gui.Widgets
     {
         private Gtk.Image image;
         private Label label;
-        
+
         public ArtworkPopup() : base(Gtk.WindowType.Popup)
         {
             VBox vbox = new VBox();
             Add(vbox);
-            
+
             Decorated = false;
             BorderWidth = 6;
-            
+
             SetPosition(WindowPosition.CenterAlways);
-           
+
             image = new Gtk.Image();
             label = new Label(String.Empty);
             label.CanFocus = false;
             label.Wrap = true;
-            
+
             label.ModifyBg(StateType.Normal, new Color(0, 0, 0));
             label.ModifyFg(StateType.Normal, new Color(160, 160, 160));
             ModifyBg(StateType.Normal, new Color(0, 0, 0));
             ModifyFg(StateType.Normal, new Color(160, 160, 160));
-            
+
             vbox.PackStart(image, true, true, 0);
             vbox.PackStart(label, false, false, 0);
-            
+
             vbox.Spacing = 6;
             vbox.ShowAll();
         }
-        
+
         public Pixbuf Image {
             set {
                 int width = value.Width, height = value.Height;
-                
+
                 if(height >= Screen.Height * 0.75) {
                     width = (int)(width * ((Screen.Height * 0.75) / height));
                     height = (int)(Screen.Height * 0.75);
@@ -83,22 +83,22 @@ namespace Banshee.Gui.Widgets
                 } else {
                     image.Pixbuf = value;
                 }
-                
+
                 image.SetSizeRequest(image.Pixbuf.Width, image.Pixbuf.Height);
                 label.SetSizeRequest(-1, -1);
-                    
+
                 int text_w, text_h;
                 label.Layout.GetPixelSize(out text_w, out text_h);
                 if(image.Pixbuf.Width < text_w) {
                     label.SetSizeRequest(image.Pixbuf.Width, -1);
-                } 
-                
+                }
+
                 Resize(1, 1);
             }
-            
+
             get { return image.Pixbuf; }
         }
-        
+
         public string Label {
             set {
                 try {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ClassicTrackInfoDisplay.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ClassicTrackInfoDisplay.cs
index 2d6333b..a0566f2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ClassicTrackInfoDisplay.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ClassicTrackInfoDisplay.cs
@@ -40,34 +40,34 @@ namespace Banshee.Gui.Widgets
     public class ClassicTrackInfoDisplay : TrackInfoDisplay
     {
         private Gdk.Window event_window;
-        
+
         private ArtworkPopup popup;
         private uint popup_timeout_id;
         private bool in_popup;
         private bool in_thumbnail_region;
         private Pango.Layout first_line_layout;
         private Pango.Layout second_line_layout;
-        
+
         public ClassicTrackInfoDisplay () : base ()
         {
         }
-        
+
         protected ClassicTrackInfoDisplay (IntPtr native) : base (native)
         {
         }
-        
+
         public override void Dispose ()
         {
             base.Dispose ();
             HidePopup ();
         }
-        
+
 #region Widget Window Management
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
-            
+
             WindowAttr attributes = new WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
             attributes.X = Allocation.X;
@@ -80,25 +80,25 @@ namespace Banshee.Gui.Widgets
                 EventMask.EnterNotifyMask |
                 EventMask.LeaveNotifyMask |
                 EventMask.ExposureMask);
-            
+
             WindowAttributesType attributes_mask =
                 WindowAttributesType.X | WindowAttributesType.Y | WindowAttributesType.Wmclass;
-            
+
             event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask);
             event_window.UserData = Handle;
         }
-        
+
         protected override void OnUnrealized ()
         {
             WidgetFlags ^= WidgetFlags.Realized;
-            
+
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
             event_window = null;
-            
+
             base.OnUnrealized ();
         }
-        
+
         protected override void OnMapped ()
         {
             event_window.Show ();
@@ -110,21 +110,21 @@ namespace Banshee.Gui.Widgets
             event_window.Hide ();
             base.OnUnmapped ();
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             if (IsRealized) {
                 event_window.MoveResize (allocation);
             }
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             requisition.Height = ComputeWidgetHeight ();
         }
-        
+
         private int ComputeWidgetHeight ()
         {
             int width, height;
@@ -134,14 +134,14 @@ namespace Banshee.Gui.Widgets
             layout.Dispose ();
             return 2 * height;
         }
-        
+
         protected override void OnThemeChanged ()
         {
             if (first_line_layout != null) {
                 first_line_layout.Dispose ();
                 first_line_layout = null;
             }
-            
+
             if (second_line_layout != null) {
                 second_line_layout.Dispose ();
                 second_line_layout = null;
@@ -149,15 +149,15 @@ namespace Banshee.Gui.Widgets
         }
 
 #endregion
-        
+
 #region Drawing
-        
+
         protected override void RenderTrackInfo (Context cr, TrackInfo track, bool renderTrack, bool renderArtistAlbum)
         {
             if (track == null) {
                 return;
             }
-            
+
             double offset = Allocation.Height + 10, y = 0;
             double x = Allocation.X + offset;
             double width = Allocation.Width - offset;
@@ -168,7 +168,7 @@ namespace Banshee.Gui.Widgets
                 first_line_layout = CairoExtensions.CreateLayout (this, cr);
                 first_line_layout.Ellipsize = Pango.EllipsizeMode.End;
             }
-            
+
             if (second_line_layout == null) {
                 second_line_layout = CairoExtensions.CreateLayout (this, cr);
                 second_line_layout.Ellipsize = Pango.EllipsizeMode.End;
@@ -177,22 +177,22 @@ namespace Banshee.Gui.Widgets
             // Set up the text layouts
             first_line_layout.Width = pango_width;
             second_line_layout.Width = pango_width;
-            
+
             // Compute the layout coordinates
             first_line_layout.SetMarkup (GetFirstLineText (track));
             first_line_layout.GetPixelSize (out fl_width, out fl_height);
             second_line_layout.SetMarkup (GetSecondLineText (track));
             second_line_layout.GetPixelSize (out sl_width, out sl_height);
-            
+
             if (fl_height + sl_height > Allocation.Height) {
                 SetSizeRequest (-1, fl_height + sl_height);
             }
-            
+
             y = Allocation.Y + (Allocation.Height - (fl_height + sl_height)) / 2;
-            
+
             // Render the layouts
             cr.Antialias = Cairo.Antialias.Default;
-            
+
             if (renderTrack) {
                 cr.MoveTo (x, y);
                 cr.Color = TextColor;
@@ -202,11 +202,11 @@ namespace Banshee.Gui.Widgets
             if (!renderArtistAlbum) {
                 return;
             }
-            
+
             cr.MoveTo (x, y + fl_height);
             PangoCairoHelper.ShowLayout (cr, second_line_layout);
         }
-        
+
 #endregion
 
 #region Interaction Events
@@ -216,30 +216,30 @@ namespace Banshee.Gui.Widgets
             in_thumbnail_region = evnt.X <= Allocation.Height;
             return ShowHideCoverArt ();
         }
-        
+
         protected override bool OnLeaveNotifyEvent (EventCrossing evnt)
         {
             in_thumbnail_region = false;
             return ShowHideCoverArt ();
         }
-        
+
         protected override bool OnMotionNotifyEvent (EventMotion evnt)
         {
             in_thumbnail_region = evnt.X <= Allocation.Height;
             return ShowHideCoverArt ();
         }
-        
+
         private void OnPopupEnterNotifyEvent (object o, EnterNotifyEventArgs args)
         {
             in_popup = true;
         }
-        
+
         private void OnPopupLeaveNotifyEvent (object o, LeaveNotifyEventArgs args)
         {
             in_popup = false;
             HidePopup ();
         }
-        
+
         private bool ShowHideCoverArt ()
         {
             if (!in_thumbnail_region) {
@@ -247,7 +247,7 @@ namespace Banshee.Gui.Widgets
                     GLib.Source.Remove (popup_timeout_id);
                     popup_timeout_id = 0;
                 }
-                
+
                 GLib.Timeout.Add (100, delegate {
                     if (!in_popup) {
                         HidePopup ();
@@ -259,17 +259,17 @@ namespace Banshee.Gui.Widgets
                 if (popup_timeout_id > 0) {
                     return false;
                 }
-                
+
                 popup_timeout_id = GLib.Timeout.Add (500, delegate {
                     if (in_thumbnail_region) {
                         UpdatePopup ();
                     }
-                    
+
                     popup_timeout_id = 0;
                     return false;
                 });
             }
-            
+
             return true;
         }
 
@@ -288,31 +288,31 @@ namespace Banshee.Gui.Widgets
                 HidePopup ();
                 return false;
             }
-            
+
             Gdk.Pixbuf pixbuf = ArtworkManager.LookupPixbuf (CurrentTrack.ArtworkId);
-         
+
             if (pixbuf == null) {
                 HidePopup ();
                 return false;
             }
-            
+
             if (popup == null) {
                 popup = new ArtworkPopup ();
                 popup.EnterNotifyEvent += OnPopupEnterNotifyEvent;
                 popup.LeaveNotifyEvent += OnPopupLeaveNotifyEvent;
             }
-            
-            popup.Label = String.Format ("{0} - {1}", CurrentTrack.DisplayArtistName, 
+
+            popup.Label = String.Format ("{0} - {1}", CurrentTrack.DisplayArtistName,
                 CurrentTrack.DisplayAlbumTitle);
             popup.Image = pixbuf;
-                
+
             if (in_thumbnail_region) {
                 popup.Show ();
             }
-            
+
             return true;
         }
-        
+
         private void HidePopup ()
         {
             if (popup != null) {
@@ -323,7 +323,7 @@ namespace Banshee.Gui.Widgets
                 popup = null;
             }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs
index 040c849..2ab6432 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedMessageBar.cs
@@ -42,66 +42,66 @@ namespace Banshee.Gui.Widgets
     public class ConnectedMessageBar : MessageBar
     {
         private Source source;
-        
+
         private class ActionButton : Button
         {
             private MessageAction action;
-            
+
             public ActionButton (MessageAction action) : base (action.Label)
             {
                 this.action = action;
             }
-            
+
             protected override void OnClicked ()
             {
                 action.Activate ();
             }
         }
-        
+
         public ConnectedMessageBar ()
         {
             CloseClicked += OnCloseClicked;
             ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
             ConnectSource (ServiceManager.SourceManager.ActiveSource);
-            
+
             LeftPadding = 15;
         }
-        
+
         private void ConnectSource (Source source)
         {
             if (source == this.source)
                 return;
 
             this.source = source;
-            
+
             if (this.source != null) {
                 this.source.MessageNotify += OnSourceMessageNotify;
                 Update ();
             }
         }
-        
+
         private void Update ()
         {
             ThreadAssist.ProxyToMain (InnerUpdate);
         }
-        
+
         private void InnerUpdate ()
         {
             if (source == null || source.CurrentMessage == null || source.CurrentMessage.IsHidden) {
                 Hide ();
                 return;
             }
-            
+
             Message = source.CurrentMessage.Text;
             Pixbuf = null;
             ShowCloseButton = source.CurrentMessage.CanClose;
             Spinning = source.CurrentMessage.IsSpinning;
-            
+
             Pixbuf = source.CurrentMessage.IconNames == null ? null :
                 IconThemeUtils.LoadIcon (22, source.CurrentMessage.IconNames);
-            
+
             ClearButtons ();
-            
+
             if (source.CurrentMessage.Actions != null) {
                 foreach (MessageAction action in source.CurrentMessage.Actions) {
                     Button button = new ActionButton (action);
@@ -109,24 +109,24 @@ namespace Banshee.Gui.Widgets
                     AddButton (button);
                 }
             }
-            
+
             Show ();
         }
-        
+
         private void OnCloseClicked (object o, EventArgs args)
         {
             source.CurrentMessage.IsHidden = true;
         }
-        
+
         private void OnActiveSourceChanged (SourceEventArgs args)
         {
             if (source != null && source != args.Source) {
                 source.MessageNotify -= OnSourceMessageNotify;
             }
-            
+
             ConnectSource (args.Source);
         }
-        
+
         private void OnSourceMessageNotify (object o, EventArgs args)
         {
             Update ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedSeekSlider.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedSeekSlider.cs
index 19366d2..b30fad7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedSeekSlider.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedSeekSlider.cs
@@ -38,34 +38,34 @@ namespace Banshee.Gui.Widgets
     public enum SeekSliderLayout {
         Horizontal,
         Vertical
-    }   
+    }
 
     public class ConnectedSeekSlider : Alignment
     {
         private SeekSlider seek_slider;
         private StreamPositionLabel stream_position_label;
-    
+
         public ConnectedSeekSlider () : this (SeekSliderLayout.Vertical)
         {
         }
-    
+
         public ConnectedSeekSlider (SeekSliderLayout layout) : base (0.0f, 0.0f, 1.0f, 1.0f)
         {
             RightPadding = 10;
             LeftPadding = 10;
-            
+
             BuildSeekSlider (layout);
-            
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.Iterate | 
+
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
+                PlayerEvent.Iterate |
                 PlayerEvent.Buffering |
                 PlayerEvent.StartOfStream |
                 PlayerEvent.StateChange);
-                
+
             ServiceManager.PlayerEngine.TrackIntercept += OnTrackIntercept;
-            
+
             seek_slider.SeekRequested += OnSeekRequested;
-            
+
             // Initialize the display if we're paused since we won't get any
             // events or state change until something actually happens (BGO #536564)
             if (ServiceManager.PlayerEngine.CurrentState == PlayerState.Paused) {
@@ -84,18 +84,18 @@ namespace Banshee.Gui.Widgets
         public StreamPositionLabel StreamPositionLabel {
             get { return stream_position_label; }
         }
-        
+
         public SeekSlider SeekSlider {
             get { return seek_slider; }
         }
-        
+
         private void BuildSeekSlider (SeekSliderLayout layout)
-        {            
+        {
             seek_slider = new SeekSlider ();
             stream_position_label = new StreamPositionLabel (seek_slider);
-         
+
             Box box;
-            
+
             if (layout == SeekSliderLayout.Horizontal) {
                 box = new HBox ();
                 box.Spacing = 5;
@@ -103,24 +103,24 @@ namespace Banshee.Gui.Widgets
             } else {
                 box = new VBox ();
             }
-            
+
             seek_slider.SetSizeRequest (125, -1);
-                     
+
             box.PackStart (seek_slider, true, true, 0);
             box.PackStart (stream_position_label, false, false, 0);
-            
+
             box.ShowAll ();
-            
+
             Add (box);
         }
-        
+
         private bool transitioning = false;
         private bool OnTrackIntercept (Banshee.Collection.TrackInfo track)
         {
             transitioning = true;
             return false;
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
@@ -137,7 +137,7 @@ namespace Banshee.Gui.Widgets
                         stream_position_label.StreamState = StreamLabelState.Playing;
                         break;
                     }
-                    
+
                     stream_position_label.StreamState = StreamLabelState.Buffering;
                     stream_position_label.BufferingProgress = buffering.Progress;
                     seek_slider.Sensitive = false;
@@ -178,19 +178,19 @@ namespace Banshee.Gui.Widgets
             if (ServiceManager.PlayerEngine == null) {
                 return;
             }
-            
+
             Banshee.Collection.TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
             stream_position_label.IsLive = track == null ? false : track.IsLive;
             seek_slider.Duration = ServiceManager.PlayerEngine.Length;
-            
+
             if (stream_position_label.StreamState != StreamLabelState.Buffering) {
                 stream_position_label.StreamState = StreamLabelState.Playing;
                 seek_slider.SeekValue = ServiceManager.PlayerEngine.Position;
             }
-            
+
             seek_slider.CanSeek = ServiceManager.PlayerEngine.CanSeek;
         }
-        
+
         private void OnSeekRequested (object o, EventArgs args)
         {
             ServiceManager.PlayerEngine.Position = (uint)seek_slider.Value;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedVolumeButton.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedVolumeButton.cs
index 166a128..c34ddf4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedVolumeButton.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/ConnectedVolumeButton.cs
@@ -36,34 +36,34 @@ namespace Banshee.Gui.Widgets
     public class ConnectedVolumeButton : Bacon.VolumeButton
     {
         private bool emit_lock = false;
-        
+
         public ConnectedVolumeButton () : base ()
         {
             Volume = PlayerEngineService.VolumeSchema.Get ();
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.Volume);
         }
-        
+
         public ConnectedVolumeButton (bool classic) : this ()
         {
             Classic = classic;
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             emit_lock = true;
             Volume = ServiceManager.PlayerEngine.Volume;
             emit_lock = false;
         }
-        
+
         protected override void OnVolumeChanged ()
         {
             if (emit_lock) {
                 return;
             }
-            
+
             ServiceManager.PlayerEngine.Volume = (ushort)Volume;
             PlayerEngineService.VolumeSchema.Set(Volume);
-            
+
             base.OnVolumeChanged ();
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/LargeTrackInfoDisplay.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/LargeTrackInfoDisplay.cs
index c665b7e..3511316 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/LargeTrackInfoDisplay.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/LargeTrackInfoDisplay.cs
@@ -46,27 +46,27 @@ namespace Banshee.Gui.Widgets
         private Pango.Layout first_line_layout;
         private Pango.Layout second_line_layout;
         private Pango.Layout third_line_layout;
-    
+
         public LargeTrackInfoDisplay ()
         {
         }
-        
+
         protected LargeTrackInfoDisplay (IntPtr native) : base (native)
         {
         }
-        
+
         protected override int MissingIconSizeRequest {
             get { return 128; }
         }
-        
+
         protected virtual int MaxArtworkSize {
             get { return 300; }
         }
-        
+
         protected virtual int Spacing {
             get { return 30; }
         }
-        
+
         protected override int ArtworkSizeRequest {
             get { return Math.Min (Math.Min (Allocation.Height, Allocation.Width), MaxArtworkSize); }
         }
@@ -80,7 +80,7 @@ namespace Banshee.Gui.Widgets
                 return new Gdk.Rectangle (x, y, width, height);
             }
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
@@ -93,24 +93,24 @@ namespace Banshee.Gui.Widgets
                 first_line_layout.Dispose ();
                 first_line_layout = null;
             }
-            
+
             if (second_line_layout != null) {
                 second_line_layout.Dispose ();
                 second_line_layout = null;
             }
-            
+
             if (third_line_layout != null) {
                 third_line_layout.Dispose ();
                 third_line_layout = null;
             }
         }
-       
+
         protected override void RenderCoverArt (Cairo.Context cr, ImageSurface image)
         {
             if (image == null) {
                 return;
             }
-            
+
             Gdk.Rectangle alloc = RenderAllocation;
             int asr = ArtworkSizeRequest;
             int reflect = (int)(image.Height * 0.2);
@@ -118,7 +118,7 @@ namespace Banshee.Gui.Widgets
             int surface_h = image.Height + reflect;
             int x = alloc.X + alloc.Width - asr;
             int y = alloc.Y;
-            
+
             Surface scene = null;
             if (!surfaces.TryGetValue (image, out scene)) {
                 scene = CreateScene (cr, image, reflect);
@@ -128,53 +128,53 @@ namespace Banshee.Gui.Widgets
             cr.Rectangle (x, y, asr, alloc.Height);
             cr.Color = BackgroundColor;
             cr.Fill ();
-            
+
             x += (asr - surface_w) / 2;
             y += surface_h > asr ? 0 : (asr - surface_h) / 2;
-            
+
             cr.SetSource (scene, x, y);
             cr.Paint ();
         }
-        
+
         private Surface CreateScene (Cairo.Context window_cr, ImageSurface image, int reflect)
         {
-            Surface surface = window_cr.Target.CreateSimilar (window_cr.Target.Content, 
+            Surface surface = window_cr.Target.CreateSimilar (window_cr.Target.Content,
                 image.Width, image.Height + reflect);
             Cairo.Context cr = new Context (surface);
-            
+
             cr.Save ();
-            
+
             cr.SetSource (image);
             cr.Paint ();
-            
+
             cr.Rectangle (0, image.Height, image.Width, reflect);
             cr.Clip ();
-            
+
             Matrix matrix = new Matrix ();
             matrix.InitScale (1, -1);
             matrix.Translate (0, -(2 * image.Height) + 1);
             cr.Transform (matrix);
-            
+
             cr.SetSource (image);
             cr.Paint ();
-            
+
             cr.Restore ();
-            
+
             Color bg_transparent = BackgroundColor;
             bg_transparent.A = 0.65;
-            
+
             LinearGradient mask = new LinearGradient (0, image.Height, 0, image.Height + reflect);
             mask.AddColorStop (0, bg_transparent);
             mask.AddColorStop (1, BackgroundColor);
-            
+
             cr.Rectangle (0, image.Height, image.Width, reflect);
             cr.Pattern = mask;
             cr.Fill ();
-            
+
             ((IDisposable)cr).Dispose ();
             return surface;
         }
-        
+
         protected override void RenderTrackInfo (Context cr, TrackInfo track, bool renderTrack, bool renderArtistAlbum)
         {
             if (track == null) {
@@ -187,7 +187,7 @@ namespace Banshee.Gui.Widgets
             int pango_width = (int)(width * Pango.Scale.PangoScale);
 
             string first_line = GetFirstLineText (track);
-            
+
             // FIXME: This is incredibly bad, but we don't want to break
             // translations right now. It needs to be replaced for 1.4!!
             string line = GetSecondLineText (track);
@@ -197,7 +197,7 @@ namespace Banshee.Gui.Widgets
                 // Check that there are at least 3 spans in the string, else this
                 // will break for tracks with missing artist or album info.
                 && StringUtil.SubstringCount (line, "<span") >= 3) {
-                
+
                 second_line = line.Substring (0, Math.Max (0, split_pos - 1)) + "</span>";
                 third_line = String.Format ("<span color=\"{0}\">{1}",
                     CairoExtensions.ColorGetHex (TextColor, false),
@@ -208,17 +208,17 @@ namespace Banshee.Gui.Widgets
                 first_line_layout = CairoExtensions.CreateLayout (this, cr);
                 first_line_layout.Ellipsize = Pango.EllipsizeMode.End;
                 first_line_layout.Alignment = Pango.Alignment.Right;
-                
+
                 int base_size = first_line_layout.FontDescription.Size;
                 first_line_layout.FontDescription.Size = (int)(base_size * Pango.Scale.XLarge);
             }
-            
+
             if (second_line_layout == null) {
                 second_line_layout = CairoExtensions.CreateLayout (this, cr);
                 second_line_layout.Ellipsize = Pango.EllipsizeMode.End;
                 second_line_layout.Alignment = Pango.Alignment.Right;
             }
-            
+
             if (third_line_layout == null) {
                 third_line_layout = CairoExtensions.CreateLayout (this, cr);
                 third_line_layout.Ellipsize = Pango.EllipsizeMode.End;
@@ -229,7 +229,7 @@ namespace Banshee.Gui.Widgets
             first_line_layout.Width = pango_width;
             second_line_layout.Width = pango_width;
             third_line_layout.Width = pango_width;
-            
+
             // Compute the layout coordinates
             first_line_layout.SetMarkup (first_line);
             first_line_layout.GetPixelSize (out fl_width, out fl_height);
@@ -245,7 +245,7 @@ namespace Banshee.Gui.Widgets
 
             // Render the layouts
             cr.Antialias = Cairo.Antialias.Default;
-            
+
             if (renderTrack) {
                 cr.MoveTo (text_alloc.X, text_alloc.Y);
                 cr.Color = TextColor;
@@ -255,14 +255,14 @@ namespace Banshee.Gui.Widgets
             if (!renderArtistAlbum) {
                 return;
             }
-            
+
             cr.MoveTo (text_alloc.X, text_alloc.Y + fl_height);
             PangoCairoHelper.ShowLayout (cr, second_line_layout);
-            
+
             cr.MoveTo (text_alloc.X, text_alloc.Y + fl_height + sl_height);
             PangoCairoHelper.ShowLayout (cr, third_line_layout);
         }
-        
+
         protected override void Invalidate ()
         {
             if (CurrentImage == null || CurrentTrack == null || IncomingImage == null || IncomingTrack == null) {
@@ -270,17 +270,17 @@ namespace Banshee.Gui.Widgets
             } else {
                 Gdk.Rectangle alloc = RenderAllocation;
                 QueueDrawArea (text_alloc.X, text_alloc.Y, text_alloc.Width, text_alloc.Height);
-                QueueDrawArea (alloc.X + text_alloc.Width + Spacing, alloc.Y, 
+                QueueDrawArea (alloc.X + text_alloc.Width + Spacing, alloc.Y,
                     alloc.Width - text_alloc.Width - Spacing, alloc.Height);
             }
         }
-        
+
         protected override void InvalidateCache ()
         {
             foreach (Surface surface in surfaces.Values) {
                 ((IDisposable)surface).Dispose ();
             }
-            
+
             surfaces.Clear ();
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/MainMenu.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/MainMenu.cs
index 578cbc1..2c71331 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/MainMenu.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/MainMenu.cs
@@ -39,15 +39,15 @@ namespace Banshee.Gui.Widgets
         public MainMenu ()
         {
             InterfaceActionService interface_service = ServiceManager.Get<InterfaceActionService> ();
-            
+
             MenuShell menu = (MenuShell)interface_service.UIManager.GetWidget ("/MainMenu");
-            
+
             ((PlaybackRepeatActions)interface_service.FindActionGroup ("PlaybackRepeat")).AttachSubmenu (
                 "/MainMenu/PlaybackMenu/RepeatMenu");
-                
+
             ((PlaybackShuffleActions)interface_service.FindActionGroup ("PlaybackShuffle")).AttachSubmenu (
                 "/MainMenu/PlaybackMenu/ShuffleMenu");
-            
+
             menu.Show ();
             PackStart (menu, true, true, 0);
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/NextButton.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/NextButton.cs
index e85d641..2e2c11f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/NextButton.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/NextButton.cs
@@ -1,4 +1,4 @@
-// 
+//
 // NextButton.cs
 //
 // Authors:
@@ -55,7 +55,9 @@ namespace Banshee.Gui.Widgets
 
         private void OnActionsChanged (object o, EventArgs args)
         {
-            menu.Sensitive = shuffle_actions.Sensitive;
+            if (!shuffle_actions.Sensitive) {
+                menu.Deactivate ();
+            }
             ToggleButton.Sensitive = shuffle_actions.Sensitive;
             if (Arrow != null) {
                 Arrow.Sensitive = shuffle_actions.Sensitive;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/PlaylistMenuItem.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/PlaylistMenuItem.cs
index 7d072ef..8d4b9f4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/PlaylistMenuItem.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/PlaylistMenuItem.cs
@@ -37,12 +37,12 @@ namespace Banshee.Gui.Widgets
     public class PlaylistMenuItem : ImageMenuItem
     {
         private PlaylistSource playlist;
-        
+
         public PlaylistMenuItem (PlaylistSource playlist) : base (playlist.Name)
         {
             this.playlist = playlist;
         }
-        
+
         public PlaylistSource Playlist {
             get { return playlist; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/RepeatActionButton.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/RepeatActionButton.cs
index eed0efc..3dea6a0 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/RepeatActionButton.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/RepeatActionButton.cs
@@ -38,27 +38,27 @@ namespace Banshee.Gui.Widgets
     public class RepeatActionButton : HBox
     {
         private PlaybackRepeatActions actions = ServiceManager.Get<InterfaceActionService> ().PlaybackActions.RepeatActions;
-        
+
         private MenuButton button;
         private HBox box = new HBox ();
         private Image image = new Image ();
         private Label label = new Label ();
-        
+
         public RepeatActionButton () : this (false)
         {
         }
-        
+
         public RepeatActionButton (bool iconOnly)
         {
             box.Spacing = 4;
             label.UseUnderline = true;
             image.IconSize = (int)IconSize.Menu;
-            
+
             box.PackStart (image, false, false, (uint)(iconOnly ? 4 : 0));
             if (!iconOnly) {
                 box.PackStart (label, true, true, 0);
             }
-            
+
             button = new MenuButton (box, actions.CreateMenu (), false);
             Add (button);
 
@@ -67,7 +67,7 @@ namespace Banshee.Gui.Widgets
 
             ShowAll ();
         }
-        
+
         private void OnActionChanged (object o, EventArgs args)
         {
             button.Sensitive = image.Sensitive = label.Sensitive = actions.Sensitive;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs
index 398b62b..ad83a4f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TaskStatusIcon.cs
@@ -1,4 +1,4 @@
-// 
+//
 // TaskStatusIcon.cs
 //
 // Author:
@@ -46,7 +46,7 @@ namespace Banshee.Gui.Widgets
     public class TaskStatusIcon : AnimatedImage
     {
         private List<Job> jobs = new List<Job> ();
-        
+
         public bool ShowOnlyBackgroundTasks { get; set; }
         public bool IntermittentVisibility { get; set; }
         public uint IntermittentVisibleTime { get; set; }
@@ -86,7 +86,7 @@ namespace Banshee.Gui.Widgets
             lock (jobs) {
                 if (jobs.Count > 0) {
                     var sb = new StringBuilder ();
-                    
+
                     sb.Append ("<b>");
                     sb.Append (GLib.Markup.EscapeText (Catalog.GetPluralString (
                         "Active Task Running", "Active Tasks Running", jobs.Count)));
@@ -114,7 +114,7 @@ namespace Banshee.Gui.Widgets
                 if (!first && task_active == value) {
                     return;
                 }
-                
+
                 first = false;
                 task_active = value;
 
@@ -145,7 +145,7 @@ namespace Banshee.Gui.Widgets
                     turn_off_id = Banshee.ServiceStack.Application.RunTimeout (IntermittentHiddenTime, TurnOff);
                 }
             }
-            
+
             turn_on_id = 0;
             return false;
         }
@@ -169,24 +169,24 @@ namespace Banshee.Gui.Widgets
         }
 
         private void AddJob (Job job)
-        {                
-            lock (jobs) {    
+        {
+            lock (jobs) {
                 if (job == null || (ShowOnlyBackgroundTasks && !job.IsBackground) || job.IsFinished) {
                     return;
                 }
-                
+
                 jobs.Add (job);
                 job.Updated += OnJobUpdated;
             }
 
             ThreadAssist.ProxyToMain (Update);
         }
-        
+
         private void OnJobAdded (Job job)
         {
             AddJob (job);
         }
-        
+
         private void RemoveJob (Job job)
         {
             lock (jobs) {
@@ -198,7 +198,7 @@ namespace Banshee.Gui.Widgets
 
             ThreadAssist.ProxyToMain (Update);
         }
-        
+
         private void OnJobRemoved (Job job)
         {
             RemoveJob (job);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
index 46e558a..41e4759 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
@@ -52,111 +52,111 @@ namespace Banshee.Gui.Widgets
         protected ArtworkManager ArtworkManager {
             get { return artwork_manager; }
         }
-        
+
         private ImageSurface current_image;
         protected ImageSurface CurrentImage {
             get { return current_image; }
         }
-        
+
         private ImageSurface incoming_image;
         protected ImageSurface IncomingImage {
             get { return incoming_image; }
         }
-        
+
         private ImageSurface missing_audio_image;
         protected ImageSurface MissingAudioImage {
-            get { return missing_audio_image ?? (missing_audio_image 
+            get { return missing_audio_image ?? (missing_audio_image
                 = PixbufImageSurface.Create (IconThemeUtils.LoadIcon (MissingIconSizeRequest, "audio-x-generic"), true)); }
         }
-        
+
         private ImageSurface missing_video_image;
         protected ImageSurface MissingVideoImage {
-            get { return missing_video_image ?? (missing_video_image 
+            get { return missing_video_image ?? (missing_video_image
                 = PixbufImageSurface.Create (IconThemeUtils.LoadIcon (MissingIconSizeRequest, "video-x-generic"), true)); }
         }
-        
+
         private Cairo.Color background_color;
         protected virtual Cairo.Color BackgroundColor {
             get { return background_color; }
         }
-        
+
         private Cairo.Color text_color;
         protected virtual Cairo.Color TextColor {
             get { return text_color; }
         }
-        
+
         private Cairo.Color text_light_color;
         protected virtual Cairo.Color TextLightColor {
             get { return text_light_color; }
         }
-        
+
         private TrackInfo current_track;
         protected TrackInfo CurrentTrack {
             get { return current_track; }
         }
-        
-        private TrackInfo incoming_track;   
+
+        private TrackInfo incoming_track;
         protected TrackInfo IncomingTrack {
             get { return incoming_track; }
         }
-        
+
         private uint idle_timeout_id = 0;
         private SingleActorStage stage = new SingleActorStage ();
 
         protected TrackInfoDisplay (IntPtr native) : base (native)
         {
         }
-        
+
         public TrackInfoDisplay ()
         {
             stage.Iteration += OnStageIteration;
-        
+
             if (ServiceManager.Contains<ArtworkManager> ()) {
                 artwork_manager = ServiceManager.Get<ArtworkManager> ();
             }
-            
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.StartOfStream | 
-                PlayerEvent.TrackInfoUpdated | 
+
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
+                PlayerEvent.StartOfStream |
+                PlayerEvent.TrackInfoUpdated |
                 PlayerEvent.StateChange);
-                
+
             WidgetFlags |= WidgetFlags.NoWindow;
         }
-        
+
         public override void Dispose ()
         {
             if (idle_timeout_id > 0) {
                 GLib.Source.Remove (idle_timeout_id);
             }
-            
+
             if (ServiceManager.PlayerEngine != null) {
                 ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
             }
-            
+
             stage.Iteration -= OnStageIteration;
             stage = null;
-            
+
             InvalidateCache ();
-            
+
             base.Dispose ();
         }
-        
+
         protected override void OnRealized ()
         {
             GdkWindow = Parent.GdkWindow;
             base.OnRealized ();
         }
-        
+
         protected override void OnUnrealized ()
         {
             base.OnUnrealized ();
             InvalidateCache ();
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             if (current_track == null) {
                 LoadCurrentTrack ();
             } else {
@@ -167,11 +167,11 @@ namespace Banshee.Gui.Widgets
         protected override void OnStyleSet (Style previous)
         {
             base.OnStyleSet (previous);
-            
+
             text_color = CairoExtensions.GdkColorToCairoColor (Style.Foreground (StateType.Normal));
             background_color = CairoExtensions.GdkColorToCairoColor (Style.Background (StateType.Normal));
             text_light_color = Hyena.Gui.Theming.GtkTheme.GetCairoTextMidColor (this);
-            
+
             if (missing_audio_image != null) {
                 ((IDisposable)missing_audio_image).Dispose ();
                 missing_audio_image = null;
@@ -181,112 +181,112 @@ namespace Banshee.Gui.Widgets
                 ((IDisposable)missing_video_image).Dispose ();
                 missing_video_image = null;
             }
-            
+
             OnThemeChanged ();
         }
-        
+
         protected virtual void OnThemeChanged ()
         {
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             bool idle = incoming_track == null && current_track == null;
             if (!Visible || !IsMapped || (idle && !CanRenderIdle)) {
                 return true;
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-            
+
             foreach (Gdk.Rectangle damage in evnt.Region.GetRectangles ()) {
                 cr.Rectangle (damage.X, damage.Y, damage.Width, damage.Height);
                 cr.Clip ();
-            
+
                 if (idle) {
                     RenderIdle (cr);
                 } else {
                     RenderAnimation (cr);
                 }
-            
+
                 cr.ResetClip ();
             }
-            
+
             CairoExtensions.DisposeContext (cr);
-            
+
             return true;
         }
 
         protected virtual bool CanRenderIdle {
             get { return false; }
         }
-        
+
         protected virtual void RenderIdle (Cairo.Context cr)
         {
         }
-        
+
         private void RenderAnimation (Cairo.Context cr)
         {
             if (stage.Actor == null) {
                 // We are not in a transition, just render
                 RenderStage (cr, current_track, current_image);
                 return;
-            } 
-            
+            }
+
             if (current_track == null) {
                 // Fade in the whole stage, nothing to fade out
                 CairoExtensions.PushGroup (cr);
                 RenderStage (cr, incoming_track, incoming_image);
                 CairoExtensions.PopGroupToSource (cr);
-                
+
                 cr.PaintWithAlpha (stage.Actor.Percent);
                 return;
             }
-            
+
             // XFade only the cover art
             RenderCoverArt (cr, incoming_image);
-            
+
             CairoExtensions.PushGroup (cr);
             RenderCoverArt (cr, current_image);
             CairoExtensions.PopGroupToSource (cr);
-            
+
             cr.PaintWithAlpha (1.0 - stage.Actor.Percent);
-            
+
             // Fade in/out the text
             bool same_artist_album = incoming_track != null ? incoming_track.ArtistAlbumEqual (current_track) : false;
             bool same_track = incoming_track != null ? incoming_track.Equals (current_track) : false;
-            
+
             if (same_artist_album) {
                 RenderTrackInfo (cr, incoming_track, same_track, true);
             }
-            
+
             if (stage.Actor.Percent <= 0.5) {
                 // Fade out old text
                 CairoExtensions.PushGroup (cr);
                 RenderTrackInfo (cr, current_track, !same_track, !same_artist_album);
                 CairoExtensions.PopGroupToSource (cr);
-               
+
                 cr.PaintWithAlpha (1.0 - (stage.Actor.Percent * 2.0));
             } else {
                 // Fade in new text
                 CairoExtensions.PushGroup (cr);
                 RenderTrackInfo (cr, incoming_track, !same_track, !same_artist_album);
                 CairoExtensions.PopGroupToSource (cr);
-                
+
                 cr.PaintWithAlpha ((stage.Actor.Percent - 0.5) * 2.0);
             }
         }
-        
+
         private void RenderStage (Cairo.Context cr, TrackInfo track, ImageSurface image)
         {
             RenderCoverArt (cr, image);
             RenderTrackInfo (cr, track, true, true);
         }
-        
+
         protected virtual void RenderCoverArt (Cairo.Context cr, ImageSurface image)
         {
-            ArtworkRenderer.RenderThumbnail (cr, image, false, Allocation.X, Allocation.Y, 
-                ArtworkSizeRequest, ArtworkSizeRequest, 
-                !IsMissingImage (image), 0, 
+            ArtworkRenderer.RenderThumbnail (cr, image, false, Allocation.X, Allocation.Y,
+                ArtworkSizeRequest, ArtworkSizeRequest,
+                !IsMissingImage (image), 0,
                 IsMissingImage (image), BackgroundColor);
         }
 
@@ -294,21 +294,21 @@ namespace Banshee.Gui.Widgets
         {
             return pb == missing_audio_image || pb == missing_video_image;
         }
-        
+
         protected virtual void InvalidateCache ()
         {
         }
-        
+
         protected abstract void RenderTrackInfo (Cairo.Context cr, TrackInfo track, bool renderTrack, bool renderArtistAlbum);
-        
+
         protected virtual int ArtworkSizeRequest {
             get { return Allocation.Height; }
         }
-        
+
         protected virtual int MissingIconSizeRequest {
             get { return 32; }
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             if (args.Event == PlayerEvent.StartOfStream) {
@@ -326,19 +326,19 @@ namespace Banshee.Gui.Widgets
                 }
             }
         }
-        
+
         private bool IdleTimeout ()
         {
-            if (ServiceManager.PlayerEngine.CurrentTrack == null || 
+            if (ServiceManager.PlayerEngine.CurrentTrack == null ||
                 ServiceManager.PlayerEngine.CurrentState == PlayerState.Idle) {
                 incoming_track = null;
                 incoming_image = null;
-                
+
                 if (stage != null && stage.Actor == null) {
                     stage.Reset ();
                 }
             }
-            
+
             idle_timeout_id = 0;
             return false;
         }
@@ -361,14 +361,14 @@ namespace Banshee.Gui.Widgets
             }
 
             incoming_track = track;
-            
+
             LoadImage (track);
 
             if (stage.Actor == null) {
                 stage.Reset ();
             }
         }
-        
+
         private void LoadImage (TrackInfo track)
         {
             ImageSurface image = artwork_manager.LookupScaleSurface (track.ArtworkId, ArtworkSizeRequest);
@@ -378,7 +378,7 @@ namespace Banshee.Gui.Widgets
             } else {
                 incoming_image = image;
             }
-            
+
             if (track == current_track) {
                 current_image = incoming_image;
             }
@@ -388,50 +388,50 @@ namespace Banshee.Gui.Widgets
         {
             incoming_image = is_video ? MissingVideoImage : MissingAudioImage;
         }
-        
+
         private double last_fps = 0.0;
-        
+
         private void OnStageIteration (object o, EventArgs args)
         {
             Invalidate ();
-            
+
             if (stage.Actor != null) {
                 last_fps = stage.Actor.FramesPerSecond;
                 return;
             }
-            
+
             InvalidateCache ();
-            
+
             if (ApplicationContext.Debugging) {
                 Log.DebugFormat ("TrackInfoDisplay RenderAnimation: {0:0.00} FPS", last_fps);
             }
-            
+
             if (current_image != null && current_image != incoming_image && !IsMissingImage (current_image)) {
                 ((IDisposable)current_image).Dispose ();
             }
-            
+
             current_image = incoming_image;
             current_track = incoming_track;
-            
+
             incoming_track = null;
-            
+
             OnArtworkChanged ();
         }
-        
+
         protected virtual void Invalidate ()
         {
             QueueDraw ();
         }
-        
+
         protected virtual void OnArtworkChanged ()
         {
         }
-        
+
         protected virtual string GetFirstLineText (TrackInfo track)
         {
             return String.Format ("<b>{0}</b>", GLib.Markup.EscapeText (track.DisplayTrackTitle));
         }
-        
+
         protected virtual string GetSecondLineText (TrackInfo track)
         {
             string markup = null;
@@ -441,7 +441,7 @@ namespace Banshee.Gui.Widgets
                 // Translators: {0} and {1} are for markup so ignore them, {2} and {3}
                 // are Podcast Name and Published Date, respectively;
                 // e.g. 'from BBtv published 7/26/2007'
-                markup = MarkupFormat (Catalog.GetString ("{0}from{1} {2} {0}published{1} {3}"), 
+                markup = MarkupFormat (Catalog.GetString ("{0}from{1} {2} {0}published{1} {3}"),
                     track.DisplayAlbumTitle, track.ReleaseDate.ToShortDateString ());
             } else if (radio_track != null && radio_track.ParentTrack != null) {
                 // This is complicated because some radio streams send tags when the song changes, and we
@@ -451,43 +451,43 @@ namespace Banshee.Gui.Widgets
                     track.ArtistName == radio_track.ParentTrack.ArtistName ? null : track.ArtistName, track.DisplayArtistName,
                     track.AlbumTitle == radio_track.ParentTrack.AlbumTitle ? null : track.AlbumTitle, track.DisplayAlbumTitle, false
                 );
-                
+
                 if (String.IsNullOrEmpty (by_from)) {
                     // simply: "Chicago Public Radio" or whatever the artist name is
                     markup = GLib.Markup.EscapeText (radio_track.ParentTrack.ArtistName ?? Catalog.GetString ("Unknown Stream"));
                 } else {
                     // Translators: {0} and {1} are markup so ignore them, {2} is the name of the radio station
                     string on = MarkupFormat (Catalog.GetString ("{0}on{1} {2}"), radio_track.ParentTrack.TrackTitle);
-                    
+
                     // Translators: {0} is the "from {album} by {artist}" type string, and {1} is the "on {radio station name}" string
                     markup = String.Format (Catalog.GetString ("{0} {1}"), by_from, on);
                 }
             } else {
                 markup = GetByFrom (track.ArtistName, track.DisplayArtistName, track.AlbumTitle, track.DisplayAlbumTitle, true);
             }
-            
-            return String.Format ("<span color=\"{0}\">{1}</span>",  
+
+            return String.Format ("<span color=\"{0}\">{1}</span>",
                 CairoExtensions.ColorGetHex (TextColor, false),
                 markup);
         }
-        
+
         private string MarkupFormat (string fmt, params string [] args)
         {
             string [] new_args = new string [args.Length + 2];
-            new_args[0] = String.Format ("<span color=\"{0}\" size=\"small\">", 
+            new_args[0] = String.Format ("<span color=\"{0}\" size=\"small\">",
                 CairoExtensions.ColorGetHex (TextLightColor, false));
             new_args[1] = "</span>";
-            
+
             for (int i = 0; i < args.Length; i++) {
                 new_args[i + 2] = GLib.Markup.EscapeText (args[i]);
             }
-            
+
             return String.Format (fmt, new_args);
         }
-        
+
         private string GetByFrom (string artist, string display_artist, string album, string display_album, bool unknown_ok)
         {
-            
+
             bool has_artist = !String.IsNullOrEmpty (artist);
             bool has_album = !String.IsNullOrEmpty (album);
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs
index 1a1eb42..d6223ad 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTile.cs
@@ -1,4 +1,4 @@
-// 
+//
 // UserJobTile.cs
 //
 // Author:
@@ -41,11 +41,11 @@ namespace Banshee.Gui.Widgets
     public class UserJobTile : Table
     {
         private Job job;
-        
+
         private string [] icon_names;
         private string title;
         private string status;
-        
+
         private Image icon;
         private Gdk.Pixbuf icon_pixbuf;
         private Label title_label;
@@ -55,66 +55,66 @@ namespace Banshee.Gui.Widgets
         private uint update_delay_id;
         private uint progress_bounce_id;
         private object tooltips;
-        
+
         Banshee.Widgets.HigMessageDialog cancel_dialog;
-        
+
         public UserJobTile (Job job) : base (3, 2, false)
         {
             this.job = job;
             this.job.Updated += OnJobUpdated;
-            
+
             BuildWidget ();
             UpdateFromJob ();
         }
-        
+
         private void BuildWidget ()
         {
             ThreadAssist.AssertInMainThread ();
             ColumnSpacing = 5;
             RowSpacing = 2;
-            
+
             icon = new Image ();
-            
+
             tooltips = TooltipSetter.CreateHost ();
             title_label = new Label ();
             title_label.Xalign = 0.0f;
             title_label.Ellipsize = Pango.EllipsizeMode.End;
-            
+
             status_label = new Label ();
             status_label.Xalign = 0.0f;
             status_label.Ellipsize = Pango.EllipsizeMode.End;
-            
+
             progress_bar = new ProgressBar ();
             progress_bar.SetSizeRequest (0, -1);
             progress_bar.Text = " ";
             progress_bar.Show ();
-            
+
             cancel_button = new Button (new Image (Stock.Stop, IconSize.Menu));
             cancel_button.Relief = ReliefStyle.None;
             cancel_button.ShowAll ();
             cancel_button.Clicked += OnCancelClicked;
-            
-            Attach (title_label, 0, 3, 0, 1, 
+
+            Attach (title_label, 0, 3, 0, 1,
                 AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-            
-            Attach (status_label, 0, 3, 1, 2, 
+
+            Attach (status_label, 0, 3, 1, 2,
                 AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
-            Attach (icon, 0, 1, 2, 3, 
+
+            Attach (icon, 0, 1, 2, 3,
                 AttachOptions.Shrink | AttachOptions.Fill,
                 AttachOptions.Shrink | AttachOptions.Fill, 0, 0);
-                
+
             Attach (progress_bar, 1, 2, 2, 3,
                 AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Shrink, 0, 0);
-                
+
             Attach (cancel_button, 2, 3, 2, 3,
                 AttachOptions.Shrink | AttachOptions.Fill,
                 AttachOptions.Shrink | AttachOptions.Fill, 0, 0);
         }
-        
+
         protected override void OnStyleSet (Style style)
         {
             base.OnStyleSet (style);
@@ -126,41 +126,41 @@ namespace Banshee.Gui.Widgets
             if (cancel_dialog != null) {
                 return;
             }
-            
+
             Window parent = null;
             if (ServiceManager.Contains<GtkElementsService> ()) {
                 parent = ServiceManager.Get<GtkElementsService> ().PrimaryWindow;
             }
-            
-            cancel_dialog = new Banshee.Widgets.HigMessageDialog (parent, 
+
+            cancel_dialog = new Banshee.Widgets.HigMessageDialog (parent,
                 DialogFlags.Modal, MessageType.Question, ButtonsType.None,
                 job.Title == null
                     ? Catalog.GetString ("Stop Operation")
                     : String.Format (Catalog.GetString ("Stop {0}"), job.Title),
-                job.CancelMessage == null 
-                    ? (job.Title == null 
+                job.CancelMessage == null
+                    ? (job.Title == null
                         ? Catalog.GetString ("This operation is still performing work. Would you like to stop it?")
                         : String.Format (Catalog.GetString (
                             "The '{0}' operation is still performing work. Would you like to stop it?"), job.Title))
                     : job.CancelMessage);
-                        
-            cancel_dialog.AddButton (job.Title == null 
+
+            cancel_dialog.AddButton (job.Title == null
                 ? Catalog.GetString ("Continue")
-                : String.Format (Catalog.GetString ("Continue {0}"), job.Title), 
+                : String.Format (Catalog.GetString ("Continue {0}"), job.Title),
                 ResponseType.No, true);
             cancel_dialog.AddButton (Stock.Stop, ResponseType.Yes, false);
             cancel_dialog.DefaultResponse = ResponseType.Cancel;
-                
+
             if (cancel_dialog.Run () == (int)ResponseType.Yes) {
                 if (job.CanCancel) {
                     ServiceManager.JobScheduler.Cancel (job);
                 }
             }
-        
+
             cancel_dialog.Destroy ();
             cancel_dialog = null;
         }
-        
+
         private void SetTitle (string new_title)
         {
             if (String.IsNullOrEmpty (new_title)) {
@@ -179,13 +179,13 @@ namespace Banshee.Gui.Widgets
             if (cancel_dialog != null && !job.CanCancel) {
                 cancel_dialog.Respond (Gtk.ResponseType.Cancel);
             }
-            
+
             if (job.IsCancelRequested) {
                 SetTitle (Catalog.GetString ("Stopping..."));
             } else if (title != job.Title) {
                 SetTitle (job.Title);
             }
-            
+
             if (status != job.Status) {
                 // If we've ever had the status in this job, don't hide it b/c that'll make
                 // the tile change width, possibly repeatedly and annoyingly
@@ -199,7 +199,7 @@ namespace Banshee.Gui.Widgets
                 }
                 status = job.Status;
             }
-            
+
             if (icon_names == null || icon_names.Length != job.IconNames.Length) {
                 UpdateIcons ();
             } else {
@@ -210,15 +210,15 @@ namespace Banshee.Gui.Widgets
                     }
                 }
             }
-            
+
             cancel_button.Sensitive = job.CanCancel && !job.IsCancelRequested;
-            
+
             if (job.Progress == 0 && progress_bounce_id > 0) {
                 return;
             }
-            
+
             progress_bar.Fraction = job.Progress;
-            
+
             if (job.Progress == 0.0 && progress_bounce_id == 0) {
                 progress_bounce_id = GLib.Timeout.Add (100, delegate {
                     progress_bar.Text = " ";
@@ -230,15 +230,15 @@ namespace Banshee.Gui.Widgets
                     GLib.Source.Remove (progress_bounce_id);
                     progress_bounce_id = 0;
                 }
-                
+
                 progress_bar.Text = String.Format("{0}%", (int)(job.Progress * 100.0));
             }
         }
-        
+
         private void UpdateIcons ()
         {
             icon_names = job.IconNames;
-            
+
             if (icon_pixbuf != null) {
                 icon_pixbuf.Dispose ();
                 icon_pixbuf = null;
@@ -248,7 +248,7 @@ namespace Banshee.Gui.Widgets
                 icon.Hide ();
                 return;
             }
-            
+
             icon_pixbuf = IconThemeUtils.LoadIcon (22, icon_names);
             if (icon_pixbuf != null) {
                 icon.Pixbuf = icon_pixbuf;
@@ -264,14 +264,14 @@ namespace Banshee.Gui.Widgets
                 icon.Show ();
             }
         }
-        
+
         private void OnJobUpdated (object o, EventArgs args)
         {
             if (update_delay_id == 0) {
                 GLib.Timeout.Add (100, UpdateFromJobTimeout);
             }
         }
-        
+
         private bool UpdateFromJobTimeout ()
         {
             UpdateFromJob ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs
index ffc1b05..105018e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/UserJobTileHost.cs
@@ -1,4 +1,4 @@
-// 
+//
 // UserJobTileHost.cs
 //
 // Author:
@@ -45,12 +45,12 @@ namespace Banshee.Gui.Widgets
         private AnimatedVBox box;
         private Dictionary<Job, UserJobTile> job_tiles = new Dictionary<Job, UserJobTile> ();
         private Dictionary<Job, DateTime> job_start_times = new Dictionary<Job, DateTime> ();
-        
+
         public UserJobTileHost () : base (0.0f, 0.0f, 1.0f, 1.0f)
         {
             Banshee.Base.ThreadAssist.AssertInMainThread ();
             LeftPadding = 4;
-            
+
             box = new AnimatedVBox ();
             box.StartPadding = 8;
             box.Spacing = 8;
@@ -74,12 +74,12 @@ namespace Banshee.Gui.Widgets
         }
 
         private void AddJob (Job job)
-        {                
-            lock (this) {    
+        {
+            lock (this) {
                 if (job == null || job.IsFinished) {
                     return;
                 }
-                
+
                 if ((job.DelayShow && job.Progress < 0.33) || !job.DelayShow) {
                     Banshee.Base.ThreadAssist.AssertInMainThread ();
                     UserJobTile tile = new UserJobTile (job);
@@ -90,7 +90,7 @@ namespace Banshee.Gui.Widgets
                 }
             }
         }
-        
+
         private void OnJobAdded (Job job)
         {
             if (job.IsBackground) {
@@ -109,7 +109,7 @@ namespace Banshee.Gui.Widgets
                 }
             });
         }
-        
+
         private void RemoveJob (Job job)
         {
             lock (this) {
@@ -122,7 +122,7 @@ namespace Banshee.Gui.Widgets
                 }
             }
         }
-        
+
         private void OnJobRemoved (Job job)
         {
             ThreadAssist.ProxyToMain (delegate {
@@ -138,7 +138,7 @@ namespace Banshee.Gui.Widgets
                             return;
                         }
                     }
-                    
+
                     RemoveJob (job);
                 }
             });
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeActionGroup.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeActionGroup.cs
index 003d1ed..20edfac 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeActionGroup.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeActionGroup.cs
@@ -54,7 +54,7 @@ namespace Banshee.Gui
             : this (ServiceManager.Get<InterfaceActionService> (), name)
         {
         }
-        
+
         public BansheeActionGroup (InterfaceActionService action_service, string name) : base (name)
         {
             this.action_service = action_service;
@@ -104,11 +104,11 @@ namespace Banshee.Gui
                 base.Add (action_entries);
             }
         }
-        
+
         public void AddImportant (params ActionEntry [] action_entries)
         {
             base.Add (action_entries);
-            
+
             foreach (ActionEntry entry in action_entries) {
                 this[entry.name].IsImportant = true;
             }
@@ -117,12 +117,12 @@ namespace Banshee.Gui
         public void AddImportant (params ToggleActionEntry [] action_entries)
         {
             base.Add (action_entries);
-            
+
             foreach (ToggleActionEntry entry in action_entries) {
                 this[entry.name].IsImportant = true;
             }
         }
-        
+
         public void Remove (string actionName)
         {
             Gtk.Action action = this[actionName];
@@ -147,7 +147,7 @@ namespace Banshee.Gui
         {
             UpdateAction (action_name, visible_and_sensitive, visible_and_sensitive);
         }
-        
+
         public void UpdateAction (string action_name, bool visible, bool sensitive)
         {
             UpdateAction (action_name, visible, sensitive, null);
@@ -180,18 +180,18 @@ namespace Banshee.Gui
                 }
             }
         }
-        
+
         public static void UpdateAction (Gtk.Action action, bool visible_and_sensitive)
         {
             UpdateAction (action, visible_and_sensitive, visible_and_sensitive);
         }
-        
+
         public static void UpdateAction (Gtk.Action action, bool visible, bool sensitive)
         {
             action.Visible = visible;
             action.Sensitive = visible && sensitive;
         }
-        
+
         protected void ShowContextMenu (string menu_name)
         {
             Gtk.Menu menu = Actions.UIManager.GetWidget (menu_name) as Menu;
@@ -208,10 +208,10 @@ namespace Banshee.Gui
                 return;
             }
 
-            menu.Show (); 
+            menu.Show ();
             menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
         }
-        
+
         public InterfaceActionService Actions {
             get { return action_service; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeDbFormatMigratorMonitor.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeDbFormatMigratorMonitor.cs
index 055e58d..418d3ec 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeDbFormatMigratorMonitor.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeDbFormatMigratorMonitor.cs
@@ -61,56 +61,56 @@ namespace Banshee.Gui
             migrator.SlowFinished -= OnMigrationSlowFinished;
             migrator = null;
         }
-        
+
         private void IterateSlow ()
         {
             while (Gtk.Application.EventsPending ()) {
                 Gtk.Application.RunIteration ();
             }
         }
-        
+
         private void OnMigrationSlowStarted (string title, string message)
         {
             lock (this) {
                 if (slow_window != null) {
                     slow_window.Destroy ();
                 }
-                
+
                 Gtk.Application.Init ();
-                
+
                 slow_window = new Gtk.Window (String.Empty);
                 slow_window.BorderWidth = 10;
                 slow_window.WindowPosition = Gtk.WindowPosition.Center;
                 slow_window.DeleteEvent += delegate (object o, Gtk.DeleteEventArgs args) {
                     args.RetVal = true;
                 };
-                
+
                 Gtk.VBox box = new Gtk.VBox ();
                 box.Spacing = 5;
-                
+
                 Gtk.Label title_label = new Gtk.Label ();
                 title_label.Xalign = 0.0f;
                 title_label.Markup = String.Format ("<b><big>{0}</big></b>",
                     GLib.Markup.EscapeText (title));
-                
+
                 Gtk.Label message_label = new Gtk.Label ();
                 message_label.Xalign = 0.0f;
                 message_label.Text = message;
                 message_label.Wrap = true;
-                
+
                 slow_progress = new Gtk.ProgressBar ();
-                
+
                 box.PackStart (title_label, false, false, 0);
                 box.PackStart (message_label, false, false, 0);
                 box.PackStart (slow_progress, false, false, 0);
-                
+
                 slow_window.Add (box);
                 slow_window.ShowAll ();
-                
+
                 IterateSlow ();
             }
         }
-        
+
         private void OnMigrationSlowPulse (object o, EventArgs args)
         {
             lock (this) {
@@ -118,7 +118,7 @@ namespace Banshee.Gui
                 IterateSlow ();
             }
         }
-        
+
         private void OnMigrationSlowFinished (object o, EventArgs args)
         {
             lock (this) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeIconFactory.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeIconFactory.cs
index 1d226ea..d80e635 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeIconFactory.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/BansheeIconFactory.cs
@@ -40,27 +40,27 @@ namespace Banshee.Gui
         public IconTheme Theme {
             get { return theme; }
         }
-    
+
         public BansheeIconFactory ()
         {
             theme = IconTheme.Default;
-        
+
             string icon_theme_path = Banshee.Base.Paths.GetInstalledDataDirectory ("icons");
             if (Directory.Exists (icon_theme_path)) {
                 Hyena.Log.DebugFormat ("Adding icon theme search path: {0}", icon_theme_path);
                 Theme.AppendSearchPath (icon_theme_path);
             }
-               
+
             AddDefault ();
         }
-        
+
         public void Add (string name)
         {
             IconSet icon_set = new IconSet ();
             IconSource source = new IconSource ();
             source.IconName = name;
             icon_set.AddSource (source);
-            
+
             Add (name, icon_set);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
index 2fb0e26..d76abee 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
@@ -47,7 +47,7 @@ namespace Banshee.Gui
         protected GtkElementsService ElementsService {
             get { return elements_service; }
         }
-        
+
         private InterfaceActionService action_service;
         protected InterfaceActionService ActionService {
             get { return action_service; }
@@ -58,21 +58,21 @@ namespace Banshee.Gui
         protected BaseClientWindow (IntPtr ptr) : base (ptr)
         {
         }
-    
+
         public BaseClientWindow (string title, string configNameSpace, int defaultWidth, int defaultHeight) : base (title)
         {
             elements_service = ServiceManager.Get<GtkElementsService> ();
             action_service = ServiceManager.Get<InterfaceActionService> ();
-            
+
             ConfigureWindow ();
 
             window_controller = new PersistentWindowController (this, configNameSpace, defaultWidth, defaultHeight, WindowPersistOptions.All);
             window_controller.Restore ();
-            
+
             elements_service.PrimaryWindow = this;
-            
+
             AddAccelGroup (action_service.UIManager.AccelGroup);
-            
+
             InitializeWindow ();
 
             try {
@@ -110,7 +110,7 @@ namespace Banshee.Gui
 		}
 
         public virtual Box ViewContainer { get { return null; } }
-        
+
         public void ToggleVisibility ()
         {
             SetVisible (!(Visible && IsActive));
@@ -128,31 +128,31 @@ namespace Banshee.Gui
                 Present ();
             }
         }
-        
+
         private void InitializeWindow ()
         {
             Initialize ();
         }
-        
+
         protected abstract void Initialize ();
 
         protected virtual void ConnectEvents ()
         {
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
                 PlayerEvent.StartOfStream |
                 PlayerEvent.TrackInfoUpdated |
                 PlayerEvent.EndOfStream);
         }
 
-        private void OnPlayerEvent (PlayerEventArgs args) 
+        private void OnPlayerEvent (PlayerEventArgs args)
         {
             UpdateTitle ();
         }
-    
+
         protected virtual void ConfigureWindow ()
         {
         }
-    
+
         protected override bool OnDeleteEvent (Gdk.Event evnt)
         {
              if (ElementsService.PrimaryWindowClose != null) {
@@ -160,7 +160,7 @@ namespace Banshee.Gui
                     return true;
                 }
             }
-            
+
             Banshee.ServiceStack.Application.Shutdown ();
             return base.OnDeleteEvent (evnt);
         }
@@ -169,14 +169,14 @@ namespace Banshee.Gui
         {
             ToggleAction fullscreen_action = (ToggleAction) ServiceManager.Get<InterfaceActionService> ().ViewActions["FullScreenAction"];
             fullscreen_action.Active = (evnt.NewWindowState & Gdk.WindowState.Fullscreen) != 0;
-            
+
             if ((evnt.NewWindowState & Gdk.WindowState.Withdrawn) == 0) {
                 window_controller.Save ();
             }
-            
+
             return base.OnWindowStateEvent (evnt);
         }
-        
+
         protected virtual void OnTitleChanged ()
         {
             EventHandler handler = TitleChanged;
@@ -184,19 +184,19 @@ namespace Banshee.Gui
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void UpdateTitle ()
         {
             TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
             if (track != null) {
                 // Translators: this is the window title when a track is playing
                 //              {0} is the track title, {1} is the artist name
-                Title = String.Format (Catalog.GetString ("{0} by {1}"), 
+                Title = String.Format (Catalog.GetString ("{0} by {1}"),
                     track.DisplayTrackTitle, track.DisplayArtistName);
             } else {
                 Title = Catalog.GetString ("Banshee Media Player");
             }
-            
+
             OnTitleChanged ();
         }
 
@@ -206,8 +206,8 @@ namespace Banshee.Gui
 
             // This forces the toolbar to look like it's just a regular part
             // of the window since the stock toolbar look makes Banshee look ugly.
-            Style.ApplyDefaultBackground (toolbar.GdkWindow, true, State, 
-                args.Event.Area, toolbar.Allocation.X, toolbar.Allocation.Y, 
+            Style.ApplyDefaultBackground (toolbar.GdkWindow, true, State,
+                args.Event.Area, toolbar.Allocation.X, toolbar.Allocation.Y,
                 toolbar.Allocation.Width, toolbar.Allocation.Height);
 
             // Manually expose all the toolbar's children
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
index e314690..2274c82 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
@@ -46,7 +46,7 @@ namespace Banshee.Gui
         {
             Add (new ActionEntry [] {
                 // Media Menu
-                new ActionEntry ("MediaMenuAction", null, 
+                new ActionEntry ("MediaMenuAction", null,
                     Catalog.GetString ("_Media"), null, null, null),
 
                 new ActionEntry ("ImportAction", Stock.Open,
@@ -63,94 +63,92 @@ namespace Banshee.Gui
                         new Banshee.Collection.RescanPipeline (ServiceManager.SourceManager.MusicLibrary);
                     }),
 
-                new ActionEntry ("OpenLocationAction", null, 
+                new ActionEntry ("OpenLocationAction", null,
                     Catalog.GetString ("Open _Location..."), "<control>L",
                     Catalog.GetString ("Open a remote location for playback"), OnOpenLocation),
-                    
+
                 new ActionEntry ("QuitAction", Stock.Quit,
                     Catalog.GetString ("_Quit"), "<control>Q",
                     Catalog.GetString ("Quit Banshee"), OnQuit),
 
                 // Edit Menu
-                new ActionEntry ("EditMenuAction", null, 
+                new ActionEntry ("EditMenuAction", null,
                     Catalog.GetString("_Edit"), null, null, null),
 
                 new ActionEntry ("PreferencesAction", Stock.Preferences,
                     Catalog.GetString ("_Preferences"), null,
                     Catalog.GetString ("Modify your personal preferences"), OnPreferences),
 
-                new ActionEntry ("ExtensionsAction", null, 
+                new ActionEntry ("ExtensionsAction", null,
                     Catalog.GetString ("Manage _Extensions"), null,
                     Catalog.GetString ("Manage extensions to add new features to Banshee"), OnExtensions),
-                
+
                 // Tools menu
                 new ActionEntry ("ToolsMenuAction", null,
                     Catalog.GetString ("_Tools"), null, null, null),
-                
+
                 // Help Menu
-                new ActionEntry ("HelpMenuAction", null, 
+                new ActionEntry ("HelpMenuAction", null,
                     Catalog.GetString ("_Help"), null, null, null),
-                
+
                 new ActionEntry ("WebMenuAction", null,
                     Catalog.GetString ("_Web Resources"), null, null, null),
-                    
+
                 new ActionEntry ("WikiGuideAction", Stock.Help,
                     Catalog.GetString ("Banshee _User Guide (Wiki)"), null,
                     Catalog.GetString ("Learn about how to use Banshee"), delegate {
                         Banshee.Web.Browser.Open ("http://banshee-project.org/support/guide/");
                     }),
-                    
+
                 new ActionEntry ("WikiSearchHelpAction", null,
                     Catalog.GetString ("Advanced Collection Searching"), null,
                     Catalog.GetString ("Learn advanced ways to search your media collection"), delegate {
                         Banshee.Web.Browser.Open ("http://banshee-project.org/support/guide/searching/");
                     }),
-                    
+
                 new ActionEntry ("WikiAction", null,
                     Catalog.GetString ("Banshee _Home Page"), null,
                     Catalog.GetString ("Visit the Banshee Home Page"), delegate {
                         Banshee.Web.Browser.Open ("http://banshee-project.org/");
                     }),
-                    
+
                 new ActionEntry ("WikiDeveloperAction", null,
                     Catalog.GetString ("_Get Involved"), null,
                     Catalog.GetString ("Become a contributor to Banshee"), delegate {
                         Banshee.Web.Browser.Open ("http://banshee-project.org/contribute/");
                     }),
-                 
+
                 new ActionEntry ("VersionInformationAction", null,
                     Catalog.GetString ("_Version Information"), null,
                     Catalog.GetString ("View detailed version and configuration information"), OnVersionInformation),
-                    
+
                 new ActionEntry("AboutAction", "gtk-about", OnAbout)
             });
-            
+
             this["ExtensionsAction"].Visible = false;
         }
-            
+
 #region Media Menu Actions
 
         private void OnImport (object o, EventArgs args)
         {
-            Banshee.Library.Gui.ImportDialog dialog = new Banshee.Library.Gui.ImportDialog ();            
-            try {
-                if (dialog.Run () != Gtk.ResponseType.Ok) {
-                    return;
-                }
-                    
-                dialog.ActiveSource.Import ();
-            } finally {
-                dialog.Destroy ();
+            var dialog = new Banshee.Library.Gui.ImportDialog ();
+            var res = dialog.Run ();
+            var src = dialog.ActiveSource;
+            dialog.Destroy ();
+
+            if (res == Gtk.ResponseType.Ok) {
+                src.Import ();
             }
         }
-        
+
         private void OnOpenLocation (object o, EventArgs args)
         {
             OpenLocationDialog dialog = new OpenLocationDialog ();
             ResponseType response = dialog.Run ();
             string address = dialog.Address;
             dialog.Destroy ();
-            
+
             if (response == ResponseType.Ok) {
                 RadioTrackInfo.OpenPlay (address);
             }
@@ -159,25 +157,10 @@ namespace Banshee.Gui
         private void OnImportPlaylist (object o, EventArgs args)
         {
             // Prompt user for location of the playlist.
-            Banshee.Gui.Dialogs.FileChooserDialog chooser = new Banshee.Gui.Dialogs.FileChooserDialog (
-                Catalog.GetString("Import Playlist"),
-                PrimaryWindow,
-                FileChooserAction.Open
-            );
-                         
-            chooser.DefaultResponse = ResponseType.Ok;
-            chooser.SelectMultiple = true;
+            var chooser = Banshee.Gui.Dialogs.FileChooserDialog.CreateForImport (Catalog.GetString("Import Playlist"), true);
             chooser.AddFilter (Hyena.Gui.GtkUtilities.GetFileFilter (Catalog.GetString ("Playlists"), PlaylistFileUtil.PlaylistExtensions));
-            // TODO library-location add the BaseDirectory for the library being imported to (or all of them)
-            /*try {
-                chooser.AddShortcutFolder (Paths.LibraryLocation);
-            } catch {}*/
 
-            chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
-            // Translators: verb
-            chooser.AddButton (Catalog.GetString("I_mport"), ResponseType.Ok);
-            
-            int response = chooser.Run();            
+            int response = chooser.Run();
 
             string [] uris = null;
             if (response == (int) ResponseType.Ok) {
@@ -187,7 +170,7 @@ namespace Banshee.Gui
                 chooser.Destroy();
                 return;
             }
-            
+
             if (uris == null || uris.Length == 0) {
                 return;
             }
@@ -198,12 +181,12 @@ namespace Banshee.Gui
                 }
             }));
         }
-        
+
         private void OnQuit (object o, EventArgs args)
         {
             Banshee.ServiceStack.Application.Shutdown ();
         }
-        
+
 #endregion
 
 #region Edit Menu Actions
@@ -224,16 +207,16 @@ namespace Banshee.Gui
         }
 
 #endregion
-        
+
 #region Help Menu Actions
-        
+
         private void OnVersionInformation (object o, EventArgs args)
         {
             Hyena.Gui.Dialogs.VersionInformationDialog dialog = new Hyena.Gui.Dialogs.VersionInformationDialog ();
             dialog.Run ();
             dialog.Destroy ();
         }
-        
+
         private void OnAbout (object o, EventArgs args)
         {
             Banshee.Gui.Dialogs.AboutDialog dialog = new Banshee.Gui.Dialogs.AboutDialog ();
@@ -241,6 +224,6 @@ namespace Banshee.Gui
         }
 
 #endregion
-            
+
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
index d9ef726..b4a2a3a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
@@ -1,4 +1,4 @@
-// 
+//
 // GtkBaseClient.cs
 //
 // Author:
@@ -29,6 +29,8 @@
 using System;
 using System.IO;
 
+using Mono.Addins;
+
 using Hyena;
 
 using Banshee.Base;
@@ -42,19 +44,19 @@ namespace Banshee.Gui
     {
         private static Type client_type;
 
-        private static string user_gtkrc = Path.Combine (Paths.ApplicationData, "gtkrc"); 
-        
+        private static string user_gtkrc = Path.Combine (Paths.ApplicationData, "gtkrc");
+
         public static void Startup<T> (string [] args) where T : GtkBaseClient
         {
             Hyena.Log.InformationFormat ("Running Banshee {0}: [{1}]", Application.Version,
                 Application.BuildDisplayInfo);
-            
+
             // This could go into GtkBaseClient, but it's probably something we
             // should really only support at each client level
             if (File.Exists (user_gtkrc) && !ApplicationContext.CommandLine.Contains ("no-gtkrc")) {
                 Gtk.Rc.AddDefaultFile (user_gtkrc);
-            } 
-            
+            }
+
             // Boot the client
             Banshee.Gui.GtkBaseClient.Startup<T> ();
         }
@@ -64,22 +66,22 @@ namespace Banshee.Gui
             if (client_type != null) {
                 throw new ApplicationException ("Only a single GtkBaseClient can be initialized through Entry<T>");
             }
-            
+
             client_type = typeof (T);
             Hyena.Gui.CleanRoomStartup.Startup (Startup);
         }
-        
+
         private static void Startup ()
         {
             ((GtkBaseClient)Activator.CreateInstance (client_type)).Run ();
         }
-        
+
         private string default_icon_name;
-        
+
         protected GtkBaseClient () : this (true, Application.IconName)
         {
         }
-        
+
         protected GtkBaseClient (bool initializeDefault, string defaultIconName)
         {
             this.default_icon_name = defaultIconName;
@@ -94,43 +96,53 @@ namespace Banshee.Gui
                 GLib.Thread.Init ();
             }
             Gtk.Application.Init ();
+
+            foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes
+                ("/Banshee/ThickClient/GtkBaseClient/PostInitializeGtk")) {
+                try {
+                    node.CreateInstance ();
+                } catch (Exception e) {
+                    Log.Exception ("PostInitializeGtk extension failed to run", e);
+                }
+            }
         }
-        
+
         protected void Initialize (bool registerCommonServices)
         {
             // Set the process name so system process listings and commands are pretty
             PlatformHacks.TrySetProcessName (Application.InternalName);
-            
+
             Application.Initialize ();
-            
+
             InitializeGtk ();
-            
+
             Gtk.Window.DefaultIconName = default_icon_name;
 
             ThreadAssist.InitializeMainThread ();
-            
+
             Gdk.Global.ProgramClass = Application.InternalName;
+            GLib.Global.ApplicationName = "Banshee";
 
             if (ApplicationContext.Debugging) {
                 GLib.Log.SetLogHandler ("Gtk", GLib.LogLevelFlags.Critical, GLib.Log.PrintTraceLogFunction);
             }
-            
+
             ServiceManager.ServiceStarted += OnServiceStarted;
-            
+
             // Register specific services this client will care about
             if (registerCommonServices) {
                 Banshee.Gui.CommonServices.Register ();
             }
-            
+
             OnRegisterServices ();
-            
+
             Application.ShutdownPromptHandler = OnShutdownPrompt;
             Application.TimeoutHandler = RunTimeout;
             Application.IdleHandler = RunIdle;
             Application.IdleTimeoutRemoveHandler = IdleTimeoutRemove;
-            
+
             // Start the core boot process
-            
+
             Application.PushClient (this);
             Application.Run ();
 
@@ -139,16 +151,16 @@ namespace Banshee.Gui
                     Banshee.Gui.Dialogs.DefaultApplicationHelperDialog.RunIfAppropriate ();
                 };
             }
-            
+
             Log.Notify += OnLogNotify;
         }
-        
+
         public virtual void Run ()
         {
             RunIdle (delegate { OnStarted (); return false; });
             Gtk.Application.Run ();
         }
-        
+
         protected virtual void OnRegisterServices ()
         {
         }
@@ -164,7 +176,7 @@ namespace Banshee.Gui
                 }
             }
         }
-        
+
         private void OnMigratorStarted (object o, EventArgs args)
         {
             BansheeDbFormatMigrator migrator = (BansheeDbFormatMigrator)o;
@@ -185,16 +197,16 @@ namespace Banshee.Gui
                 return false;
             });
         }
-                
+
         private void ShowLogCoreEntry (LogEntry entry)
         {
             Gtk.Window window = null;
             Gtk.MessageType mtype;
-            
+
             if (ServiceManager.Contains<GtkElementsService> ()) {
                 window = ServiceManager.Get<GtkElementsService> ().PrimaryWindow;
             }
-            
+
             switch (entry.Type) {
                 case LogEntryType.Warning:
                     mtype = Gtk.MessageType.Warning;
@@ -207,15 +219,15 @@ namespace Banshee.Gui
                     mtype = Gtk.MessageType.Error;
                     break;
             }
-              
+
             Banshee.Widgets.HigMessageDialog dialog = new Banshee.Widgets.HigMessageDialog (
                 window, Gtk.DialogFlags.Modal, mtype, Gtk.ButtonsType.Close, entry.Message, entry.Details);
-            
+
             dialog.Title = String.Empty;
             dialog.Run ();
             dialog.Destroy ();
         }
-        
+
         private bool OnShutdownPrompt ()
         {
             ConfirmShutdownDialog dialog = new ConfirmShutdownDialog ();
@@ -225,17 +237,17 @@ namespace Banshee.Gui
                 dialog.Destroy ();
             }
         }
-        
+
         protected uint RunTimeout (uint milliseconds, TimeoutHandler handler)
         {
             return GLib.Timeout.Add (milliseconds, delegate { return handler (); });
         }
-        
+
         protected uint RunIdle (IdleHandler handler)
         {
             return GLib.Idle.Add (delegate { return handler (); });
         }
-        
+
         protected bool IdleTimeoutRemove (uint id)
         {
             return GLib.Source.Remove (id);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/GtkElementsService.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/GtkElementsService.cs
index 503bc2a..5234dd2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/GtkElementsService.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/GtkElementsService.cs
@@ -40,19 +40,19 @@ namespace Banshee.Gui
     public class GtkElementsService : IService, IPropertyStoreExpose
     {
         public delegate bool PrimaryWindowCloseHandler ();
-        
+
         private PropertyStore property_store = new PropertyStore ();
         private BansheeIconFactory icon_factory = new BansheeIconFactory ();
-        
+
         private BaseClientWindow primary_window;
         private PrimaryWindowCloseHandler primary_window_close_handler;
-        
+
         public event EventHandler ThemeChanged;
-        
+
         public GtkElementsService ()
         {
         }
-        
+
         private void OnStyleSet (object o, StyleSetArgs args)
         {
             SourceInvalidateIconPixbuf (ServiceManager.SourceManager.Sources);
@@ -63,7 +63,7 @@ namespace Banshee.Gui
 
             OnThemeChanged ();
         }
-        
+
         private void OnPrimaryWindowRealized (object o, EventArgs args)
         {
             if (primary_window != null && primary_window.GdkWindow != null) {
@@ -72,7 +72,7 @@ namespace Banshee.Gui
                 property_store.Remove ("PrimaryWindow.RawHandle");
             }
         }
-        
+
         private void SourceInvalidateIconPixbuf (ICollection<Source> sources)
         {
             foreach (Source source in sources) {
@@ -80,7 +80,7 @@ namespace Banshee.Gui
                 SourceInvalidateIconPixbuf (source.Children);
             }
         }
-        
+
         protected virtual void OnThemeChanged ()
         {
             EventHandler handler = ThemeChanged;
@@ -88,7 +88,7 @@ namespace Banshee.Gui
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public BaseClientWindow PrimaryWindow {
             get { return primary_window; }
             set {
@@ -96,12 +96,12 @@ namespace Banshee.Gui
                     primary_window.StyleSet -= OnStyleSet;
                     primary_window.Realized -= OnPrimaryWindowRealized;
                 }
-                
+
                 primary_window = value;
-                
+
                 if (primary_window != null) {
                     property_store.Set<BaseClientWindow> ("PrimaryWindow", primary_window);
-                    
+
                     primary_window.StyleSet += OnStyleSet;
                     primary_window.Realized += OnPrimaryWindowRealized;
                 } else {
@@ -110,14 +110,14 @@ namespace Banshee.Gui
                 }
             }
         }
-        
+
         private List<Window> content_windows;
         public IEnumerable<Window> ContentWindows {
             get {
                 if (PrimaryWindow != null) {
                     yield return PrimaryWindow;
                 }
-                
+
                 if (content_windows != null) {
                     foreach (var window in content_windows) {
                         yield return window;
@@ -125,16 +125,16 @@ namespace Banshee.Gui
                 }
             }
         }
-        
+
         public void RegisterContentWindow (Window window)
         {
             if (content_windows == null) {
                 content_windows = new List<Window> ();
             }
-            
+
             content_windows.Add (window);
         }
-        
+
         public void UnregisterContentWindow (Window window)
         {
             if (content_windows != null) {
@@ -144,20 +144,20 @@ namespace Banshee.Gui
                 }
             }
         }
-        
+
         public PrimaryWindowCloseHandler PrimaryWindowClose {
             get { return primary_window_close_handler; }
             set { primary_window_close_handler = value; }
         }
-        
+
         public BansheeIconFactory IconFactory {
             get { return icon_factory; }
         }
-        
+
         PropertyStore IPropertyStoreExpose.PropertyStore {
             get { return property_store; }
         }
-        
+
         string IService.ServiceName {
             get { return "GtkElementsService"; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs
index 4e7faa6..65f8ba7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs
@@ -35,7 +35,7 @@ namespace Banshee.Gui
     public static class IconThemeUtils
     {
         private static Assembly executing_assembly = Assembly.GetExecutingAssembly ();
-    
+
         public static bool HasIcon (string name)
         {
             return IconTheme.Default.HasIcon (name);
@@ -54,7 +54,7 @@ namespace Banshee.Gui
                     return pixbuf;
                 }
             }
-            
+
             return null;
         }
 
@@ -81,7 +81,7 @@ namespace Banshee.Gui
                 }
             } catch {
             }
-            
+
             if (!fallBackOnResource) {
                 return null;
             }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/InterfaceActionService.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/InterfaceActionService.cs
index 71633cd..814e7fc 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/InterfaceActionService.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/InterfaceActionService.cs
@@ -54,10 +54,10 @@ namespace Banshee.Gui
         private PlaybackActions playback_actions;
         private TrackActions    track_actions;
         private SourceActions   source_actions;
-        
+
         private BansheeActionGroup active_source_actions;
         private uint active_source_uiid = 0;
-        
+
         public InterfaceActionService ()
         {
             ui_manager = new UIManager ();
@@ -89,29 +89,29 @@ namespace Banshee.Gui
                 if (action_groups.ContainsKey (name)) {
                     throw new ApplicationException ("Group already exists");
                 }
-                
+
                 InnerAddActionGroup (new ActionGroup (name));
             }
         }
-        
+
         public void AddActionGroup (ActionGroup group)
         {
             lock (this) {
                 if (action_groups.ContainsKey (group.Name)) {
                     throw new ApplicationException ("Group already exists");
                 }
-                            
+
                 InnerAddActionGroup (group);
             }
         }
-        
+
         public void RemoveActionGroup (string name)
         {
             lock (this) {
                 if (action_groups.ContainsKey (name)) {
                     ActionGroup group = action_groups[name];
                     ui_manager.RemoveActionGroup (group);
-                    action_groups.Remove (name);                    
+                    action_groups.Remove (name);
                 }
             }
         }
@@ -120,7 +120,7 @@ namespace Banshee.Gui
         {
             RemoveActionGroup (group.Name);
         }
-        
+
         public ActionGroup FindActionGroup (string actionGroupId)
         {
             foreach (ActionGroup group in action_groups.Values) {
@@ -128,36 +128,36 @@ namespace Banshee.Gui
                     return group;
                 }
             }
-            
+
             return null;
         }
-        
+
         public Action FindAction (string actionId)
         {
             string [] parts = actionId.Split ('.');
-            
+
             if (parts == null || parts.Length < 2) {
                 return null;
             }
-            
+
             string group_name = parts[0];
             string action_name = parts[1];
-            
+
             ActionGroup group = FindActionGroup (group_name);
             return group == null ? null : group.GetAction (action_name);
         }
-        
+
         public void PopulateToolbarPlaceholder (Toolbar toolbar, string path, Widget item)
         {
             PopulateToolbarPlaceholder (toolbar, path, item, false);
         }
-        
+
         public void PopulateToolbarPlaceholder (Toolbar toolbar, string path, Widget item, bool expand)
         {
             ToolItem placeholder = (ToolItem)UIManager.GetWidget (path);
             int position = toolbar.GetItemIndex (placeholder);
             toolbar.Remove (placeholder);
-            
+
             if (item is ToolItem) {
                 ((ToolItem)item).Expand = expand;
                 toolbar.Insert ((ToolItem)item, position);
@@ -168,7 +168,7 @@ namespace Banshee.Gui
                 toolbar.Insert (container_item, position);
             }
         }
-        
+
         private void OnActiveSourceChanged (SourceEventArgs args)
         {
             // FIXME: Can't use an anonymous delegate here because of compiler
@@ -182,12 +182,12 @@ namespace Banshee.Gui
                 ui_manager.RemoveUi (active_source_uiid);
                 active_source_uiid = 0;
             }
-                
+
             if (active_source_actions != null) {
                 RemoveActionGroup (active_source_actions.Name);
                 active_source_actions = null;
             }
-            
+
             Source active_source = ServiceManager.SourceManager.ActiveSource;
             if (active_source == null) {
                 return;
@@ -199,19 +199,19 @@ namespace Banshee.Gui
             if (active_source_actions != null) {
                 AddActionGroup (active_source_actions);
             }
-                
-            Assembly assembly = 
+
+            Assembly assembly =
                 active_source.GetProperty<Assembly> ("ActiveSourceUIResource.Assembly", propagate) ??
                 Assembly.GetAssembly (active_source.GetType ());
 
             active_source_uiid = AddUiFromFile (active_source.GetProperty<string> ("ActiveSourceUIResource", propagate), assembly);
         }
 
-        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             try {
                 TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-                
+
                 if (args.Change == ExtensionChange.Add) {
                     if (!extension_actions.ContainsKey (node.Id)) {
                         ActionGroup group = (ActionGroup)node.CreateInstance (typeof (ActionGroup));
@@ -235,7 +235,7 @@ namespace Banshee.Gui
         {
             return AddUiFromFile (ui_file, Assembly.GetCallingAssembly ());
         }
-        
+
         public uint AddUiFromFile (string ui_file, Assembly assembly)
         {
             if (ui_file != null) {
@@ -245,19 +245,19 @@ namespace Banshee.Gui
             }
             return 0;
         }
-        
+
         public Action this[string actionId] {
             get { return FindAction (actionId); }
         }
-        
+
         public UIManager UIManager {
             get { return ui_manager; }
         }
-        
+
         public GlobalActions GlobalActions {
             get { return global_actions; }
         }
-        
+
         public PlaybackActions PlaybackActions {
             get { return playback_actions; }
         }
@@ -269,11 +269,11 @@ namespace Banshee.Gui
         public SourceActions SourceActions {
             get { return source_actions; }
         }
-        
+
         public ViewActions ViewActions {
             get { return view_actions; }
         }
-        
+
         string IService.ServiceName {
             get { return "InterfaceActionService"; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
index 5356714..d49b30b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
@@ -36,7 +36,7 @@ namespace Banshee.Gui
     public class PersistentPaneController
     {
         private static Dictionary<string, PersistentPaneController> controllers = new Dictionary<string, PersistentPaneController> ();
-        
+
         private string @namespace;
         private string key;
         private int fallback;
@@ -44,17 +44,17 @@ namespace Banshee.Gui
         private bool pending_changes;
         private Paned pane;
         private int last_position;
-        
+
         public static void Control (Paned pane, string name)
         {
-            Control (pane, String.Format ("interface.panes.{0}", name), "position", pane.Position); 
+            Control (pane, String.Format ("interface.panes.{0}", name), "position", pane.Position);
         }
-        
+
         public static void Control (Paned pane, SchemaEntry<int> entry)
         {
-            Control (pane, entry.Namespace, entry.Key, entry.DefaultValue); 
+            Control (pane, entry.Namespace, entry.Key, entry.DefaultValue);
         }
-        
+
         private static void Control (Paned pane, string @namespace, string key, int defaultValue)
         {
             string dict_key = String.Format ("{0}.{1}", @namespace, key);
@@ -64,7 +64,7 @@ namespace Banshee.Gui
                 controllers.Add (dict_key, new PersistentPaneController (pane, @namespace, key, defaultValue));
             }
         }
-        
+
         private PersistentPaneController (Paned pane, string @namespace, string key, int fallback)
         {
             this. at namespace = @namespace;
@@ -72,17 +72,17 @@ namespace Banshee.Gui
             this.fallback = fallback;
             Paned = pane;
         }
-        
+
         private Paned Paned {
             set {
                 if (pane == value) {
                     return;
                 }
-                
+
                 if (pane != null) {
                     //pane.MoveHandle -= OnPaneMoved;
                 }
-                
+
                 pane = value;
                 pane.Position = ConfigurationClient.Get<int> (@namespace, key, fallback);
                 //pane.MoveHandle += OnPaneMoved;
@@ -90,12 +90,12 @@ namespace Banshee.Gui
                 pane.SizeAllocated += OnPaneMoved;
             }
         }
-        
+
         private void OnPaneMoved (object sender, EventArgs args)
         {
             Save ();
         }
-        
+
         private void Save ()
         {
             if (timer_id == 0) {
@@ -104,7 +104,7 @@ namespace Banshee.Gui
                 pending_changes = true;
             }
         }
-        
+
         private bool OnTimeout ()
         {
             if (pending_changes) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs
index 9499fe6..e5adf2b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs
@@ -39,7 +39,7 @@ namespace Banshee.Gui
         Position = 2,
         All = Size | Position
     }
-    
+
     public class PersistentWindowController
     {
         private Gtk.Window window;
@@ -110,7 +110,7 @@ namespace Banshee.Gui
             if ((options & WindowPersistOptions.Size) != 0) {
                 int width = WidthSchema.Get ();
                 int height = HeightSchema.Get ();
-                
+
                 if (width != 0 && height != 0) {
                     window.Resize (width, height);
                 }
@@ -119,7 +119,7 @@ namespace Banshee.Gui
             if ((options & WindowPersistOptions.Position) != 0) {
                 int x = XPosSchema.Get ();
                 int y = YPosSchema.Get ();
-                
+
                 if (x == 0 && y == 0) {
                     window.SetPosition (Gtk.WindowPosition.Center);
                 } else {
@@ -155,7 +155,7 @@ namespace Banshee.Gui
                 pending_changes = true;
             }
         }
-        
+
         private bool OnTimeout ()
         {
             if (pending_changes) {
@@ -175,7 +175,7 @@ namespace Banshee.Gui
                 MaximizedSchema.Set (true);
                 return;
             }
-            
+
             if (x < 0 || y < 0 || width <= 0 || height <= 0) {
                  return;
             }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs
index ae35070..4efe0d9 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs
@@ -52,11 +52,11 @@ namespace Banshee.Gui
         public PlaybackRepeatActions RepeatActions {
             get { return repeat_actions; }
         }
-        
+
         public PlaybackShuffleActions ShuffleActions {
             get { return shuffle_actions; }
         }
-        
+
         public PlaybackActions () : base ("Playback")
         {
             ImportantByDefault = false;
@@ -65,35 +65,35 @@ namespace Banshee.Gui
                 new ActionEntry ("PlayPauseAction", null,
                     Catalog.GetString ("_Play"), "space",
                     Catalog.GetString ("Play or pause the current item"), OnPlayPauseAction),
-                    
+
                 new ActionEntry ("NextAction", null,
                     Catalog.GetString ("_Next"), "N",
                     Catalog.GetString ("Play the next item"), OnNextAction),
-                    
+
                 new ActionEntry ("PreviousAction", null,
                     Catalog.GetString ("Pre_vious"), "B",
                     Catalog.GetString ("Play the previous item"), OnPreviousAction),
 
                 new ActionEntry ("SeekToAction", null,
-                    Catalog.GetString ("Seek _to..."), "T",
+                    Catalog.GetString ("Seek _To..."), "T",
                     Catalog.GetString ("Seek to a specific location in current item"), OnSeekToAction),
 
                 new ActionEntry ("JumpToPlayingTrackAction", null,
                     Catalog.GetString("_Jump to Playing Song"), "<control>J",
                     Catalog.GetString ("Jump to the currently playing item"), OnJumpToPlayingTrack),
-                
+
                 new ActionEntry ("RestartSongAction", null,
                     Catalog.GetString ("_Restart Song"), "R",
                     Catalog.GetString ("Restart the current item"), OnRestartSongAction)
             });
-            
+
             Add (new ToggleActionEntry [] {
                 new ToggleActionEntry ("StopWhenFinishedAction", null,
                     Catalog.GetString ("_Stop When Finished"), "<Shift>space",
-                    Catalog.GetString ("Stop playback after the current item finishes playing"), 
+                    Catalog.GetString ("Stop playback after the current item finishes playing"),
                     OnStopWhenFinishedAction, false)
             });
-            
+
             Actions.GlobalActions.Add (new ActionEntry [] {
                 new ActionEntry ("PlaybackMenuAction", null,
                     Catalog.GetString ("_Playback"), null, null, null),
@@ -102,20 +102,20 @@ namespace Banshee.Gui
             this["JumpToPlayingTrackAction"].Sensitive = false;
             this["RestartSongAction"].Sensitive = false;
             this["SeekToAction"].Sensitive = false;
-            
+
             this["PlayPauseAction"].StockId = Gtk.Stock.MediaPlay;
             this["NextAction"].StockId = Gtk.Stock.MediaNext;
             this["PreviousAction"].StockId = Gtk.Stock.MediaPrevious;
 
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.Error | 
-                PlayerEvent.EndOfStream | 
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
+                PlayerEvent.Error |
+                PlayerEvent.EndOfStream |
                 PlayerEvent.StateChange);
-            
+
             repeat_actions = new PlaybackRepeatActions (Actions);
             shuffle_actions = new PlaybackShuffleActions (Actions, this);
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
@@ -134,7 +134,7 @@ namespace Banshee.Gui
                     break;
             }
         }
-        
+
         private void OnPlayerStateChange (PlayerEventStateChangeArgs args)
         {
             if (play_pause_action == null) {
@@ -158,7 +158,7 @@ namespace Banshee.Gui
                     break;
             }
 
-            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack; 
+            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
             if (track != null) {
                 this["SeekToAction"].Sensitive = !track.IsLive;
                 this["RestartSongAction"].Sensitive = !track.IsLive;
@@ -175,7 +175,7 @@ namespace Banshee.Gui
             // Disable all actions while NotReady
             Sensitive = args.Current != PlayerState.NotReady;
         }
-        
+
         private void ShowStopAction ()
         {
             if (ServiceManager.PlayerEngine.CanPause) {
@@ -184,35 +184,35 @@ namespace Banshee.Gui
                 ShowStop ();
             }
         }
-        
+
         private void ShowPause ()
         {
             play_pause_action.Label = Catalog.GetString ("_Pause");
             play_pause_action.StockId = Gtk.Stock.MediaPause;
         }
-        
+
         private void ShowPlay ()
         {
             play_pause_action.Label = Catalog.GetString ("_Play");
             play_pause_action.StockId = Gtk.Stock.MediaPlay;
         }
-                
+
         private void ShowStop ()
         {
             play_pause_action.Label = Catalog.GetString ("Sto_p");
             play_pause_action.StockId = Gtk.Stock.MediaStop;
         }
-                
+
         private void OnPlayPauseAction (object o, EventArgs args)
         {
             ServiceManager.PlayerEngine.TogglePlaying ();
         }
-        
+
         private void OnNextAction (object o, EventArgs args)
         {
             ServiceManager.PlaybackController.Next ();
         }
-        
+
         private void OnPreviousAction (object o, EventArgs args)
         {
             const int delay = 4000; // ms
@@ -229,7 +229,7 @@ namespace Banshee.Gui
             dialog.Run ();
             dialog.Destroy ();
         }
-            
+
         private void OnRestartSongAction (object o, EventArgs args)
         {
             TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
@@ -238,7 +238,7 @@ namespace Banshee.Gui
                 ServiceManager.PlayerEngine.OpenPlay (track);
             }
         }
-        
+
         private void OnStopWhenFinishedAction (object o, EventArgs args)
         {
             ServiceManager.PlaybackController.StopWhenFinished = ((ToggleAction)o).Active;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs
index 22f4c37..fe3267d 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs
@@ -44,7 +44,7 @@ namespace Banshee.Gui
     {
         private RadioAction active_action;
         private RadioAction saved_action;
-        
+
         public RadioAction Active {
             get { return active_action; }
             set {
@@ -52,7 +52,7 @@ namespace Banshee.Gui
                 ServiceManager.PlaybackController.RepeatMode = (PlaybackRepeatMode)active_action.Value;
             }
         }
-        
+
         public new bool Sensitive {
             get { return base.Sensitive; }
             set {
@@ -62,11 +62,11 @@ namespace Banshee.Gui
         }
 
         public event EventHandler Changed;
-        
+
         public PlaybackRepeatActions (InterfaceActionService actionService) : base (actionService, "PlaybackRepeat")
         {
             actionService.AddActionGroup (this);
-            
+
             Add (new ActionEntry [] {
                 new ActionEntry ("RepeatMenuAction", null,
                     Catalog.GetString ("Repeat"), null,
@@ -74,16 +74,16 @@ namespace Banshee.Gui
             });
 
             Add (new RadioActionEntry [] {
-                new RadioActionEntry ("RepeatNoneAction", null, 
+                new RadioActionEntry ("RepeatNoneAction", null,
                     Catalog.GetString ("Repeat _Off"), null,
                     Catalog.GetString ("Do not repeat playlist"),
                     (int)PlaybackRepeatMode.None),
-                    
+
                 new RadioActionEntry ("RepeatAllAction", null,
                     Catalog.GetString ("Repeat _All"), null,
                     Catalog.GetString ("Play all songs before repeating playlist"),
                     (int)PlaybackRepeatMode.RepeatAll),
-                    
+
                 new RadioActionEntry ("RepeatSingleAction", null,
                     Catalog.GetString ("Repeat Singl_e"), null,
                     Catalog.GetString ("Repeat the current playing song"),
@@ -103,17 +103,17 @@ namespace Banshee.Gui
             } else {
                 Active = (RadioAction)this["RepeatNoneAction"];
             }
-            
+
             Active.Activate ();
         }
 
-        private void OnRepeatModeChanged (object o, RepeatModeChangedEventArgs args)
+        private void OnRepeatModeChanged (object o, EventArgs<PlaybackRepeatMode> args)
         {
-            if (active_action.Value != (int)args.RepeatMode) {
+            if (active_action.Value != (int)args.Value) {
                 // This happens only when changing the mode using DBus.
                 // In this case we need to locate the action by its value.
                 foreach (RadioAction action in this) {
-                    if (action.Value == (int)args.RepeatMode) {
+                    if (action.Value == (int)args.Value) {
                         active_action = action;
                         break;
                     }
@@ -145,7 +145,7 @@ namespace Banshee.Gui
         {
             Active = args.Current;
         }
-        
+
         private void OnChanged ()
         {
             EventHandler handler = Changed;
@@ -153,20 +153,20 @@ namespace Banshee.Gui
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void AttachSubmenu (string menuItemPath)
         {
             MenuItem parent = Actions.UIManager.GetWidget (menuItemPath) as MenuItem;
             parent.Submenu = CreateMenu ();
         }
-        
+
         public MenuItem CreateSubmenu ()
         {
             MenuItem parent = (MenuItem)this["RepeatMenuAction"].CreateMenuItem ();
             parent.Submenu = CreateMenu ();
             return parent;
         }
-            
+
         public Menu CreateMenu ()
         {
             Menu menu = new Gtk.Menu ();
@@ -201,7 +201,7 @@ namespace Banshee.Gui
 
         private static string ActionNameToConfigId (string actionName)
         {
-            return StringUtil.CamelCaseToUnderCase (actionName.Substring (0, 
+            return StringUtil.CamelCaseToUnderCase (actionName.Substring (0,
                 actionName.Length - (actionName.EndsWith ("Action") ? 6 : 0)));
         }
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs
index a823f37..7d0ddd4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackShuffleActions.cs
@@ -63,13 +63,13 @@ namespace Banshee.Gui
         }
 
         public event EventHandler Changed;
-        
+
         public PlaybackShuffleActions (InterfaceActionService actionService, PlaybackActions playbackActions)
             : base (actionService, "PlaybackShuffle")
         {
             playback_actions = playbackActions;
             Actions.AddActionGroup (this);
-            
+
             Add (new ActionEntry [] {
                 new ActionEntry ("ShuffleMenuAction", null,
                     Catalog.GetString ("Shuffle"), null,
@@ -77,21 +77,21 @@ namespace Banshee.Gui
             });
 
             Add (new RadioActionEntry [] {
-                new RadioActionEntry ("ShuffleOffAction", null, 
+                new RadioActionEntry ("ShuffleOffAction", null,
                     Catalog.GetString ("Shuffle _Off"), null,
                     Catalog.GetString ("Do not shuffle playlist"),
                     (int)PlaybackShuffleMode.Linear),
-                    
+
                 new RadioActionEntry ("ShuffleSongAction", null,
                     Catalog.GetString ("Shuffle by _Song"), null,
                     Catalog.GetString ("Play songs randomly from the playlist"),
                     (int)PlaybackShuffleMode.Song),
-                    
+
                 new RadioActionEntry ("ShuffleArtistAction", null,
                     Catalog.GetString ("Shuffle by A_rtist"), null,
                     Catalog.GetString ("Play all songs by an artist, then randomly choose another artist"),
                     (int)PlaybackShuffleMode.Artist),
-                    
+
                 new RadioActionEntry ("ShuffleAlbumAction", null,
                     Catalog.GetString ("Shuffle by A_lbum"), null,
                     Catalog.GetString ("Play all songs from an album, then randomly choose another album"),
@@ -107,7 +107,7 @@ namespace Banshee.Gui
                     Catalog.GetString ("Play songs randomly, prefer higher scored songs"),
                     (int)PlaybackShuffleMode.Score)
             }, 0, OnActionChanged);
-                
+
             this["ShuffleOffAction"].StockId = Gtk.Stock.MediaNext;
             this["ShuffleSongAction"].IconName = "media-playlist-shuffle";
             this["ShuffleArtistAction"].IconName = "media-playlist-shuffle";
@@ -124,17 +124,17 @@ namespace Banshee.Gui
             } else {
                 Active = (RadioAction)this["ShuffleOffAction"];
             }
-            
+
             Active.Activate ();
         }
 
-        private void OnShuffleModeChanged (object o, ShuffleModeChangedEventArgs args)
+        private void OnShuffleModeChanged (object o, EventArgs<PlaybackShuffleMode> args)
         {
-            if (active_action.Value != (int)args.ShuffleMode) {
+            if (active_action.Value != (int)args.Value) {
                 // This happens only when changing the mode using DBus.
                 // In this case we need to locate the action by its value.
                 foreach (RadioAction action in this) {
-                    if (action.Value == (int)args.ShuffleMode) {
+                    if (action.Value == (int)args.Value) {
                         active_action = action;
                         break;
                     }
@@ -176,20 +176,20 @@ namespace Banshee.Gui
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void AttachSubmenu (string menuItemPath)
         {
             MenuItem parent = Actions.UIManager.GetWidget (menuItemPath) as MenuItem;
             parent.Submenu = CreateMenu ();
         }
-        
+
         public MenuItem CreateSubmenu ()
         {
             MenuItem parent = (MenuItem)this["ShuffleMenuAction"].CreateMenuItem ();
             parent.Submenu = CreateMenu ();
             return parent;
         }
-            
+
         public Menu CreateMenu ()
         {
             Menu menu = new Gtk.Menu ();
@@ -227,7 +227,7 @@ namespace Banshee.Gui
 
         private static string ActionNameToConfigId (string actionName)
         {
-            return StringUtil.CamelCaseToUnderCase (actionName.Substring (0, 
+            return StringUtil.CamelCaseToUnderCase (actionName.Substring (0,
                 actionName.Length - (actionName.EndsWith ("Action") ? 6 : 0)));
         }
 
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs
index b0b0a71..64723e4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/SourceActions.cs
@@ -81,7 +81,7 @@ namespace Banshee.Gui
                     Catalog.GetString ("New _Smart Playlist _From Search"), null,
                     Catalog.GetString ("Create a new smart playlist from the current search"), OnNewSmartPlaylistFromSearch),*/
 
-                new ActionEntry ("SourceContextMenuAction", null, 
+                new ActionEntry ("SourceContextMenuAction", null,
                     String.Empty, null, null, OnSourceContextMenu),
 
                 new ActionEntry ("ImportSourceAction", null,
@@ -97,15 +97,15 @@ namespace Banshee.Gui
 
                 new ActionEntry ("UnmapSourceAction", null,
                     Catalog.GetString ("Unmap"), "<shift>Delete", null, OnUnmapSource),
-                    
+
                 new ActionEntry ("SourcePropertiesAction", null,
                     Catalog.GetString ("Source Properties"), null, null, OnSourceProperties),
-                    
-                new ActionEntry ("SortChildrenAction", Stock.SortDescending, 
+
+                new ActionEntry ("SortChildrenAction", Stock.SortDescending,
                     Catalog.GetString ("Sort Children by"), null, null,
                     OnSortChildrenMenu),
 
-                new ActionEntry ("SourcePreferencesAction", null, Catalog.GetString ("Preferences"), null, 
+                new ActionEntry ("SourcePreferencesAction", null, Catalog.GetString ("Preferences"), null,
                     Catalog.GetString ("Edit preferences related to this source"), OnSourcePreferences),
 
             });
@@ -122,7 +122,7 @@ namespace Banshee.Gui
                     Catalog.GetString ("Refresh"), null,
                     Catalog.GetString ("Refresh this randomly sorted smart playlist"), OnRefreshSmartPlaylist)
             );
-            
+
             //ServiceManager.SourceManager.SourceUpdated += OnPlayerEngineStateChanged;
             //ServiceManager.SourceManager.SourceViewChanged += OnPlayerEngineStateChanged;
             //ServiceManager.SourceManager.SourceAdded += OnPlayerEngineStateChanged;
@@ -130,18 +130,18 @@ namespace Banshee.Gui
             ServiceManager.SourceManager.ActiveSourceChanged += HandleActiveSourceChanged;
             Actions.GlobalActions["EditMenuAction"].Activated += HandleEditMenuActivated;
         }
-            
+
 #region State Event Handlers
 
         private void HandleActiveSourceChanged (SourceEventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 UpdateActions ();
-                
+
                 if (last_source != null) {
                     last_source.Updated -= HandleActiveSourceUpdated;
                 }
-                
+
                 if (ActiveSource != null) {
                     ActiveSource.Updated += HandleActiveSourceUpdated;
                 }
@@ -152,7 +152,7 @@ namespace Banshee.Gui
         {
             UpdateActions ();
         }
-        
+
         private void HandleActiveSourceUpdated (object o, EventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
@@ -235,7 +235,7 @@ namespace Banshee.Gui
                 return;
             }
 
-            menu.Show (); 
+            menu.Show ();
             menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
             menu.SelectionDone += delegate {
                 SourceView.ResetHighlight ();
@@ -265,19 +265,19 @@ namespace Banshee.Gui
 
             string uri = null;
             PlaylistFormatDescription format = null;
-            int response = chooser.Run ();            
-            if (response == (int) ResponseType.Ok) {                    
+            int response = chooser.Run ();
+            if (response == (int) ResponseType.Ok) {
                 uri = chooser.Uri;
                 // Get the format that the user selected.
                 format = chooser.GetExportFormat ();
-            }             
-            chooser.Destroy (); 
+            }
+            chooser.Destroy ();
 
             if (uri == null) {
                 // User cancelled export.
                 return;
             }
-            
+
             try {
                 IPlaylistFormat playlist = (IPlaylistFormat)Activator.CreateInstance (format.Type);
                 SafeUri suri = new SafeUri (uri);
@@ -354,7 +354,7 @@ namespace Banshee.Gui
         {
             UpdateActions (false);
         }
-        
+
         private void UpdateActions (bool force)
         {
             Source source = ActionSource;
@@ -378,7 +378,7 @@ namespace Banshee.Gui
                 UpdateAction ("NewSmartPlaylistAction", playlists_writable, true, source);
                 /*UpdateAction ("NewSmartPlaylistFromSearchAction", (source is LibrarySource || source.Parent is LibrarySource),
                         !String.IsNullOrEmpty (source.FilterQuery), source);*/
-                    
+
                 ActionGroup browser_actions = Actions.FindActionGroup ("BrowserView");
                 if (browser_actions != null) {
                     IFilterableSource filterable_source = source as IFilterableSource;
@@ -390,7 +390,7 @@ namespace Banshee.Gui
 
                 last_source = source;
             }
-            
+
             if (source != null) {
                 UpdateAction ("SortChildrenAction", source.ChildSortTypes.Length > 0 && source.Children.Count > 1, true, source);
             }
@@ -405,11 +405,11 @@ namespace Banshee.Gui
         {
             string key = "no_confirm_unmap_" + source.GetType ().Name.ToLower ();
             bool do_not_ask = ConfigurationClient.Get<bool> ("sources", key, false);
-            
+
             if (do_not_ask) {
                 return true;
             }
-        
+
             Banshee.Widgets.HigMessageDialog dialog = new Banshee.Widgets.HigMessageDialog (
                 ServiceManager.Get<GtkElementsService> ("GtkElementsService").PrimaryWindow,
                 Gtk.DialogFlags.Modal,
@@ -418,9 +418,9 @@ namespace Banshee.Gui
                 String.Format (Catalog.GetString ("Are you sure you want to delete this {0}?"),
                     source.GenericName.ToLower ()),
                 source.Name);
-            
+
             dialog.AddButton (Gtk.Stock.Delete, Gtk.ResponseType.Ok, false);
-            
+
             Gtk.Alignment alignment = new Gtk.Alignment (0.0f, 0.0f, 0.0f, 0.0f);
             alignment.TopPadding = 10;
             Gtk.CheckButton confirm_button = new Gtk.CheckButton (String.Format (Catalog.GetString (
@@ -431,13 +431,13 @@ namespace Banshee.Gui
             alignment.Add (confirm_button);
             alignment.ShowAll ();
             dialog.LabelVBox.PackStart (alignment, false, false, 0);
-            
+
             try {
                 if (dialog.Run () == (int)Gtk.ResponseType.Ok) {
                     ConfigurationClient.Set<bool> ("sources", key, do_not_ask);
                     return true;
                 }
-                
+
                 return false;
             } finally {
                 dialog.Destroy ();
@@ -485,6 +485,6 @@ namespace Banshee.Gui
         }
 
 #endregion
-        
+
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
index ee5d596..6f0c08a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
@@ -54,23 +54,23 @@ namespace Banshee.Gui
             "RemoveTracksAction", "RemoveTracksFromLibraryAction", "DeleteTracksFromDriveAction",
             "RateTracksAction", "SelectNoneAction"
         };
-        
+
         public event EventHandler SelectionChanged;
 
         public TrackActions () : base ("Track")
         {
             Add (new ActionEntry [] {
-                new ActionEntry("TrackContextMenuAction", null, 
+                new ActionEntry("TrackContextMenuAction", null,
                     String.Empty, null, null, OnTrackContextMenu),
 
                 new ActionEntry("SelectAllAction", null,
                     Catalog.GetString("Select _All"), "<control>A",
                     Catalog.GetString("Select all tracks"), OnSelectAll),
-                    
+
                 new ActionEntry("SelectNoneAction", null,
                     Catalog.GetString("Select _None"), "<control><shift>A",
                     Catalog.GetString("Unselect all tracks"), OnSelectNone),
-                    
+
                 new ActionEntry ("TrackEditorAction", Stock.Edit,
                     Catalog.GetString ("_Edit Track Information"), "E",
                     Catalog.GetString ("Edit information on selected tracks"), OnTrackEditor),
@@ -134,13 +134,13 @@ namespace Banshee.Gui
                 current_source.TrackModel.Selection.Changed -= HandleSelectionChanged;
                 current_source = null;
             }
-            
+
             ITrackModelSource new_source = ActiveSource as ITrackModelSource;
             if (new_source != null) {
                 new_source.TrackModel.Selection.Changed += HandleSelectionChanged;
                 current_source = new_source;
             }
-            
+
             Banshee.Base.ThreadAssist.ProxyToMain (UpdateActions);
         }
 
@@ -166,7 +166,7 @@ namespace Banshee.Gui
         {
             ResetRating ();
         }
-        
+
         private void OnSelectionChanged ()
         {
             EventHandler handler = SelectionChanged;
@@ -203,7 +203,7 @@ namespace Banshee.Gui
             Source source = ServiceManager.SourceManager.ActiveSource;
             bool in_database = source is DatabaseSource;
             PrimarySource primary_source = (source as PrimarySource) ?? (source.Parent as PrimarySource);
-            
+
             Hyena.Collections.Selection selection = (source is ITrackModelSource) ? (source as ITrackModelSource).TrackModel.Selection : null;
 
             if (selection != null) {
@@ -228,7 +228,7 @@ namespace Banshee.Gui
                     UpdateAction ("RemoveTracksAction", is_track_source && track_source.CanRemoveTracks, has_selection, source);
                     UpdateAction ("DeleteTracksFromDriveAction", is_track_source && track_source.CanDeleteTracks, has_selection, source);
                     UpdateAction ("RemoveTracksFromLibraryAction", source.Parent is LibrarySource, has_selection, null);
-                    
+
                     UpdateAction ("TrackPropertiesAction", source.HasViewableTrackProperties, has_selection, source);
                     UpdateAction ("TrackEditorAction", source.HasEditableTrackProperties, has_selection, source);
                     UpdateAction ("RateTracksAction", in_database, has_selection, null);
@@ -249,7 +249,7 @@ namespace Banshee.Gui
         {
             if (current_source != null) {
                 int rating = 0;
-    
+
                 // If there is only one track, get the preset rating
                 if (current_source.TrackModel.Selection.Count == 1) {
                     foreach (TrackInfo track in current_source.TrackModel.SelectedItems) {
@@ -261,7 +261,7 @@ namespace Banshee.Gui
         }
 
 #endregion
-            
+
 #region Action Handlers
 
         private void OnSelectAll (object o, EventArgs args)
@@ -285,15 +285,15 @@ namespace Banshee.Gui
         private bool RunSourceOverrideHandler (string sourceOverrideHandler)
         {
             Source source = current_source as Source;
-            InvokeHandler handler = source != null 
-                ? source.GetInheritedProperty<InvokeHandler> (sourceOverrideHandler) 
+            InvokeHandler handler = source != null
+                ? source.GetInheritedProperty<InvokeHandler> (sourceOverrideHandler)
                 : null;
-            
+
             if (handler != null) {
                 handler ();
                 return true;
             }
-            
+
             return false;
         }
 
@@ -303,7 +303,7 @@ namespace Banshee.Gui
                 Banshee.Gui.TrackEditor.TrackEditorDialog.RunView (current_source.TrackModel);
             }
         }
-        
+
         private void OnTrackEditor (object o, EventArgs args)
         {
             if (current_source != null && !RunSourceOverrideHandler ("TrackEditorActionHandler")) {
@@ -328,7 +328,7 @@ namespace Banshee.Gui
 
                 submenu.Append (this ["AddToNewPlaylistAction"].CreateMenuItem ());
                 bool separator_added = false;
-                
+
                 foreach (Source child in ActivePrimarySource.Children) {
                     PlaylistSource playlist = child as PlaylistSource;
                     if (playlist != null) {
@@ -336,7 +336,7 @@ namespace Banshee.Gui
                             submenu.Append (new SeparatorMenuItem ());
                             separator_added = true;
                         }
-                        
+
                         PlaylistMenuItem item = new PlaylistMenuItem (playlist);
                         item.Image = new Gtk.Image ("playlist-source", IconSize.Menu);
                         item.Activated += OnAddToExistingPlaylist;
@@ -344,7 +344,7 @@ namespace Banshee.Gui
                         submenu.Append (item);
                     }
                 }
-                
+
                 submenu.ShowAll ();
             }
         }
@@ -445,12 +445,12 @@ namespace Banshee.Gui
             if (!source.ConfirmRemoveTracks) {
                 return true;
             }
-            
+
             bool ret = false;
             string header = null;
             string message = null;
             string button_label = null;
-            
+
             if (delete) {
                 header = String.Format (
                     Catalog.GetPluralString (
@@ -470,7 +470,7 @@ namespace Banshee.Gui
                 );
                 button_label = "gtk-remove";
             }
-                
+
             HigMessageDialog md = new HigMessageDialog (
                 ServiceManager.Get<GtkElementsService> ("GtkElementsService").PrimaryWindow,
                 DialogFlags.DestroyWithParent, delete ? MessageType.Warning : MessageType.Question,
@@ -479,7 +479,7 @@ namespace Banshee.Gui
             // Delete from Disk defaults to Cancel and the others to OK/Confirm.
             md.AddButton ("gtk-cancel", ResponseType.No, delete);
             md.AddButton (button_label, ResponseType.Yes, !delete);
-            
+
             try {
                 if (md.Run () == (int) ResponseType.Yes) {
                     ret = true;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs
index e260278..b0748a8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/ViewActions.cs
@@ -41,12 +41,12 @@ namespace Banshee.Gui
     {
         public delegate void FullscreenHandler (bool fullscreen);
         private FullscreenHandler fullscreen_handler;
-        
+
         public FullscreenHandler Fullscreen {
             get { return fullscreen_handler; }
-            set { 
-                fullscreen_handler = value; 
-                
+            set {
+                fullscreen_handler = value;
+
                 GtkElementsService service = ServiceManager.Get<GtkElementsService> ();
                 Gtk.ToggleAction action = this["FullScreenAction"] as Gtk.ToggleAction;
                 if (service != null && action != null && value == null) {
@@ -54,13 +54,13 @@ namespace Banshee.Gui
                 }
             }
         }
-    
+
         public ViewActions () : base ("View")
         {
             Add (new ActionEntry [] {
                 new ActionEntry ("ViewMenuAction", null,
                     Catalog.GetString ("_View"), null, null, null),
-                    
+
                 new ActionEntry ("ShowEqualizerAction", null,
                    Catalog.GetString ("_Equalizer"), "<control>E",
                    Catalog.GetString ("View the graphical equalizer"), OnShowEqualizer)
@@ -86,18 +86,18 @@ namespace Banshee.Gui
                     Catalog.GetString ("Show Cover _Art"), null,
                     Catalog.GetString ("Toggle display of album cover art"), null, false),
             });*/
-            
+
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.StateChange);
             OnFullScreen (null, EventArgs.Empty);
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             if (((PlayerEventStateChangeArgs)args).Current == PlayerState.Ready) {
                 Actions["View.ShowEqualizerAction"].Sensitive = ServiceManager.PlayerEngine.SupportsEqualizer;
             }
         }
-                
+
         private void OnShowEqualizer (object o, EventArgs args)
         {
             if (EqualizerWindow.Instance == null) {
@@ -114,19 +114,19 @@ namespace Banshee.Gui
             if (action == null) {
                 return;
             }
-            
+
             if (Fullscreen != null) {
                 Fullscreen (action.Active);
                 return;
             }
-            
+
             GtkElementsService service = ServiceManager.Get<GtkElementsService> ();
             if (service == null || action == null) {
                 return;
             }
-            
+
             Gtk.Window window = service.PrimaryWindow;
-            
+
             if (window == null) {
                 return;
             } else if (action.Active) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs
index 868968c..ffee23f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FileImportSource.cs
@@ -39,52 +39,41 @@ namespace Banshee.Library.Gui
         public FileImportSource ()
         {
         }
-    
+
         public void Import()
         {
-            Banshee.Gui.Dialogs.FileChooserDialog chooser = new Banshee.Gui.Dialogs.FileChooserDialog (
-                Catalog.GetString ("Import Files to Library"),
-                FileChooserAction.Open
-            );
-            
-            chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
-            chooser.AddButton (Stock.Open, ResponseType.Ok);
-            chooser.AddFilter (Hyena.Gui.GtkUtilities.GetFileFilter (Catalog.GetString ("Media Files"), Banshee.Collection.Database.DatabaseImportManager.WhiteListFileExtensions.List));
-            chooser.SelectMultiple = true;
-            chooser.DefaultResponse = ResponseType.Ok;
-            
-            SetChooserShortcuts (chooser);
-            
+            var chooser = Banshee.Gui.Dialogs.FileChooserDialog.CreateForImport (Catalog.GetString ("Import Files to Library"), true);
+
+            chooser.AddFilter (Hyena.Gui.GtkUtilities.GetFileFilter (
+                Catalog.GetString ("Media Files"),
+                Banshee.Collection.Database.DatabaseImportManager.WhiteListFileExtensions.List));
+
             if (chooser.Run () == (int)ResponseType.Ok) {
                 Banshee.ServiceStack.ServiceManager.Get<LibraryImportManager> ().Enqueue (chooser.Uris);
             }
-            
+
             chooser.Destroy ();
         }
-        
+
         public string Name {
             get { return Catalog.GetString ("Local Files"); }
         }
-        
+
+        public string ImportLabel {
+            get { return Catalog.GetString ("C_hoose Files"); }
+        }
+
         public string [] IconNames {
             get { return new string [] { "gtk-open" }; }
         }
-        
+
         public bool CanImport {
             get { return true; }
         }
-        
+
         public int SortOrder {
             get { return 5; }
         }
-        
-        public static void SetChooserShortcuts (Gtk.FileChooserDialog chooser)
-        {
-            Hyena.Gui.GtkUtilities.SetChooserShortcuts (chooser,
-                ServiceManager.SourceManager.MusicLibrary.BaseDirectory,
-                ServiceManager.SourceManager.VideoLibrary.BaseDirectory
-            );
-        }
 
         // Reserve strings in preparation for the forthcoming string freeze.
         public void ReservedStrings ()
diff --git a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs
index c734f2a..e9f4841 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/FolderImportSource.cs
@@ -37,39 +37,34 @@ namespace Banshee.Library.Gui
         public FolderImportSource ()
         {
         }
-    
+
         public void Import()
         {
-            Banshee.Gui.Dialogs.FileChooserDialog chooser = new Banshee.Gui.Dialogs.FileChooserDialog (
-                Catalog.GetString ("Import Folders to Library"),
-                FileChooserAction.SelectFolder
-            );
-            
-            chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
-            chooser.AddButton (Stock.Open, ResponseType.Ok);
-            chooser.SelectMultiple = true;
-            chooser.DefaultResponse = ResponseType.Ok;
-            FileImportSource.SetChooserShortcuts (chooser);
-            
+            var chooser = Banshee.Gui.Dialogs.FileChooserDialog.CreateForImport (Catalog.GetString ("Import Folders to Library"), false);
+
             if (chooser.Run () == (int)ResponseType.Ok) {
                 Banshee.ServiceStack.ServiceManager.Get<LibraryImportManager> ().Enqueue (chooser.Uris);
             }
-            
+
             chooser.Destroy ();
         }
-        
+
         public string Name {
             get { return Catalog.GetString ("Local Folders"); }
         }
-        
+
+        public string ImportLabel {
+            get { return Catalog.GetString ("C_hoose Folders"); }
+        }
+
         public string [] IconNames {
             get { return new string [] { "gtk-open" }; }
         }
-        
+
         public bool CanImport {
             get { return true; }
         }
-        
+
         public int SortOrder {
             get { return 0; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs
index 3a05602..722abcd 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/ImportDialog.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ImportDialog.cs
 //
 // Author:
@@ -31,6 +31,9 @@ using System.Collections.Generic;
 using Gtk;
 using Glade;
 
+using Mono.Unix;
+
+using Banshee.Configuration.Schema;
 using Banshee.Sources;
 using Banshee.ServiceStack;
 using Banshee.Gui;
@@ -43,13 +46,14 @@ namespace Banshee.Library.Gui
         private ComboBox source_combo_box;
         private ListStore source_model;
         private AccelGroup accel_group;
+        private Button import_button;
 
         [Widget] private Gtk.Label choose_label;
 
         public ImportDialog () : this (false)
         {
         }
-        
+
         public ImportDialog (bool doNotShowAgainVisible) : base ("ImportDialog")
         {
             accel_group = new AccelGroup ();
@@ -57,78 +61,86 @@ namespace Banshee.Library.Gui
             if (ServiceManager.Contains ("GtkElementsService")) {
                 Dialog.TransientFor = ServiceManager.Get<GtkElementsService> ().PrimaryWindow;
             }
-            
+
             Dialog.WindowPosition = WindowPosition.CenterOnParent;
             Dialog.AddAccelGroup (accel_group);
             Dialog.DefaultResponse = ResponseType.Ok;
+            import_button = (Glade["ImportButton"] as Button);
 
             DoNotShowAgainVisible = doNotShowAgainVisible;
-            
+
             PopulateSourceList ();
-            
+
             ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             ServiceManager.SourceManager.SourceRemoved += OnSourceRemoved;
             ServiceManager.SourceManager.SourceUpdated += OnSourceUpdated;
-            
+
             Glade["MessageLabel"].Visible = ServiceManager.SourceManager.DefaultSource.Count == 0;
-            
-            (Glade["ImportButton"] as Button).AddAccelerator ("activate", accel_group, 
-                (uint)Gdk.Key.Return, 0, AccelFlags.Visible);
-            
+
+            import_button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return, 0, AccelFlags.Visible);
+
             Dialog.StyleSet += delegate {
                 UpdateIcons ();
             };
         }
-        
+
+        private void UpdateImportLabel ()
+        {
+            string label = ActiveSource == null ? null : ActiveSource.ImportLabel;
+            import_button.Label = label ?? Catalog.GetString ("_Import");
+            import_button.WidthRequest = Math.Max (import_button.WidthRequest, 140);
+        }
+
         private void PopulateSourceList ()
         {
             source_model = new ListStore (typeof (Gdk.Pixbuf), typeof (string), typeof (IImportSource));
-            
+
             source_combo_box = new ComboBox ();
+            source_combo_box.Changed += delegate { UpdateImportLabel (); };
             source_combo_box.Model = source_model;
             choose_label.MnemonicWidget = source_combo_box;
-            
+
             CellRendererPixbuf pixbuf_cr = new CellRendererPixbuf ();
             CellRendererText text_cr = new CellRendererText ();
-            
+
             source_combo_box.PackStart (pixbuf_cr, false);
             source_combo_box.PackStart (text_cr, true);
             source_combo_box.SetAttributes (pixbuf_cr, "pixbuf", 0);
             source_combo_box.SetAttributes (text_cr, "text", 1);
-            
+
             TreeIter active_iter = TreeIter.Zero;
-            
+
             List<IImportSource> sources = new List<IImportSource> ();
-            
+
             // Add the standalone import sources
             foreach (IImportSource source in ServiceManager.Get<ImportSourceManager> ()) {
                 sources.Add (source);
             }
-            
+
             // Find active sources that implement IImportSource
             foreach (Source source in ServiceManager.SourceManager.Sources) {
                 if (source is IImportSource) {
                     sources.Add ((IImportSource)source);
                 }
             }
-            
+
             // Sort the sources by their SortOrder properties
             sources.Sort (import_source_comparer);
-            
+
             // And actually add them to the dialog
             foreach (IImportSource source in sources) {
                 AddSource (source);
             }
-            
-            if (!active_iter.Equals(TreeIter.Zero) || (active_iter.Equals (TreeIter.Zero) && 
+
+            if (!active_iter.Equals(TreeIter.Zero) || (active_iter.Equals (TreeIter.Zero) &&
                 source_model.GetIterFirst (out active_iter))) {
                 source_combo_box.SetActiveIter (active_iter);
-            } 
-            
+            }
+
             (Glade["ComboVBox"] as Box).PackStart (source_combo_box, false, false, 0);
             source_combo_box.ShowAll ();
         }
-        
+
         private void UpdateIcons ()
         {
             for (int i = 0, n = source_model.IterNChildren (); i < n; i++) {
@@ -139,26 +151,26 @@ namespace Banshee.Library.Gui
                     if (o != null) {
                         ((Gdk.Pixbuf)o).Dispose ();
                     }
-                    
+
                     source_model.SetValue (iter, 0, GetIcon (source));
                 }
             }
         }
-        
+
         private Gdk.Pixbuf GetIcon (IImportSource source)
         {
             return IconThemeUtils.LoadIcon (22, source.IconNames);
         }
-        
+
         private TreeIter AddSource (IImportSource source)
         {
             if (source == null) {
                 return TreeIter.Zero;
             }
-            
+
             return source_model.AppendValues (GetIcon (source), source.Name, source);
         }
-        
+
         private void OnSourceAdded (SourceAddedArgs args)
         {
             if(args.Source is IImportSource) {
@@ -167,7 +179,7 @@ namespace Banshee.Library.Gui
                 });
             }
         }
-        
+
         private void OnSourceRemoved (SourceEventArgs args)
         {
             if (args.Source is IImportSource) {
@@ -179,7 +191,7 @@ namespace Banshee.Library.Gui
                 });
             }
         }
-        
+
         private void OnSourceUpdated (SourceEventArgs args)
         {
             if (args.Source is IImportSource) {
@@ -191,11 +203,11 @@ namespace Banshee.Library.Gui
                 });
             }
         }
-        
+
         private bool FindSourceIter (out TreeIter iter, IImportSource source)
         {
             iter = TreeIter.Zero;
-            
+
             for (int i = 0, n = source_model.IterNChildren (); i < n; i++) {
                 TreeIter _iter;
                 if (source_model.IterNthChild (out _iter, i)) {
@@ -205,30 +217,30 @@ namespace Banshee.Library.Gui
                     }
                 }
             }
-            
+
             return false;
         }
-        
+
         public bool DoNotShowAgainVisible {
             get { return Glade["DoNotShowCheckBox"].Visible; }
             set { Glade["DoNotShowCheckBox"].Visible = value; }
         }
-        
+
         public bool DoNotShowAgain {
             get { return (Glade["DoNotShowCheckBox"] as CheckButton).Active; }
         }
-        
+
         public IImportSource ActiveSource {
             get {
-                TreeIter iter; 
+                TreeIter iter;
                 if (source_combo_box.GetActiveIter (out iter)) {
                     return (IImportSource)source_model.GetValue (iter, 2);
                 }
-                
+
                 return null;
             }
         }
-         
+
         private static IComparer<IImportSource> import_source_comparer = new ImportSourceComparer ();
         private class ImportSourceComparer : IComparer<IImportSource>
         {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs
index 31249df..602a250 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Library.Gui/PhotoFolderImportSource.cs
@@ -37,18 +37,18 @@ namespace Banshee.Library.Gui
     public class PhotoFolderImportSource : IImportSource
     {
         private string [] photo_folders;
-        
+
         public PhotoFolderImportSource ()
         {
             string personal = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
             string desktop = Environment.GetFolderPath (Environment.SpecialFolder.Desktop);
-            
+
             photo_folders = new string [] {
                 Environment.GetFolderPath (Environment.SpecialFolder.MyPictures),
                 Paths.Combine (desktop, "Photos"), Paths.Combine (desktop, "photos"),
                 Paths.Combine (personal, "Photos"), Paths.Combine (personal, "photos")
             };
-            
+
             // Make sure we don't accidentally scan the entire home or desktop directory
             for (int i = 0; i < photo_folders.Length; i++) {
                 if (photo_folders[i] == personal || photo_folders[i] == desktop) {
@@ -56,25 +56,27 @@ namespace Banshee.Library.Gui
                 }
             }
         }
-    
+
         public void Import ()
         {
             Hyena.Log.DebugFormat ("Importing photo folder: {0}", PhotoFolder);
             Banshee.ServiceStack.ServiceManager.Get<LibraryImportManager> ().Enqueue (PhotoFolder);
         }
-        
+
         public string Name {
-            get { return Catalog.GetString ("Videos from Photos Folder"); }
+            get { return Catalog.GetString ("Videos From Photos Folder"); }
         }
-        
+
+        public string ImportLabel { get { return null; } }
+
         public string [] IconNames {
             get { return new string [] { "gtk-open" }; }
         }
-        
+
         public bool CanImport {
             get { return PhotoFolder != null; }
         }
-        
+
         private string PhotoFolder {
             get {
                 foreach (string folder in photo_folders) {
@@ -85,7 +87,7 @@ namespace Banshee.Library.Gui
                 return null;
             }
         }
-        
+
         public int SortOrder {
             get { return 0; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs
index a16252c..1e2b821 100644
--- a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBox.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections.Generic;
 
@@ -39,17 +39,17 @@ namespace Banshee.MediaProfiles.Gui
         private MediaProfileManager manager;
         private ListStore store;
         private string [] mimetype_filter;
-        
+
         public event EventHandler Updated;
-        
+
         public ProfileComboBox(MediaProfileManager manager)
         {
             this.manager = manager;
-            
+
             BuildWidget();
             ReloadProfiles();
         }
-        
+
         private void BuildWidget()
         {
             store = new ListStore(typeof(string), typeof(Profile));
@@ -57,20 +57,20 @@ namespace Banshee.MediaProfiles.Gui
             store.RowDeleted += delegate { OnUpdated(); };
             store.RowChanged += delegate { OnUpdated(); };
             Model = store;
-            
+
             CellRendererText text_renderer = new CellRendererText();
             PackStart(text_renderer, true);
             AddAttribute(text_renderer, "text", 0);
         }
-        
+
         public void ReloadProfiles()
         {
             Profile active_profile = ActiveProfile;
             TreeIter active_iter;
             store.Clear();
-            
+
             List<Profile> mimetype_profiles = null;
-                
+
             if(mimetype_filter != null && mimetype_filter.Length > 0) {
                 mimetype_profiles = new List<Profile>();
                 foreach(string mimetype in mimetype_filter) {
@@ -80,15 +80,15 @@ namespace Banshee.MediaProfiles.Gui
                     }
                 }
             }
-            
-            if(manager.AvailableProfileCount == 0 || (mimetype_profiles != null && 
+
+            if(manager.AvailableProfileCount == 0 || (mimetype_profiles != null &&
                 mimetype_profiles.Count == 0 && mimetype_filter != null)) {
                 store.AppendValues(Catalog.GetString("No available profiles"), null);
                 Sensitive = false;
             } else {
                 Sensitive = true;
             }
-            
+
             if(mimetype_profiles != null) {
                 foreach(Profile profile in mimetype_profiles) {
                     store.AppendValues(String.Format("{0}", profile.Name), profile);
@@ -98,7 +98,7 @@ namespace Banshee.MediaProfiles.Gui
                     store.AppendValues(String.Format("{0}", profile.Name), profile);
                 }
             }
-            
+
             if(store.IterNthChild(out active_iter, 0)) {
                 SetActiveIter(active_iter);
             }
@@ -118,7 +118,7 @@ namespace Banshee.MediaProfiles.Gui
                 }
             }
         }
-        
+
         protected virtual void OnUpdated()
         {
             EventHandler handler = Updated;
@@ -126,25 +126,25 @@ namespace Banshee.MediaProfiles.Gui
                 handler(this, new EventArgs());
             }
         }
-        
+
         public string [] MimeTypeFilter {
             get { return mimetype_filter; }
-            set { 
+            set {
                 mimetype_filter = value;
                 ReloadProfiles();
             }
         }
-        
+
         public Profile ActiveProfile {
-            get { 
+            get {
                 TreeIter iter;
                 if(GetActiveIter(out iter)) {
                     return store.GetValue(iter, 1) as Profile;
                 }
-                
+
                 return null;
             }
-            
+
             set { SetActiveProfile(value); }
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBoxConfigurable.cs b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBoxConfigurable.cs
index adb75f8..bb61ea3 100644
--- a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBoxConfigurable.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileComboBoxConfigurable.cs
@@ -40,37 +40,37 @@ namespace Banshee.MediaProfiles.Gui
         private ProfileConfigureButton button;
         private DescriptionLabel description;
         private string configuration_id;
-        
-        public ProfileComboBoxConfigurable(MediaProfileManager manager, string configurationId) 
+
+        public ProfileComboBoxConfigurable(MediaProfileManager manager, string configurationId)
             : this(manager, configurationId, null)
         {
         }
-        
-        public ProfileComboBoxConfigurable(MediaProfileManager manager, string configurationId, Box parent) 
+
+        public ProfileComboBoxConfigurable(MediaProfileManager manager, string configurationId, Box parent)
         {
             HBox editor = new HBox();
-            
+
             configuration_id = configurationId;
             combo = new ProfileComboBox(manager);
             combo.Show();
-            
+
             button = new ProfileConfigureButton(configurationId);
             button.ComboBox = combo;
             button.Show();
-            
+
             editor.Spacing = 5;
             editor.PackStart(combo, true, true, 0);
             editor.PackStart(button, false, false, 0);
             editor.Show();
-            
+
             ProfileConfiguration config = manager.GetActiveProfileConfiguration (configurationId);
-            
+
             if (config != null) {
                 Combo.SetActiveProfile(config.Profile);
             }
-            
+
             description = new DescriptionLabel (delegate { return Combo.ActiveProfile.Description; });
-            
+
             Combo.Changed += delegate {
                 if(Combo.ActiveProfile != null) {
                     Hyena.Log.DebugFormat ("Setting active encoding profile: {0} (saved to {1})",
@@ -79,7 +79,7 @@ namespace Banshee.MediaProfiles.Gui
                     description.Update ();
                 }
             };
-            
+
             Combo.StateChanged += delegate {
                 if (Combo.State == StateType.Insensitive) {
                     ((Container)parent ?? this).Remove (description);
@@ -87,16 +87,16 @@ namespace Banshee.MediaProfiles.Gui
                     description.PackInto (parent ?? this, parent != null);
                 }
             };
-            
+
             Spacing = 5;
             PackStart (editor, true, true, 0);
             description.PackInto (parent ?? this, parent != null);
         }
-        
+
         public ProfileComboBox Combo {
             get { return combo; }
         }
-        
+
         public string ConfigurationID {
             get { return configuration_id; }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs
index be3e79c..8288102 100644
--- a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigurationDialog.cs
@@ -41,21 +41,21 @@ namespace Banshee.MediaProfiles.Gui
     {
         private PipelineVariable variable;
         private ListStore model;
-        
+
         public PipelineVariableComboBox(PipelineVariable variable, ListStore model) : base()
         {
             this.variable = variable;
             this.model = model;
         }
-        
+
         protected PipelineVariableComboBox(IntPtr ptr) : base(ptr)
         {
         }
-        
+
         public PipelineVariable Variable {
             get { return variable; }
         }
-        
+
         public ListStore Store {
             get { return model; }
         }
@@ -64,30 +64,30 @@ namespace Banshee.MediaProfiles.Gui
     public class ProfileConfigurationDialog : Gtk.Dialog
     {
         private Profile profile;
-    
+
         private Label header_label = new Label();
         private Hyena.Widgets.WrapLabel description_label = new Hyena.Widgets.WrapLabel();
         private Table normal_controls_table = new Table(1, 1, false);
         private Table advanced_controls_table = new Table(1, 1, false);
         private Expander advanced_expander = new Expander(Catalog.GetString("Advanced"));
         private TextView sexpr_results = null;
-            
+
         private Dictionary<string, Widget> variable_widgets = new Dictionary<string, Widget>();
 
         public ProfileConfigurationDialog(Profile profile) : base()
         {
             this.profile = profile;
-        
+
             HasSeparator = false;
             BorderWidth = 5;
-                    
+
             AccelGroup accel_group = new AccelGroup();
             AddAccelGroup(accel_group);
-            
+
             Button button = new Button(Stock.Close);
             button.CanDefault = true;
             button.Show();
-            
+
             if(ApplicationContext.Debugging) {
                 Button test_button = new Button("Test S-Expr");
                 test_button.Show();
@@ -97,29 +97,29 @@ namespace Banshee.MediaProfiles.Gui
                     }
                 };
                 ActionArea.PackStart(test_button, true, true, 0);
-                
+
                 sexpr_results = new TextView();
             }
-            
+
             AddActionWidget(button, ResponseType.Close);
             DefaultResponse = ResponseType.Close;
             button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return,
                 0, AccelFlags.Visible);
 
             BuildContents();
-            
+
             LoadProfile();
         }
-        
+
         private void BuildContents()
         {
             VBox box = new VBox();
             box.BorderWidth = 8;
             box.Spacing = 10;
             box.Show();
-        
+
             header_label.Xalign = 0.0f;
-            
+
             header_label.Show();
             description_label.Show();
             normal_controls_table.Show();
@@ -132,7 +132,7 @@ namespace Banshee.MediaProfiles.Gui
             box.PackStart(description_label, false, false, 0);
             box.PackStart(normal_controls_table, false, false, 5);
             box.PackStart(advanced_expander, false, false, 0);
-            
+
             if(sexpr_results != null) {
                 ScrolledWindow scroll = new Gtk.ScrolledWindow();
                 scroll.HscrollbarPolicy = PolicyType.Automatic;
@@ -142,24 +142,24 @@ namespace Banshee.MediaProfiles.Gui
                 sexpr_results.SetSizeRequest(-1, 100);
                 scroll.Add(sexpr_results);
                 scroll.ShowAll();
-                
+
                 VSeparator sep = new VSeparator();
                 sep.Show();
-                
+
                 Label label = new Label();
                 label.Markup = "<b>S-Expr Results</b>";
                 label.Xalign = 0.0f;
                 label.Show();
-               
+
                 box.PackStart(sep, false, false, 0);
                 box.PackStart(label, false, false, 0);
                 box.PackStart(scroll, false, false, 0);
             }
 
             VBox.PackStart(box, false, false, 0);
-            
+
             SetSizeRequest(350, -1);
-            
+
             Gdk.Geometry limits = new Gdk.Geometry();
             limits.MinWidth = SizeRequest().Width;
             limits.MaxWidth = Gdk.Screen.Default.Width;
@@ -171,13 +171,13 @@ namespace Banshee.MediaProfiles.Gui
         private void LoadProfile()
         {
             Title = String.Format (Catalog.GetString ("Configuring {0}"), profile.Name);
-            header_label.Markup = String.Format("<big><b>{0}</b></big>", 
+            header_label.Markup = String.Format("<big><b>{0}</b></big>",
                 GLib.Markup.EscapeText(profile.Name));
             description_label.Text = profile.Description;
 
             LoadControlTable(normal_controls_table, false);
             LoadControlTable(advanced_controls_table, true);
-            
+
             advanced_expander.Visible = advanced_controls_table.Visible;
         }
 
@@ -186,19 +186,19 @@ namespace Banshee.MediaProfiles.Gui
             while(table.Children.Length > 0) {
                 table.Remove(table.Children[0]);
             }
-        
+
             table.Resize(1, 1);
-        
+
             table.RowSpacing = 5;
             table.ColumnSpacing = 12;
-            
+
             uint y = 0;
 
             foreach(PipelineVariable variable in profile.Pipeline) {
                 if(advanced != variable.Advanced) {
                     continue;
                 }
-            
+
                 Label label = new Label();
                 label.Show();
                 label.Markup = String.Format("<b>{0}:</b>", GLib.Markup.EscapeText(variable.Name));
@@ -209,31 +209,31 @@ namespace Banshee.MediaProfiles.Gui
                     if(control == null) {
                         throw new ApplicationException("Control could not be created");
                     }
-                    
+
                     variable_widgets.Add(variable.Id, control);
-                    
+
                     if(variable.ControlType != PipelineVariableControlType.Check) {
                         variable_widgets.Add(".label." + variable.Id, label);
                     }
 
                     control.Show();
-                
+
                     table.Resize(y + 1, 2);
-                
+
                     if(variable.ControlType != PipelineVariableControlType.Check) {
                         table.Attach(label, 0, 1, y, y + 1, AttachOptions.Fill, AttachOptions.Fill, 0, 0);
                     }
-                    
-                    table.Attach(control, 1, 2, y, y + 1, 
-                        control is ComboBox ? AttachOptions.Fill : AttachOptions.Fill | AttachOptions.Expand, 
-                        AttachOptions.Fill, 0, 
+
+                    table.Attach(control, 1, 2, y, y + 1,
+                        control is ComboBox ? AttachOptions.Fill : AttachOptions.Fill | AttachOptions.Expand,
+                        AttachOptions.Fill, 0,
                         (uint)(variable.ControlType == PipelineVariableControlType.Check ? 2 : 0));
 
                     y++;
                 } catch {
                 }
             }
-            
+
             foreach(Widget widget in variable_widgets.Values) {
                 if(widget is PipelineVariableComboBox) {
                     OnComboChanged(widget, EventArgs.Empty);
@@ -259,21 +259,21 @@ namespace Banshee.MediaProfiles.Gui
                     return BuildCheck(variable);
             }
         }
-        
+
         private Widget BuildCheck(PipelineVariable variable)
         {
             CheckButton check = new CheckButton(variable.Name);
 
             check.Toggled += delegate {
                 variable.CurrentValue = Convert.ToString(check.Active ? 1 : 0);
-                
+
                 for(int i = 0; i < variable.Enables.Length; i++) {
                    if(variable_widgets.ContainsKey(variable.Enables[i])) {
                        variable_widgets[variable.Enables[i]].Visible = check.Active;
                        variable_widgets[".label." + variable.Enables[i]].Visible = check.Active;
                    }
                 }
-                
+
                 for(int i = 0; i < variable.Disables.Length; i++) {
                    if(variable_widgets.ContainsKey(variable.Disables[i])) {
                        variable_widgets[variable.Disables[i]].Visible = !check.Active;
@@ -281,8 +281,8 @@ namespace Banshee.MediaProfiles.Gui
                    }
                 }
             };
-            
-            check.Active = ((int)variable.CurrentValueNumeric.Value) != 0; 
+
+            check.Active = ((int)variable.CurrentValueNumeric.Value) != 0;
             check.Show();
             return check;
         }
@@ -292,25 +292,25 @@ namespace Banshee.MediaProfiles.Gui
             if(variable.StepValue <= 0.0) {
                 return null;
             }
-            
+
             HBox box = new HBox();
-        
+
             HScale slider = new HScale(variable.MinValue, variable.MaxValue, variable.StepValue);
             slider.DrawValue = true;
             slider.Digits = variable.StepPrecision;
-            
+
             if(variable.DefaultValueNumeric != null) {
                 slider.Value = (double)variable.DefaultValueNumeric;
             }
-            
+
             if(variable.CurrentValueNumeric != null) {
                 slider.Value = (double)variable.CurrentValueNumeric;
             }
-            
+
             slider.ChangeValue += delegate {
                 variable.CurrentValue = slider.Value.ToString();
             };
-            
+
             if(variable.MinLabel != null) {
                 Label min_label = new Label();
                 min_label.Yalign = 0.9f;
@@ -318,9 +318,9 @@ namespace Banshee.MediaProfiles.Gui
                 box.PackStart(min_label, false, false, 0);
                 box.Spacing = 5;
             }
-            
+
             box.PackStart(slider, true, true, 0);
-            
+
             if(variable.MaxLabel != null) {
                 Label max_label = new Label();
                 max_label.Yalign = 0.9f;
@@ -328,9 +328,9 @@ namespace Banshee.MediaProfiles.Gui
                 box.PackStart(max_label, false, false, 0);
                 box.Spacing = 5;
             }
-            
+
             box.ShowAll();
-            
+
             return box;
         }
 
@@ -354,8 +354,8 @@ namespace Banshee.MediaProfiles.Gui
             if(variable.PossibleValuesCount > 0) {
                 foreach(string key in variable.PossibleValuesKeys) {
                     TreeIter iter = ComboAppend(model, variable, variable.PossibleValues[key].Display, key);
-                
-                    if(variable.CurrentValue == key || (active_iter.Equals(TreeIter.Zero) && 
+
+                    if(variable.CurrentValue == key || (active_iter.Equals(TreeIter.Zero) &&
                         variable.DefaultValue == key)) {
                         active_iter = iter;
                     }
@@ -370,7 +370,7 @@ namespace Banshee.MediaProfiles.Gui
                     ComboAppend(model, variable, current.ToString(), current.ToString());
                 }
             }
-            
+
             if(active_iter.Equals(TreeIter.Zero)) {
                 for(int i = 0, n = model.IterNChildren(); i < n; i++) {
                     TreeIter iter;
@@ -383,13 +383,13 @@ namespace Banshee.MediaProfiles.Gui
                     }
                 }
             }
-            
+
             CellRendererText text_renderer = new CellRendererText();
             box.PackStart(text_renderer, true);
             box.AddAttribute(text_renderer, "text", 0);
 
             box.Model = model;
-            
+
             if(active_iter.Equals(TreeIter.Zero)) {
                 if(model.IterNthChild(out active_iter, 0)) {
                     box.SetActiveIter(active_iter);
@@ -397,25 +397,25 @@ namespace Banshee.MediaProfiles.Gui
             } else {
                 box.SetActiveIter(active_iter);
             }
-            
+
             return box;
         }
-        
+
         private void OnComboChanged(object o, EventArgs args)
         {
             if(!(o is PipelineVariableComboBox)) {
                 return;
             }
-            
+
             PipelineVariableComboBox box = o as PipelineVariableComboBox;
             PipelineVariable variable = box.Variable;
             ListStore model = box.Store;
             TreeIter selected_iter = TreeIter.Zero;
-            
+
             if(box.GetActiveIter(out selected_iter)) {
                 variable.CurrentValue = (string)model.GetValue(selected_iter, 1);
-                
-                if(variable.PossibleValuesCount > 0 && 
+
+                if(variable.PossibleValuesCount > 0 &&
                     variable.PossibleValues.ContainsKey(variable.CurrentValue)) {
                     PipelineVariable.PossibleValue possible_value = variable.PossibleValues[variable.CurrentValue];
                     if(possible_value.Disables != null) {
@@ -426,7 +426,7 @@ namespace Banshee.MediaProfiles.Gui
                             }
                         }
                     }
-                    
+
                     if(possible_value.Enables != null) {
                         for(int i = 0; i < possible_value.Enables.Length; i++) {
                             if(variable_widgets.ContainsKey(possible_value.Enables[i])) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigureButton.cs b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigureButton.cs
index 3cbe9ac..d847f6a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigureButton.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.MediaProfiles.Gui/ProfileConfigureButton.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 
@@ -35,17 +35,17 @@ namespace Banshee.MediaProfiles.Gui
     {
         private ProfileComboBox combo;
         private string configuration_id;
-        
+
         public ProfileConfigureButton(string configurationId) : base(Stock.Edit)
         {
             this.configuration_id = configurationId;
         }
-        
+
         protected override void OnClicked()
         {
             Profile profile = combo.ActiveProfile;
             profile.LoadConfiguration(configuration_id);
-            
+
             if(profile != null) {
                 ProfileConfigurationDialog dialog = new ProfileConfigurationDialog(profile);
                 dialog.Run();
@@ -53,7 +53,7 @@ namespace Banshee.MediaProfiles.Gui
                 profile.SaveConfiguration();
             }
         }
-        
+
         private void OnComboUpdated(object o, EventArgs args)
         {
             if(combo != null && combo.ActiveProfile != null && combo.ActiveProfile.Pipeline != null) {
@@ -62,19 +62,19 @@ namespace Banshee.MediaProfiles.Gui
                 Sensitive = false;
             }
         }
-        
+
         public ProfileComboBox ComboBox {
             get { return combo; }
-            set { 
+            set {
                 if(combo == value) {
                     return;
                 } else if(combo != null) {
                     combo.Updated -= OnComboUpdated;
                     combo.Changed -= OnComboUpdated;
                 }
-                
+
                 combo = value;
-                
+
                 if(combo != null) {
                     combo.Updated += OnComboUpdated;
                     combo.Changed += OnComboUpdated;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs
index 91b2704..fe88e58 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Playlist.Gui/PlaylistExportDialog.cs
@@ -12,82 +12,82 @@ namespace Banshee.Playlist.Gui
     public class PlaylistExportDialog : Banshee.Gui.Dialogs.FileChooserDialog
     {
         protected ComboBox combobox;
-        protected ListStore store;    
+        protected ListStore store;
         protected PlaylistFormatDescription playlist;
         protected string initial_name;
-                
-        public PlaylistExportDialog(string name, Window parent) : 
+
+        public PlaylistExportDialog(string name, Window parent) :
             base(Catalog.GetString("Export Playlist"), parent, FileChooserAction.Save)
         {
             initial_name = FileNamePattern.Escape (name);
-            playlist = PlaylistFileUtil.GetDefaultExportFormat();             
+            playlist = PlaylistFileUtil.GetDefaultExportFormat();
             CurrentName = System.IO.Path.ChangeExtension(initial_name, playlist.FileExtension);
             DefaultResponse = ResponseType.Ok;
-            DoOverwriteConfirmation = true;            
-            
+            DoOverwriteConfirmation = true;
+
             AddButton(Stock.Cancel, ResponseType.Cancel);
             AddButton(Catalog.GetString("Export"), ResponseType.Ok);
-            
-            InitializeExtraWidget();                   
+
+            InitializeExtraWidget();
         }
-        
-        protected void InitializeExtraWidget() 
-        {               
+
+        protected void InitializeExtraWidget()
+        {
             PlaylistFormatDescription [] formats = PlaylistFileUtil.ExportFormats;
             int default_export_index = PlaylistFileUtil.GetFormatIndex(formats, playlist);
-            
+
             // Build custom widget used to select the export format.
             store = new ListStore(typeof(string), typeof(PlaylistFormatDescription));
             foreach (PlaylistFormatDescription format in formats) {
                 store.AppendValues(format.FormatName, format);
             }
-                                    
+
             HBox hBox = new HBox(false, 2);
-            
+
             combobox = new ComboBox(store);
             CellRendererText crt = new CellRendererText();
             combobox.PackStart(crt, true);
             combobox.SetAttributes(crt, "text", 0);
             combobox.Active = default_export_index;
             combobox.Changed += OnComboBoxChange;
-            
+
             hBox.PackStart(new Label(Catalog.GetString("Select Format: ")), false, false, 0);
             hBox.PackStart(combobox, true, true, 0);
-            
+
             combobox.ShowAll();
-            hBox.ShowAll();            
-            ExtraWidget = hBox; 
+            hBox.ShowAll();
+            ExtraWidget = hBox;
         }
-        
+
         protected void OnComboBoxChange(object o, EventArgs args)
         {
             playlist = GetExportFormat();
-            
+
             if (playlist != null) {
                 // Store the export format so that we can default to it the
                 // next time the user exports.
                 PlaylistFileUtil.SetDefaultExportFormat(playlist);
-                
+
                 // If the filename has an extension, update it to the extension
                 // of the export format.
                 string file_name = null;
-                
+
                 if (Filename != null) {
                     file_name = System.IO.Path.GetFileName(Filename);
                 }
-                                
+
                 if (file_name != null) {
                     CurrentName = System.IO.Path.ChangeExtension(file_name, playlist.FileExtension);
                 } else {
                     CurrentName = System.IO.Path.ChangeExtension(initial_name, playlist.FileExtension);
                 }
-            }            
+            }
         }
-        
-        public PlaylistFormatDescription GetExportFormat() 
+
+        public PlaylistFormatDescription GetExportFormat()
         {
             PlaylistFormatDescription selected_playlist = null;
-            
+
             // Get the format that the user selected.
             if (combobox != null && store != null) {
                 TreeIter iter;
@@ -95,7 +95,7 @@ namespace Banshee.Playlist.Gui
                     selected_playlist = store.GetValue(iter, 1) as PlaylistFormatDescription;
                 }
             }
-            
+
             return selected_playlist;
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs
index 41e5d29..5edc31b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DefaultPreferenceWidgets.cs
@@ -50,29 +50,29 @@ namespace Banshee.Preferences.Gui
         public static void Load (PreferenceService service)
         {
             Page music = ServiceManager.SourceManager.MusicLibrary.PreferencesPage;
-        
+
             foreach (LibrarySource source in ServiceManager.SourceManager.FindSources<LibrarySource> ()) {
                 new LibraryLocationButton (source);
             }
-            
+
             PreferenceBase folder_pattern = music["file-system"]["folder_pattern"];
             folder_pattern.DisplayWidget = new PatternComboBox (folder_pattern, FileNamePattern.SuggestedFolders);
-            
+
             PreferenceBase file_pattern = music["file-system"]["file_pattern"];
             file_pattern.DisplayWidget = new PatternComboBox (file_pattern, FileNamePattern.SuggestedFiles);
-            
+
             PreferenceBase pattern_display = music["file-system"].FindOrAdd (new VoidPreference ("file_folder_pattern"));
             pattern_display.DisplayWidget = new PatternDisplay (folder_pattern.DisplayWidget, file_pattern.DisplayWidget);
-            
+
             // Set up the extensions tab UI
             Banshee.Addins.Gui.AddinView view = new Banshee.Addins.Gui.AddinView ();
             view.Show ();
-            
+
             Gtk.ScrolledWindow scroll = new Gtk.ScrolledWindow ();
             scroll.HscrollbarPolicy = PolicyType.Never;
             scroll.AddWithViewport (view);
             scroll.Show ();
-            
+
             service["extensions"].DisplayWidget = scroll;
         }
 
@@ -92,9 +92,9 @@ namespace Banshee.Preferences.Gui
                 preference.DisplayWidget = this;
 
                 string dir = preference.Value ?? source.DefaultBaseDirectory;
-                
+
                 Spacing = 5;
-                
+
                 // FileChooserButton wigs out if the directory does not exist,
                 // so create it if it doesn't and store the fact that we did
                 // in case it ends up not being used, we can remove it
@@ -103,15 +103,15 @@ namespace Banshee.Preferences.Gui
                         Banshee.IO.Directory.Create (dir);
                         created_directory = dir;
                         Log.DebugFormat ("Created library directory: {0}", created_directory);
-                    } 
+                    }
                 } catch {
                 }
 
-                chooser = new FileChooserButton (Catalog.GetString ("Select library location"), 
+                chooser = new FileChooserButton (Catalog.GetString ("Select library location"),
                     FileChooserAction.SelectFolder);
                 chooser.SetCurrentFolder (dir);
                 chooser.SelectionChanged += OnChooserChanged;
-                    
+
                 HBox box = new HBox ();
                 box.Spacing = 2;
                 box.PackStart (new Image (Stock.Undo, IconSize.Button), false, false, 0);
@@ -126,15 +126,15 @@ namespace Banshee.Preferences.Gui
                 //Button open = new Button ();
                 //open.PackStart (new Image (Stock.Open, IconSize.Button), false, false, 0);
                 //open.Clicked += OnOpen;
-                
+
                 PackStart (chooser, true, true, 0);
                 PackStart (reset, false, false, 0);
                 //PackStart (open, false, false, 0);
-                
+
                 chooser.Show ();
                 reset.ShowAll ();
             }
-            
+
             private void OnReset (object o, EventArgs args)
             {
                 chooser.SetFilename (source.DefaultBaseDirectory);
@@ -144,7 +144,7 @@ namespace Banshee.Preferences.Gui
             //{
                 //open chooser.Filename
             //}
-            
+
             private void OnChooserChanged (object o, EventArgs args)
             {
                 preference.Value = chooser.Filename;
@@ -165,59 +165,59 @@ namespace Banshee.Preferences.Gui
                     } catch {
                     }
                 }
-                
+
                 base.OnUnrealized ();
             }
         }
-        
+
         private class PatternComboBox : DictionaryComboBox<string>
         {
             private Preference<string> preference;
-            
+
             public PatternComboBox (PreferenceBase pref, string [] patterns)
             {
                 preference = (Preference<string>)pref;
-                
+
                 bool already_added = false;
                 string conf_pattern = preference.Value;
-                
+
                 foreach (string pattern in patterns) {
                     if (!already_added && pattern.Equals (conf_pattern)) {
                         already_added = true;
                     }
-                    
+
                     Add (FileNamePattern.CreatePatternDescription (pattern), pattern);
                 }
-                
+
                 if (!already_added) {
                     Add (FileNamePattern.CreatePatternDescription (conf_pattern), conf_pattern);
                 }
-                
+
                 ActiveValue = conf_pattern;
             }
-            
+
             protected override void OnChanged ()
             {
                 preference.Value = ActiveValue;
                 base.OnChanged ();
             }
         }
-        
+
         private class PatternDisplay : WrapLabel
         {
             private PatternComboBox folder;
             private PatternComboBox file;
-            
+
             private SampleTrackInfo track = new SampleTrackInfo ();
-            
+
             public PatternDisplay (object a, object b)
             {
                 folder= (PatternComboBox)a;
                 file = (PatternComboBox)b;
-                
+
                 folder.Changed += OnChanged;
                 file.Changed += OnChanged;
-                
+
                 OnChanged (null, null);
             }
 
@@ -225,8 +225,8 @@ namespace Banshee.Preferences.Gui
             {
                 string display = FileNamePattern.CreateFromTrackInfo (FileNamePattern.CreateFolderFilePattern (
                     folder.ActiveValue, file.ActiveValue), track);
-            
-                Markup = String.IsNullOrEmpty (display) ? String.Empty : String.Format ("<small>{0}.ogg</small>", 
+
+                Markup = String.IsNullOrEmpty (display) ? String.Empty : String.Format ("<small>{0}.ogg</small>",
                     GLib.Markup.EscapeText (display));
             }
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DescriptionLabel.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DescriptionLabel.cs
index ce9051a..bd920f0 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DescriptionLabel.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/DescriptionLabel.cs
@@ -36,7 +36,7 @@ namespace Banshee.Preferences.Gui
     {
         public delegate string DescriptionHandler ();
         private DescriptionHandler handler;
-        
+
         public DescriptionLabel (string text) : base ()
         {
             Set (text);
@@ -56,7 +56,7 @@ namespace Banshee.Preferences.Gui
                 Set (handler ());
             }
         }
-        
+
         public void PackInto (Box parent, bool expand)
         {
             parent.PackStart (this, expand, expand, 0);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/NotebookPage.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/NotebookPage.cs
index 4e153b0..4331311 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/NotebookPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/NotebookPage.cs
@@ -39,22 +39,22 @@ namespace Banshee.Preferences.Gui
         public Page Page {
             get { return page; }
         }
-        
+
         private Label tab_widget;
         public Widget TabWidget {
             get { return tab_widget; }
         }
-        
+
         public NotebookPage (Page page)
         {
             this.page = page;
-            
+
             BorderWidth = 5;
             Spacing = 10;
-            
+
             tab_widget = new Label (page.Name);
             tab_widget.Show ();
-            
+
             Widget page_widget = page.DisplayWidget as Widget;
             if (page_widget != null) {
                 page_widget.Show ();
@@ -88,15 +88,15 @@ namespace Banshee.Preferences.Gui
                 }
             }
         }
-        
+
         private void AddSection (Section section)
         {
             Frame frame = null;
-            
+
             if (section.Count == 0) {
                 return;
             }
-            
+
             if (section.ShowLabel) {
                 frame = new Frame ();
                 Label label = new Label ();
@@ -109,22 +109,22 @@ namespace Banshee.Preferences.Gui
                 frame.Shadow = ShadowType.None;
                 frame.Show ();
                 PackStart (frame, false, false, 0);
-            } 
-            
+            }
+
             Alignment alignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
             alignment.TopPadding = (uint)(frame == null ? 0 : 5);
-            alignment.LeftPadding = 12;
+            alignment.LeftPadding = section.ShowLabel ? (uint)12 : (uint)0;
             alignment.Show ();
-            
+
             if (frame != null) {
                 frame.Add (alignment);
             } else {
                 PackStart (alignment, false, false, 0);
             }
-            
+
             SectionBox box = new SectionBox (section);
             box.Show ();
-            
+
             alignment.Add (box);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PageComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PageComboBox.cs
index fb8c2c7..8d9d427 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PageComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PageComboBox.cs
@@ -32,13 +32,13 @@ using Gtk;
 using Banshee.ServiceStack;
 
 namespace Banshee.Preferences.Gui
-{ 
+{
     public class PageComboBox : ComboBox
     {
         private ListStore model;
         private Notebook notebook;
         private IList<Page> pages;
-        
+
         public PageComboBox (IList<Page> pages, Notebook notebook)
         {
             this.pages = pages;
@@ -80,10 +80,10 @@ namespace Banshee.Preferences.Gui
                 }
             }
         }
-        
+
         protected override void OnChanged ()
         {
             notebook.CurrentPage = Active;
         }
-    } 
+    }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs
index ab1374d..f3ea93d 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/PreferenceDialog.cs
@@ -43,24 +43,24 @@ namespace Banshee.Preferences.Gui
     public class PreferenceDialog : BansheeDialog
     {
         private PreferenceService service;
-        
+
         private Dictionary<string, NotebookPage> pages = new Dictionary<string, NotebookPage> ();
         private Notebook notebook;
-        
+
         public PreferenceDialog () : base (Catalog.GetString ("Preferences"))
         {
             service = ServiceManager.Get<PreferenceService> ();
-            
+
             if (service == null) {
-                Log.Error (Catalog.GetString ("Could not show preferences"), 
+                Log.Error (Catalog.GetString ("Could not show preferences"),
                     Catalog.GetString ("The preferences service could not be found."), true);
-                
+
                 throw new ApplicationException ();
             }
-            
+
             DefaultPreferenceWidgets.Load (service);
             service.RequestWidgetAdapters ();
-            
+
             BuildDialog ();
             LoadPages ();
         }
@@ -81,40 +81,40 @@ namespace Banshee.Preferences.Gui
                 }
             }
         }
-        
+
         private void BuildDialog ()
         {
             SetDefaultSize (-1, 400);
 
             AddDefaultCloseButton ();
-            
+
             if (service.Count > 1) {
                 notebook = new Notebook ();
                 notebook.Show ();
-            
+
                 VBox.PackStart (notebook, true, true, 0);
             }
         }
-        
+
         private void LoadPages ()
         {
             foreach (Page page in service) {
                 LoadPage (page);
             }
         }
-        
+
         private void LoadPage (Page page)
         {
             if (pages.ContainsKey (page.Id)) {
-                Log.Warning (String.Format ("Preferences notebook already contains a page with the id `{0}'", 
+                Log.Warning (String.Format ("Preferences notebook already contains a page with the id `{0}'",
                     page.Id), false);
                 return;
             }
-            
+
             NotebookPage page_ui = new NotebookPage (page);
             page_ui.Show ();
             pages.Add (page.Id, page_ui);
-            
+
             if (service.Count == 1) {
                 VBox.PackStart (page_ui, false, false, 0);
             } else {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/SectionBox.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/SectionBox.cs
index 6530c59..d104966 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/SectionBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/SectionBox.cs
@@ -37,70 +37,70 @@ namespace Banshee.Preferences.Gui
     public class SectionBox : Table
     {
         private object tp_host;
-    
+
         public SectionBox (Section section) : base (1, 2, false)
         {
             ColumnSpacing = 10;
             RowSpacing = 5;
-        
+
             foreach (PreferenceBase preference in section) {
                 Widget widget = WidgetFactory.GetWidget (preference);
                 if (widget == null) {
                     continue;
                 }
-                
+
                 AddWidget (preference, widget, WidgetFactory.GetMnemonicWidget (preference));
             }
         }
-        
+
         private void AddWidget (PreferenceBase preference, Widget widget, Widget mnemonic_widget)
         {
             uint start_row = NRows;
             uint start_col = 0;
-            
+
             Label label = null;
-            
+
             if (!(widget is CheckButton) && preference.ShowLabel) {
                 label = AttachLabel (preference.Name, start_row);
                 start_col++;
             }
-            
+
             widget.Show ();
-            Attach (widget, start_col, 2, start_row, start_row + 1, 
-                AttachOptions.Expand | AttachOptions.Fill, 
+            Attach (widget, start_col, 2, start_row, start_row + 1,
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
+
             if (label != null) {
                 label.MnemonicWidget = mnemonic_widget ?? widget;
             }
-                
+
             if (!String.IsNullOrEmpty (preference.Description)) {
                 if (tp_host == null) {
                      tp_host = TooltipSetter.CreateHost ();
                 }
-                
+
                 TooltipSetter.Set (tp_host, widget, preference.Description);
                 if (label != null) {
                     TooltipSetter.Set (tp_host, label, preference.Description);
                 }
             }
         }
-        
+
         private Label AttachLabel (string text, uint start_row)
         {
             if (String.IsNullOrEmpty (text)) {
                 return null;
             }
-        
+
             Label label = new Label (String.Format ("{0}:", text));
             label.UseUnderline = true;
             label.Xalign = 0.0f;
             label.Show ();
-            
-            Attach (label, 0, 1, start_row, start_row + 1, 
-                AttachOptions.Fill, 
+
+            Attach (label, 0, 1, start_row, start_row + 1,
+                AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-            
+
             return label;
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/WidgetFactory.cs b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/WidgetFactory.cs
index 50529ad..1842c5f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/WidgetFactory.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Preferences.Gui/WidgetFactory.cs
@@ -44,10 +44,10 @@ namespace Banshee.Preferences.Gui
 
             Widget widget = preference.DisplayWidget as Widget;
             //OnPreferenceChanged (preference);
-            
+
             return widget ?? GetWidget (preference, preference.GetType ().GetProperty ("Value").PropertyType);
         }
-        
+
         private static Widget GetWidget (PreferenceBase preference, Type type)
         {
             Widget pref_widget = null;
@@ -94,7 +94,7 @@ namespace Banshee.Preferences.Gui
                     });
                 };
             }
-            
+
             return widget ?? pref_widget;
         }
 
@@ -103,15 +103,15 @@ namespace Banshee.Preferences.Gui
             if (preference == null) {
                 return null;
             }
-            
+
             return preference.MnemonicWidget as Widget;
         }
-        
+
         private class PreferenceCheckButton : CheckButton
         {
             private bool sync;
             private PreferenceBase preference;
-            
+
             public PreferenceCheckButton (PreferenceBase preference)
             {
                 this.preference = preference;
@@ -120,22 +120,22 @@ namespace Banshee.Preferences.Gui
                 Active = (bool)preference.BoxedValue;
                 sync = true;
             }
-            
+
             protected override void OnToggled ()
             {
                 base.OnToggled ();
-                
+
                 if (sync) {
                     preference.BoxedValue = Active;
                 }
             }
         }
-        
+
         private class PreferenceEntry : Entry
         {
             private bool sync;
             private PreferenceBase preference;
-            
+
             public PreferenceEntry (PreferenceBase preference)
             {
                 this.preference = preference;
@@ -143,11 +143,11 @@ namespace Banshee.Preferences.Gui
                 Text = value ?? String.Empty;
                 sync = true;
             }
-            
+
             protected override void OnChanged ()
             {
                 base.OnChanged ();
-                
+
                 if (sync) {
                     preference.BoxedValue = Text;
                 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/BansheeQueryBox.cs b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/BansheeQueryBox.cs
index 7fa9743..6a3d292 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/BansheeQueryBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/BansheeQueryBox.cs
@@ -47,6 +47,7 @@ namespace Banshee.Query.Gui
             QueryValueEntry.AddSubType (typeof(RatingQueryValueEntry), typeof(RatingQueryValue));
             QueryValueEntry.AddSubType (typeof(PlaylistQueryValueEntry), typeof(PlaylistQueryValue));
             QueryValueEntry.AddSubType (typeof(SmartPlaylistQueryValueEntry), typeof(SmartPlaylistQueryValue));
+            QueryValueEntry.AddSubType (typeof(PlaybackErrorQueryValueEntry), typeof(PlaybackErrorQueryValue));
         }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaybackErrorQueryValueEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaybackErrorQueryValueEntry.cs
new file mode 100644
index 0000000..2fc5bde
--- /dev/null
+++ b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaybackErrorQueryValueEntry.cs
@@ -0,0 +1,89 @@
+//
+// PlaybackErrorQueryValueEntry.cs
+//
+// Author:
+//   Alexander Kojevnikov <alexander at kojevnikov.com>
+//
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using Gtk;
+
+using Hyena.Query;
+using Hyena.Query.Gui;
+
+using Banshee.Widgets;
+using Banshee.Query;
+
+namespace Banshee.Query.Gui
+{
+    public class PlaybackErrorQueryValueEntry : QueryValueEntry
+    {
+        protected ComboBox combo;
+        protected PlaybackErrorQueryValue query_value;
+        protected Dictionary<int, int> combo_error_id_map = new Dictionary<int, int> ();
+
+        public PlaybackErrorQueryValueEntry () : base ()
+        {
+        }
+
+        public override QueryValue QueryValue {
+            get { return query_value; }
+            set {
+                if (combo != null) {
+                    Remove (combo);
+                }
+
+                combo = ComboBox.NewText();
+                combo.WidthRequest = DefaultWidth;
+
+                Add (combo);
+                combo.Show ();
+
+                query_value = (PlaybackErrorQueryValue)value;
+                combo_error_id_map.Clear ();
+
+                int count = 0;
+                int active = 0;
+                foreach (var item in query_value.Items) {
+                    combo.AppendText (item.DisplayName);
+                    combo_error_id_map.Add (count++, item.ID);
+                    if (item.ID == (int)query_value.Value) {
+                        active = count - 1;
+                    }
+                }
+
+                combo.Changed += HandleValueChanged;
+                combo.Active = active;
+            }
+        }
+
+        protected void HandleValueChanged (object o, EventArgs args)
+        {
+            if (combo_error_id_map.ContainsKey (combo.Active)) {
+                query_value.SetValue (combo_error_id_map [combo.Active]);
+            }
+        }
+    }
+}
diff --git a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaylistQueryValueEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaylistQueryValueEntry.cs
index 2d7dd1f..ff9b229 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaylistQueryValueEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/PlaylistQueryValueEntry.cs
@@ -72,7 +72,7 @@ namespace Banshee.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 combo.Changed -= HandleValueChanged;
                 query_value = value as PlaylistQueryValue;
                 if (!query_value.IsEmpty) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/RatingQueryValueEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/RatingQueryValueEntry.cs
index dc65b29..ce790b5 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/RatingQueryValueEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/RatingQueryValueEntry.cs
@@ -54,7 +54,7 @@ namespace Banshee.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 entry.Changed -= HandleValueChanged;
                 query_value = value as RatingQueryValue;
                 entry.Value = (int) (query_value.IsEmpty ? query_value.DefaultValue : query_value.IntValue);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs
index 1d12591..86e7493 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs
@@ -75,7 +75,7 @@ namespace Banshee.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 combo.Changed -= HandleValueChanged;
                 query_value = value as SmartPlaylistQueryValue;
                 if (!query_value.IsEmpty) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs b/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs
index 84694fe..866a6c4 100644
--- a/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs
@@ -7,7 +7,7 @@ using Mono.Unix;
 
 using Hyena.Query;
 using Hyena.Query.Gui;
- 
+
 using Banshee.Base;
 using Banshee.Query;
 using Banshee.ServiceStack;
@@ -70,7 +70,7 @@ namespace Banshee.SmartPlaylist
                 currently_editing = playlist;
             }
         }
-    
+
         public Editor (PrimarySource primary_source) : base ("SmartPlaylistEditorDialog")
         {
             this.primary_source = primary_source;
@@ -119,7 +119,7 @@ namespace Banshee.SmartPlaylist
             }
 
             Update ();
-            
+
             name_entry.GrabFocus ();
         }
 
@@ -168,7 +168,7 @@ namespace Banshee.SmartPlaylist
                     if (c.Length > 0) {
                         if (i > 0)
                             condition += "OR";
-                        
+
                         condition += " (" + c  + ") ";
                     }
                 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CellEditEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CellEditEntry.cs
index 640c113..f669f3b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CellEditEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CellEditEntry.cs
@@ -35,12 +35,12 @@ namespace Banshee.Sources.Gui
     {
         public string path;
         private bool fired_edit_done = false;
-    
+
         public CellEditEntry () : base ()
         {
             MaxLength = 256;
         }
-        
+
         protected override bool OnFocusOutEvent (Gdk.EventFocus focus)
         {
             if (!fired_edit_done) {
@@ -49,7 +49,7 @@ namespace Banshee.Sources.Gui
             RemoveWidget ();
             return base.OnFocusOutEvent (focus);
         }
-        
+
         protected override void OnEditingDone ()
         {
             fired_edit_done = true;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
index 8be3609..366cbe1 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
@@ -66,17 +66,17 @@ namespace Banshee.Sources.Gui
             SetupFilterView (artist_view = new ArtistListView ());
             SetupFilterView (album_view = new AlbumListView ());
         }
-        
+
         protected override void ClearFilterSelections ()
         {
             // if (genre_view.Model != null) {
             //     genre_view.Selection.Clear ();
             // }
-            
+
             if (artist_view.Model != null) {
                 artist_view.Selection.Clear ();
             }
-            
+
             if (album_view.Model != null) {
                 album_view.Selection.Clear ();
             }
@@ -89,7 +89,7 @@ namespace Banshee.Sources.Gui
             SetModel (album);
             // SetModel (genre);
         }
-        
+
         IListView<TrackInfo> ITrackModelSourceContents.TrackView {
             get { return track_view; }
         }
@@ -107,7 +107,7 @@ namespace Banshee.Sources.Gui
                 if (!(ServiceManager.SourceManager.ActiveSource is ITrackModelSource)) {
                     return false;
                 }
-                
+
                 return ((ITrackModelSource)ServiceManager.SourceManager.ActiveSource).ShowBrowser;
             }
         }
@@ -121,11 +121,11 @@ namespace Banshee.Sources.Gui
             if (track_source == null) {
                 return false;
             }
-            
+
             this.source = source;
-            
+
             SetModel (track_view, track_source.TrackModel);
-            
+
             if (filterable_source != null && filterable_source.CurrentFilters != null) {
                 foreach (IListModel model in filterable_source.CurrentFilters) {
                     if (model is IListModel<ArtistInfo>)
@@ -138,7 +138,7 @@ namespace Banshee.Sources.Gui
                     //    Hyena.Log.DebugFormat ("CompositeTrackSourceContents got non-album/artist filter model: {0}", model);
                 }
             }
-            
+
             track_view.HeaderVisible = true;
             return true;
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
index 0247862..8e7c30e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
@@ -55,17 +55,17 @@ namespace Banshee.Sources.Gui
         private string name;
         private object main_view;
         private Gtk.ScrolledWindow main_scrolled_window;
-        
+
         private List<object> filter_views = new List<object> ();
         private List<ScrolledWindow> filter_scrolled_windows = new List<ScrolledWindow> ();
-        
+
         private Dictionary<object, double> model_positions = new Dictionary<object, double> ();
-        
+
         private Paned container;
         private Widget browser_container;
         private InterfaceActionService action_service;
         private ActionGroup browser_view_actions;
-        
+
         private static string menu_xml = @"
             <ui>
               <menubar name=""MainMenu"">
@@ -86,68 +86,68 @@ namespace Banshee.Sources.Gui
         {
             this.name = name;
             InitializeViews ();
-            
+
             string position = ForcePosition == null ? BrowserPosition.Get () : ForcePosition;
             if (position == "top") {
                 LayoutTop ();
             } else {
                 LayoutLeft ();
             }
-            
+
             if (ForcePosition != null) {
                 return;
             }
-            
+
             if (ServiceManager.Contains ("InterfaceActionService")) {
                 action_service = ServiceManager.Get<InterfaceActionService> ();
-                
+
                 if (action_service.FindActionGroup ("BrowserView") == null) {
                     browser_view_actions = new ActionGroup ("BrowserView");
-                    
+
                     browser_view_actions.Add (new RadioActionEntry [] {
-                        new RadioActionEntry ("BrowserLeftAction", null, 
+                        new RadioActionEntry ("BrowserLeftAction", null,
                             Catalog.GetString ("Browser on Left"), null,
                             Catalog.GetString ("Show the artist/album browser to the left of the track list"), 0),
-                        
+
                         new RadioActionEntry ("BrowserTopAction", null,
                             Catalog.GetString ("Browser on Top"), null,
                             Catalog.GetString ("Show the artist/album browser above the track list"), 1),
                     }, position == "top" ? 1 : 0, null);
-                    
+
                     browser_view_actions.Add (new ToggleActionEntry [] {
                         new ToggleActionEntry ("BrowserVisibleAction", null,
                             Catalog.GetString ("Show Browser"), "<control>B",
-                            Catalog.GetString ("Show or hide the artist/album browser"), 
+                            Catalog.GetString ("Show or hide the artist/album browser"),
                             null, BrowserVisible.Get ())
                     });
-                    
+
                     action_service.AddActionGroup (browser_view_actions);
                     //action_merge_id = action_service.UIManager.NewMergeId ();
                     action_service.UIManager.AddUiFromString (menu_xml);
                 }
-                
+
                 (action_service.FindAction("BrowserView.BrowserLeftAction") as RadioAction).Changed += OnViewModeChanged;
                 (action_service.FindAction("BrowserView.BrowserTopAction") as RadioAction).Changed += OnViewModeChanged;
                 action_service.FindAction("BrowserView.BrowserVisibleAction").Activated += OnToggleBrowser;
             }
-            
+
             ServiceManager.SourceManager.ActiveSourceChanged += delegate {
                 Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                     browser_container.Visible = ActiveSourceCanHasBrowser ? BrowserVisible.Get () : false;
                 });
             };
-            
+
             NoShowAll = true;
         }
-        
+
         protected abstract void InitializeViews ();
-        
+
         protected void SetupMainView<T> (ListView<T> main_view)
         {
             this.main_view = main_view;
             main_scrolled_window = SetupView (main_view);
         }
-        
+
         protected void SetupFilterView<T> (ListView<T> filter_view)
         {
             ScrolledWindow window = SetupView (filter_view);
@@ -155,7 +155,7 @@ namespace Banshee.Sources.Gui
             filter_view.HeaderVisible = false;
             filter_view.SelectionProxy.Changed += OnBrowserViewSelectionChanged;
         }
-        
+
         private ScrolledWindow SetupView (Widget view)
         {
             ScrolledWindow window = null;
@@ -166,19 +166,19 @@ namespace Banshee.Sources.Gui
             } else {
                 window = new ScrolledWindow ();
             }
-            
+
             window.Add (view);
             window.HscrollbarPolicy = PolicyType.Automatic;
             window.VscrollbarPolicy = PolicyType.Automatic;
 
             return window;
         }
-        
+
         private void Reset ()
         {
-            // Unparent the views' scrolled window parents so they can be re-packed in 
+            // Unparent the views' scrolled window parents so they can be re-packed in
             // a new layout. The main container gets destroyed since it will be recreated.
-            
+
             foreach (ScrolledWindow window in filter_scrolled_windows) {
                 Paned filter_container = window.Parent as Paned;
                 if (filter_container != null) {
@@ -189,7 +189,7 @@ namespace Banshee.Sources.Gui
             if (container != null && main_scrolled_window != null) {
                 container.Remove (main_scrolled_window);
             }
-            
+
             if (container != null) {
                 Remove (container);
             }
@@ -199,7 +199,7 @@ namespace Banshee.Sources.Gui
         {
             Layout (false);
         }
-        
+
         private void LayoutTop ()
         {
             Layout (true);
@@ -209,12 +209,12 @@ namespace Banshee.Sources.Gui
         {
             //Hyena.Log.Information ("ListBrowser LayoutLeft");
             Reset ();
-            
+
             container = GetPane (!top);
             Paned filter_box = GetPane (top);
             filter_box.PositionSet = true;
             Paned current_pane = filter_box;
-            
+
             for (int i = 0; i < filter_scrolled_windows.Count; i++) {
                 ScrolledWindow window = filter_scrolled_windows[i];
                 bool last_even_filter = (i == filter_scrolled_windows.Count - 1 && filter_scrolled_windows.Count % 2 == 0);
@@ -225,7 +225,7 @@ namespace Banshee.Sources.Gui
                     PersistentPaneController.Control (current_pane, ControllerName (top, i));
                     current_pane = new_pane;
                 }
-               
+
                 if (last_even_filter) {
                     current_pane.Pack2 (window, true, false);
                     current_pane.Position = 350;
@@ -233,18 +233,18 @@ namespace Banshee.Sources.Gui
                 } else {
                     current_pane.Pack1 (window, false, false);
                 }
-                    
+
             }
-            
+
             container.Pack1 (filter_box, false, false);
             container.Pack2 (main_scrolled_window, true, false);
             browser_container = filter_box;
-            
+
             container.Position = top ? 175 : 275;
             PersistentPaneController.Control (container, ControllerName (top, -1));
             ShowPack ();
         }
-        
+
         private string ControllerName (bool top, int filter)
         {
             if (filter == -1)
@@ -252,7 +252,7 @@ namespace Banshee.Sources.Gui
             else
                 return String.Format ("{0}.browser.{1}.{2}", name, top ? "top" : "left", filter);
         }
-        
+
         private Paned GetPane (bool hpane)
         {
             if (hpane)
@@ -260,7 +260,7 @@ namespace Banshee.Sources.Gui
             else
                 return new VPaned ();
         }
-        
+
         private void ShowPack ()
         {
             PackStart (container, true, true, 0);
@@ -269,7 +269,7 @@ namespace Banshee.Sources.Gui
             NoShowAll = true;
             browser_container.Visible = ForcePosition != null || BrowserVisible.Get ();
         }
-        
+
         private void OnViewModeChanged (object o, ChangedArgs args)
         {
             //Hyena.Log.InformationFormat ("ListBrowser mode toggled, val = {0}", args.Current.Value);
@@ -281,21 +281,21 @@ namespace Banshee.Sources.Gui
                 BrowserPosition.Set ("top");
             }
         }
-                
+
         private void OnToggleBrowser (object o, EventArgs args)
         {
             ToggleAction action = (ToggleAction)o;
-            
+
             browser_container.Visible = action.Active && ActiveSourceCanHasBrowser;
             BrowserVisible.Set (action.Active);
-            
+
             if (!browser_container.Visible) {
                 ClearFilterSelections ();
             }
         }
-        
+
         protected abstract void ClearFilterSelections ();
-        
+
         protected virtual void OnBrowserViewSelectionChanged (object o, EventArgs args)
         {
             // If the All item is now selected, scroll to the top
@@ -320,7 +320,7 @@ namespace Banshee.Sources.Gui
                 Hyena.Log.DebugFormat ("Unable to find view for model {0}", model);
             }
         }
-        
+
         protected void SetModel<T> (ListView<T> view, IListModel<T> model)
         {
             if (view.Model != null) {
@@ -331,26 +331,26 @@ namespace Banshee.Sources.Gui
                 view.SetModel (null);
                 return;
             }
-            
+
             if (!model_positions.ContainsKey (model)) {
                 model_positions[model] = 0.0;
             }
-            
+
             view.SetModel (model, model_positions[model]);
         }
-        
+
         private ListView<T> FindListView<T> ()
         {
             if (main_view is ListView<T>)
                 return (ListView<T>) main_view;
-        
+
             foreach (object view in filter_views)
                 if (view is ListView<T>)
                     return (ListView<T>) view;
 
             return null;
         }
-        
+
         protected virtual string ForcePosition {
             get { return null; }
         }
@@ -374,14 +374,14 @@ namespace Banshee.Sources.Gui
         }
 
 #endregion
-        
+
         public static readonly SchemaEntry<bool> BrowserVisible = new SchemaEntry<bool> (
             "browser", "visible",
             true,
             "Artist/Album Browser Visibility",
             "Whether or not to show the Artist/Album browser"
         );
-        
+
         public static readonly SchemaEntry<string> BrowserPosition = new SchemaEntry<string> (
             "browser", "position",
             "left",
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ISourceContents.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ISourceContents.cs
index c93b8c4..907d96c 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ISourceContents.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ISourceContents.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ISourceContents.cs
 //
 // Author:
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ITrackModelSourceContents.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ITrackModelSourceContents.cs
index c940990..2e5b0d7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ITrackModelSourceContents.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/ITrackModelSourceContents.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ITrackModelSourceContents.cs
 //
 // Author:
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceComboBox.cs
index af29971..2e9b945 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceComboBox.cs
@@ -33,32 +33,32 @@ using Banshee.ServiceStack;
 using Banshee.Sources;
 
 namespace Banshee.Sources.Gui
-{ 
+{
     public class SourceComboBox : ComboBox
     {
         private SourceModel store;
-        
+
         public SourceComboBox ()
         {
             SourceRowRenderer renderer = new SourceRowRenderer ();
             renderer.ParentWidget = this;
             PackStart (renderer, true);
             SetCellDataFunc (renderer, new CellLayoutDataFunc (SourceRowRenderer.CellDataHandler));
-            
+
             store = new SourceModel ();
             Model = store;
-            
-            ServiceManager.SourceManager.ActiveSourceChanged += delegate { 
+
+            ServiceManager.SourceManager.ActiveSourceChanged += delegate {
                 Banshee.Base.ThreadAssist.ProxyToMain (UpdateActiveSource);
             };
-            
+
             ServiceManager.SourceManager.SourceUpdated += delegate {
-                Banshee.Base.ThreadAssist.ProxyToMain (QueueDraw);                    
+                Banshee.Base.ThreadAssist.ProxyToMain (QueueDraw);
             };
-            
+
             store.Refresh ();
         }
-        
+
         public void UpdateActiveSource ()
         {
             lock (this) {
@@ -73,7 +73,7 @@ namespace Banshee.Sources.Gui
         {
             lock (this) {
                 TreeIter iter;
-                
+
                 if (GetActiveIter (out iter)) {
                     Source new_source = store.GetValue(iter, 0) as Source;
                     if (new_source != null && ServiceManager.SourceManager.ActiveSource != new_source) {
@@ -85,5 +85,5 @@ namespace Banshee.Sources.Gui
                 }
             }
         }
-    } 
+    }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceIconResolver.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceIconResolver.cs
index 9da66c5..0484692 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceIconResolver.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceIconResolver.cs
@@ -39,36 +39,36 @@ namespace Banshee.Sources.Gui
         {
             return ResolveIcon (source, 22, null);
         }
-        
+
         public static Gdk.Pixbuf ResolveIcon (Source source, string @namespace)
         {
             return ResolveIcon (source, 22, @namespace);
         }
-    
+
         public static Gdk.Pixbuf ResolveIcon (Source source, int size)
         {
             return ResolveIcon (source, size, null);
         }
-        
+
         public static Gdk.Pixbuf ResolveIcon (Source source, int size, string @namespace)
         {
-            string name_property = @namespace == null 
-                ? "Icon.Name" 
+            string name_property = @namespace == null
+                ? "Icon.Name"
                 : String.Format ("{0}.Icon.Name", @namespace);
-                
-            string pixbuf_property = @namespace == null 
+
+            string pixbuf_property = @namespace == null
                 ? String.Format ("Icon.Pixbuf_{0}", size)
                 : String.Format ("{0}.Icon.Pixbuf_{1}", @namespace, size);
-        
+
             Gdk.Pixbuf icon = source.Properties.Get<Gdk.Pixbuf> (pixbuf_property);
-            
+
             if (icon != null) {
                 return icon;
             }
-            
+
             Type icon_type = source.Properties.GetType (name_property);
             Assembly asm = source.Properties.Get<Assembly> ("ResourceAssembly");
-            
+
             if (icon_type == typeof (string)) {
                 icon = IconThemeUtils.LoadIcon (asm, size, source.Properties.Get<string> (name_property));
             } else if (icon_type == typeof (string [])) {
@@ -78,19 +78,19 @@ namespace Banshee.Sources.Gui
             if (icon == null) {
                 icon = Banshee.Gui.IconThemeUtils.LoadIcon (size, "image-missing");
             }
-                
+
             if (icon != null) {
                 source.Properties.Set<Gdk.Pixbuf> (pixbuf_property, icon);
             }
-            
+
             return icon;
         }
-        
+
         public static void InvalidatePixbufs (Source source)
         {
             InvalidatePixbufs (source, null);
         }
-        
+
         public static void InvalidatePixbufs (Source source, string @namespace)
         {
             string property = @namespace == null ? "Icon.Pixbuf" : String.Format ("{0}.Icon.Pixbuf", @namespace);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
index 71e5d6c..c61865b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceModel.cs
@@ -34,9 +34,9 @@ using Banshee.Sources;
 using Banshee.ServiceStack;
 
 namespace Banshee.Sources.Gui
-{   
+{
     public delegate void SourceRowEventHandler (object o, SourceRowEventArgs args);
-    
+
     public sealed class SourceRowEventArgs : EventArgs
     {
         public SourceRowEventArgs (Source source, TreeIter iter, TreeIter parentIter)
@@ -45,17 +45,17 @@ namespace Banshee.Sources.Gui
             this.iter = iter;
             this.parent_iter = parentIter;
         }
-        
+
         private Source source;
         public Source Source {
             get { return source; }
         }
-        
+
         private TreeIter iter;
         public TreeIter Iter {
             get { return iter; }
         }
-        
+
         private TreeIter parent_iter;
         public TreeIter ParentIter {
             get { return parent_iter; }
@@ -68,37 +68,37 @@ namespace Banshee.Sources.Gui
 
         public event SourceRowEventHandler SourceRowInserted;
         public event SourceRowEventHandler SourceRowRemoved;
-        
+
         public SourceModel () : base (typeof (Source), typeof (int), typeof (bool))
         {
             SetSortColumnId (1, SortType.Ascending);
-            ChangeSortColumn ();   
-            
+            ChangeSortColumn ();
+
             ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             ServiceManager.SourceManager.SourceRemoved += OnSourceRemoved;
         }
-        
+
         public override void Dispose ()
         {
             ServiceManager.SourceManager.SourceAdded -= OnSourceAdded;
             ServiceManager.SourceManager.SourceRemoved -= OnSourceRemoved;
             base.Dispose ();
         }
-        
+
         private void OnSourceAdded (SourceAddedArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 AddSource (args.Source);
             });
         }
-        
+
         private void OnSourceRemoved (SourceEventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 RemoveSource (args.Source);
             });
         }
-        
+
         protected virtual void OnSourceRowInserted (Source source, TreeIter iter, TreeIter parentIter)
         {
             SourceRowEventHandler handler = SourceRowInserted;
@@ -106,7 +106,7 @@ namespace Banshee.Sources.Gui
                 handler (this, new SourceRowEventArgs (source, iter, parentIter));
             }
         }
-        
+
         protected virtual void OnSourceRowRemoved (Source source, TreeIter iter)
         {
             SourceRowEventHandler handler = SourceRowRemoved;
@@ -121,7 +121,7 @@ namespace Banshee.Sources.Gui
         {
             return GetValue (iter, 0) as Source;
         }
-        
+
         public Source GetSource (TreePath path)
         {
             if (path == null)
@@ -131,7 +131,7 @@ namespace Banshee.Sources.Gui
             if (GetIter (out iter, path)) {
                 return GetSource (iter);
             }
-        
+
             return null;
         }
 
@@ -140,30 +140,30 @@ namespace Banshee.Sources.Gui
             foreach (TreeIter iter in FindInModel (0, source)) {
                 return iter;
             }
-            
+
             return TreeIter.Zero;
         }
-        
+
         public IEnumerable<TreeIter> FindInModel (int column, object match)
         {
             TreeIter iter = TreeIter.Zero;
             GetIterFirst (out iter);
             return FindInModel (column, match, iter);
         }
-        
+
         public IEnumerable<TreeIter> FindInModel (int column, object match, TreeIter iter)
         {
             if (!IterIsValid (iter)) {
                 yield break;
             }
-            
+
             do {
                 object result = GetValue (iter, column);
                 Type result_type = result != null ? result.GetType () : null;
                 if (result_type != null && ((result_type.IsValueType && result.Equals (match)) || result == match)) {
                     yield return iter;
                 }
-                
+
                 if (IterHasChild (iter)) {
                     TreeIter citer = TreeIter.Zero;
                     IterChildren (out citer, iter);
@@ -175,29 +175,29 @@ namespace Banshee.Sources.Gui
                 }
             } while (IterNext (ref iter));
         }
-        
+
         /*private void AddRowSeparator (int order)
         {
             TreeIter iter = InsertNode (order);
-            
+
             SetValue (iter, 0, null);
             SetValue (iter, 1, order);
             SetValue (iter, 2, true);
         }
-        
+
         private void ClearRowSeparators ()
         {
             Queue<TreeIter> to_remove = new Queue<TreeIter> ();
             foreach (TreeIter iter in FindInModel (2, true)) {
                 to_remove.Enqueue (iter);
             }
-            
+
             while (to_remove.Count > 0) {
                 TreeIter iter = to_remove.Dequeue ();
                 Remove (ref iter);
             }
         }*/
-        
+
 #endregion
 
 
@@ -215,18 +215,18 @@ namespace Banshee.Sources.Gui
                 if (!FindSource (source).Equals (TreeIter.Zero)) {
                     return;
                 }
-                
+
                 // Don't add a child source before its parent
                 if (parent.Equals (TreeIter.Zero) && source.Parent != null) {
                     return;
                 }
-                
+
                 int position = source.Order;
-                
+
                 TreeIter iter = parent.Equals (TreeIter.Zero)
-                    ? InsertNode (position) 
+                    ? InsertNode (position)
                     : InsertNode (parent, position);
-                
+
                 SetValue (iter, 0, source);
                 SetValue (iter, 1, source.Order);
                 SetValue (iter, 2, false);
@@ -236,14 +236,14 @@ namespace Banshee.Sources.Gui
                         AddSource (child, iter);
                     }
                 }
-                
-                source.ChildSourceAdded += OnSourceChildSourceAdded; 
+
+                source.ChildSourceAdded += OnSourceChildSourceAdded;
                 source.ChildSourceRemoved += OnSourceChildSourceRemoved;
-                
+
                 OnSourceRowInserted (source, iter, parent);
             }
         }
-        
+
         public void RemoveSource (Source source)
         {
             lock (sync) {
@@ -251,14 +251,14 @@ namespace Banshee.Sources.Gui
                 if (!iter.Equals (TreeIter.Zero)) {
                     Remove (ref iter);
                 }
-                
+
                 source.ChildSourceAdded -= OnSourceChildSourceAdded;
                 source.ChildSourceRemoved -= OnSourceChildSourceRemoved;
-              
+
                 OnSourceRowRemoved (source, iter);
             }
         }
-        
+
         public void Refresh ()
         {
             Clear ();
@@ -266,21 +266,21 @@ namespace Banshee.Sources.Gui
                 AddSource (source);
             }
         }
-        
+
         private void OnSourceChildSourceAdded (SourceEventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 AddSource (args.Source, FindSource (args.Source.Parent));
             });
         }
-        
+
         private void OnSourceChildSourceRemoved (SourceEventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 RemoveSource (args.Source);
             });
         }
-        
+
 #endregion
 
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
index f53d07e..35fc0b8 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
@@ -45,52 +45,58 @@ namespace Banshee.Sources.Gui
         {
             SourceRowRenderer renderer = cell as SourceRowRenderer;
             Source source = model.GetValue (iter, 0) as Source;
-            
+
             if (renderer == null) {
                 return;
             }
-            
+
             renderer.Source = source;
             renderer.Path = model.GetPath (iter);
-            
+
             if (source == null) {
                 return;
             }
-            
+
             renderer.Text = source.Name;
             renderer.Sensitive = source.CanActivate;
         }
-        
+
         private Source source;
         public Source Source {
             get { return source; }
             set { source = value; }
         }
-        
+
         private SourceView view;
-        
+
         private Widget parent_widget;
         public Widget ParentWidget {
             get { return parent_widget; }
             set { parent_widget = value; }
         }
-        
+
         private TreePath path;
         public TreePath Path {
             get { return path; }
             set { path = value; }
         }
-        
+
         private int padding;
         public int Padding {
             get { return padding; }
             set { padding = value; }
         }
 
+        private int row_height = 22;
+        public int RowHeight {
+            get { return row_height; }
+            set { row_height = value; }
+        }
+
         public SourceRowRenderer ()
         {
         }
-        
+
         private StateType RendererStateToWidgetState (Widget widget, CellRendererState flags)
         {
             if (!Sensitive) {
@@ -106,46 +112,46 @@ namespace Banshee.Sources.Gui
                 return StateType.Normal;
             }
         }
-        
+
         public override void GetSize (Widget widget, ref Gdk.Rectangle cell_area,
             out int x_offset, out int y_offset, out int width, out int height)
-        {        
+        {
             int text_x, text_y, text_w, text_h;
-   
+
             base.GetSize (widget, ref cell_area, out text_x, out text_y, out text_w, out text_h);
-                
+
             x_offset = 0;
             y_offset = 0;
-            
+
             if (!(widget is TreeView)) {
                 width = 200;
             } else {
                 width = 0;
             }
-            
-            height = (int)Math.Max (22, text_h) + Padding;
+
+            height = (int)Math.Max (RowHeight, text_h) + Padding;
         }
-        
-        protected override void Render (Gdk.Drawable drawable, Widget widget, Gdk.Rectangle background_area, 
+
+        protected override void Render (Gdk.Drawable drawable, Widget widget, Gdk.Rectangle background_area,
             Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, CellRendererState flags)
         {
             if (source == null) {
                 return;
             }
-            
+
             view = widget as SourceView;
-            bool path_selected = view != null && view.Selection.PathIsSelected (path);            
+            bool path_selected = view != null && view.Selection.PathIsSelected (path);
             StateType state = RendererStateToWidgetState (widget, flags);
-            
+
             RenderSelection (drawable, background_area, path_selected, state);
-            
+
             int title_layout_width = 0, title_layout_height = 0;
             int count_layout_width = 0, count_layout_height = 0;
             int max_title_layout_width;
-            
+
             bool hide_counts = source.Count <= 0;
-            
-            Pixbuf icon = SourceIconResolver.ResolveIcon (source);
+
+            Pixbuf icon = SourceIconResolver.ResolveIcon (source, RowHeight);
 
             if (state == StateType.Insensitive) {
                 // Code ported from gtk_cell_renderer_pixbuf_render()
@@ -158,20 +164,20 @@ namespace Banshee.Sources.Gui
                 icon = widget.Style.RenderIcon (icon_source, widget.Direction, state,
                     (IconSize)(-1), widget, "SourceRowRenderer");
             }
-            
+
             FontDescription fd = widget.PangoContext.FontDescription.Copy ();
-            fd.Weight = (ISource)ServiceManager.PlaybackController.NextSource == (ISource)source 
-                ? Pango.Weight.Bold 
+            fd.Weight = (ISource)ServiceManager.PlaybackController.NextSource == (ISource)source
+                ? Pango.Weight.Bold
                 : Pango.Weight.Normal;
 
             if (view != null && source == view.NewPlaylistSource) {
                 fd.Style = Pango.Style.Italic;
                 hide_counts = true;
             }
-            
+
             Pango.Layout title_layout = new Pango.Layout (widget.PangoContext);
             Pango.Layout count_layout = null;
-            
+
             if (!hide_counts) {
                 count_layout = new Pango.Layout (widget.PangoContext);
                 count_layout.FontDescription = fd;
@@ -180,7 +186,7 @@ namespace Banshee.Sources.Gui
             }
 
             max_title_layout_width = cell_area.Width - (icon == null ? 0 : icon.Width) - count_layout_width - 10;
-            
+
             if (!hide_counts && max_title_layout_width < 0) {
                 hide_counts = true;
             }
@@ -190,63 +196,63 @@ namespace Banshee.Sources.Gui
             title_layout.Ellipsize = EllipsizeMode.End;
             title_layout.SetText (source.Name);
             title_layout.GetPixelSize (out title_layout_width, out title_layout_height);
-            
+
             Gdk.GC main_gc = widget.Style.TextGC (state);
-            
-            drawable.DrawLayout (main_gc, 
-                cell_area.X + (icon == null ? 0 : icon.Width) + 6, 
+
+            drawable.DrawLayout (main_gc,
+                cell_area.X + (icon == null ? 0 : icon.Width) + 6,
                 Middle (cell_area, title_layout_height),
                 title_layout);
-            
+
             if (icon != null) {
-                drawable.DrawPixbuf (main_gc, icon, 0, 0, 
+                drawable.DrawPixbuf (main_gc, icon, 0, 0,
                     cell_area.X, Middle (cell_area, icon.Height),
                     icon.Width, icon.Height, RgbDither.None, 0, 0);
             }
-            
+
             if (hide_counts) {
                 return;
             }
-                
+
             Gdk.GC mod_gc = widget.Style.TextGC (state);
             if (state == StateType.Normal || (view != null && state == StateType.Prelight)) {
                 Gdk.Color fgcolor = widget.Style.Base (state);
                 Gdk.Color bgcolor = widget.Style.Text (state);
-                
+
                 mod_gc = new Gdk.GC (drawable);
                 mod_gc.Copy (widget.Style.TextGC (state));
                 mod_gc.RgbFgColor = Hyena.Gui.GtkUtilities.ColorBlend (fgcolor, bgcolor);
                 mod_gc.RgbBgColor = fgcolor;
-            } 
-            
+            }
+
             drawable.DrawLayout (mod_gc,
                 cell_area.X + cell_area.Width - count_layout_width - 2,
                 Middle (cell_area, count_layout_height),
                 count_layout);
         }
-        
-        private void RenderSelection (Gdk.Drawable drawable, Gdk.Rectangle background_area, 
+
+        private void RenderSelection (Gdk.Drawable drawable, Gdk.Rectangle background_area,
             bool path_selected, StateType state)
         {
             if (view == null) {
                 return;
             }
-            
+
             if (path_selected && view.Cr != null) {
                 Gdk.Rectangle rect = background_area;
                 rect.X -= 2;
                 rect.Width += 4;
-                
+
                 // clear the standard GTK selection and focus
                 drawable.DrawRectangle (view.Style.BaseGC (StateType.Normal), true, rect);
-                
+
                 // draw the hot cairo selection
-                if (!view.EditingRow) { 
-                    view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1, 
+                if (!view.EditingRow) {
+                    view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1,
                         background_area.Width - 2, background_area.Height - 2);
                 }
             } else if (path != null && path.Equals (view.HighlightedPath) && view.Cr != null) {
-                view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1, 
+                view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1,
                     background_area.Width - 2, background_area.Height - 2, false);
             } else if (view.NotifyStage.ActorCount > 0 && view.Cr != null) {
                 TreeIter iter;
@@ -254,19 +260,19 @@ namespace Banshee.Sources.Gui
                     Actor<TreeIter> actor = view.NotifyStage[iter];
                     Cairo.Color color = view.Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Active);
                     color.A = Math.Sin (actor.Percent * Math.PI);
-                        
-                    view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1, 
+
+                    view.Theme.DrawRowSelection (view.Cr, background_area.X + 1, background_area.Y + 1,
                         background_area.Width - 2, background_area.Height - 2, true, true, color);
                 }
             }
         }
-        
+
         private int Middle (Gdk.Rectangle area, int height)
         {
             return area.Y + (int)Math.Round ((double)(area.Height - height) / 2.0) + 1;
         }
-        
-        public override CellEditable StartEditing (Gdk.Event evnt, Widget widget, string path, 
+
+        public override CellEditable StartEditing (Gdk.Event evnt, Widget widget, string path,
             Gdk.Rectangle background_area, Gdk.Rectangle cell_area, CellRendererState flags)
         {
             CellEditEntry text = new CellEditEntry ();
@@ -274,19 +280,19 @@ namespace Banshee.Sources.Gui
             text.Text = source.Name;
             text.path = path;
             text.Show ();
-            
+
             view.EditingRow = true;
-            
+
             return text;
         }
-        
+
         private void OnEditDone (object o, EventArgs args)
         {
             CellEditEntry edit = (CellEditEntry)o;
             if (view == null) {
                 return;
             }
-            
+
             view.EditingRow = false;
             view.UpdateRow (new TreePath (edit.path), edit.Text);
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
index 66961a4..a245b42 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView.cs
@@ -36,6 +36,7 @@ using Mono.Unix;
 using Hyena.Gui.Theming;
 using Hyena.Gui.Theatrics;
 
+using Banshee.Configuration;
 using Banshee.ServiceStack;
 using Banshee.Sources;
 using Banshee.Playlist;
@@ -53,9 +54,9 @@ namespace Banshee.Sources.Gui
         private SourceRowRenderer renderer;
         private Theme theme;
         private Cairo.Context cr;
-        
+
         private Stage<TreeIter> notify_stage = new Stage<TreeIter> (2000);
-        
+
         private TreeViewColumn focus_column;
         private TreePath highlight_path;
         private SourceModel store;
@@ -66,22 +67,22 @@ namespace Banshee.Sources.Gui
         public SourceView ()
         {
             BuildColumns ();
-            
+
             store = new SourceModel ();
             store.SourceRowInserted += OnSourceRowInserted;
             store.SourceRowRemoved += OnSourceRowRemoved;
             store.RowChanged += OnRowChanged;
             Model = store;
-            
+
             ConfigureDragAndDrop ();
             store.Refresh ();
             ConnectEvents ();
-            
+
             RowSeparatorFunc = RowSeparatorHandler;
         }
-        
-#region Setup Methods        
-        
+
+#region Setup Methods
+
         private void BuildColumns ()
         {
             // Hidden expander column
@@ -89,23 +90,24 @@ namespace Banshee.Sources.Gui
             col.Visible = false;
             AppendColumn (col);
             ExpanderColumn = col;
-        
+
             focus_column = new TreeViewColumn ();
             renderer = new SourceRowRenderer ();
-            renderer.Padding = 5;
+            renderer.RowHeight = RowHeight.Get ();
+            renderer.Padding = RowPadding.Get ();
             focus_column.PackStart (renderer, true);
             focus_column.SetCellDataFunc (renderer, new CellLayoutDataFunc (SourceRowRenderer.CellDataHandler));
             AppendColumn (focus_column);
-            
+
             HeadersVisible = false;
         }
-        
+
         private void ConnectEvents ()
         {
             ServiceManager.SourceManager.ActiveSourceChanged += delegate (SourceEventArgs args) {
                 Banshee.Base.ThreadAssist.ProxyToMain (ResetSelection);
             };
-            
+
             ServiceManager.SourceManager.SourceUpdated += delegate (SourceEventArgs args) {
                 Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                     lock (args.Source) {
@@ -117,31 +119,31 @@ namespace Banshee.Sources.Gui
                     }
                 });
             };
-            
+
             ServiceManager.PlaybackController.NextSourceChanged += delegate {
                 Banshee.Base.ThreadAssist.ProxyToMain (QueueDraw);
             };
-            
+
             notify_stage.ActorStep += delegate (Actor<TreeIter> actor) {
                 Banshee.Base.ThreadAssist.AssertInMainThread ();
                 if (!store.IterIsValid (actor.Target)) {
                     return false;
                 }
-                
+
                 Gdk.Rectangle rect = GetBackgroundArea (store.GetPath (actor.Target), focus_column);
                 QueueDrawArea (rect.X, rect.Y, rect.Width, rect.Height);
                 return true;
             };
         }
-        
+
 #endregion
 
 #region Gtk.Widget Overrides
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
-            
+
             theme = new GtkTheme (this);
             // theme.RefreshColors ();
         }
@@ -150,11 +152,11 @@ namespace Banshee.Sources.Gui
         {
             TreePath path;
             TreeViewColumn column;
-                       
+
             if (press.Button == 1) {
                 ResetHighlight ();
             }
-            
+
             // If there is not a row at the click position let the base handler take care of the press
             if (!GetPathAtPos ((int)press.X, (int)press.Y, out path, out column)) {
                 return base.OnButtonPressEvent (press);
@@ -177,7 +179,7 @@ namespace Banshee.Sources.Gui
                 return ret;
             }
 
-            // For Sources that can't be activated, when they're clicked just 
+            // For Sources that can't be activated, when they're clicked just
             // expand or collapse them and return.
             if (press.Button == 1 && !source.CanActivate) {
                 if (!source.Expanded) {
@@ -193,25 +195,25 @@ namespace Banshee.Sources.Gui
                 OnPopupMenu ();
                 return true;
             }
-            
+
             if (!source.CanActivate) {
                 return false;
             }
-            
+
 
             if (press.Button == 1) {
                 if (ServiceManager.SourceManager.ActiveSource != source) {
                     ServiceManager.SourceManager.SetActiveSource (source);
                 }
             }
-            
+
             if ((press.State & Gdk.ModifierType.ControlMask) != 0) {
                 if (press.Type == Gdk.EventType.TwoButtonPress && press.Button == 1) {
                     ActivateRow (path, null);
                 }
                 return true;
             }
-            
+
             return base.OnButtonPressEvent (press);
         }
 
@@ -220,12 +222,12 @@ namespace Banshee.Sources.Gui
             ServiceManager.Get<InterfaceActionService> ().SourceActions["SourceContextMenuAction"].Activate ();
             return true;
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (need_resort) {
                 need_resort = false;
-                
+
                 // Resort the tree store. This is performed in an event handler
                 // known not to conflict with gtk_tree_view_bin_expose() to prevent
                 // errors about corrupting the TreeView's internal state.
@@ -237,7 +239,7 @@ namespace Banshee.Sources.Gui
                 }
                 QueueDraw ();
             }
-            
+
             try {
                 cr = Gdk.CairoHelper.Create (evnt.Window);
                 return base.OnExposeEvent (evnt);
@@ -251,54 +253,54 @@ namespace Banshee.Sources.Gui
 #endregion
 
 #region Gtk.TreeView Overrides
-        
+
         protected override void OnRowExpanded (TreeIter iter, TreePath path)
         {
             base.OnRowExpanded (iter, path);
             store.GetSource (iter).Expanded = true;
         }
-        
+
         protected override void OnRowCollapsed (TreeIter iter, TreePath path)
         {
             base.OnRowCollapsed (iter, path);
             store.GetSource (iter).Expanded = false;
         }
-        
+
         protected override void OnCursorChanged ()
         {
             if (current_timeout < 0) {
                 current_timeout = (int)GLib.Timeout.Add (200, OnCursorChangedTimeout);
             }
         }
-        
+
         private bool OnCursorChangedTimeout ()
         {
             TreeIter iter;
             TreeModel model;
-            
+
             current_timeout = -1;
-            
+
             if (!Selection.GetSelected (out model, out iter)) {
                 return false;
             }
-            
+
             Source new_source = store.GetValue (iter, 0) as Source;
             if (ServiceManager.SourceManager.ActiveSource == new_source) {
                 return false;
             }
-            
+
             ServiceManager.SourceManager.SetActiveSource (new_source);
-            
+
             QueueDraw ();
 
             return false;
         }
-        
+
         private bool RowSeparatorHandler (TreeModel model, TreeIter iter)
         {
             return (bool)store.GetValue (iter, 2);
         }
-        
+
 #endregion
 
 #region Add/Remove Sources / SourceManager interaction
@@ -306,7 +308,7 @@ namespace Banshee.Sources.Gui
         private void OnSourceRowInserted (object o, SourceRowEventArgs args)
         {
             args.Source.UserNotifyUpdated += OnSourceUserNotifyUpdated;
-            
+
             if (args.Source.Parent != null && args.Source.Parent.AutoExpand == true) {
                 Expand (args.ParentIter);
             }
@@ -317,13 +319,13 @@ namespace Banshee.Sources.Gui
 
             UpdateView ();
         }
-        
+
         private void OnSourceRowRemoved (object o, SourceRowEventArgs args)
         {
             args.Source.UserNotifyUpdated -= OnSourceUserNotifyUpdated;
             UpdateView ();
         }
-        
+
         private void OnRowChanged (object o, RowChangedArgs args)
         {
             QueueDraw ();
@@ -334,7 +336,7 @@ namespace Banshee.Sources.Gui
             TreePath path = store.GetPath (iter);
             ExpandRow (path, true);
         }
-        
+
         private void OnSourceUserNotifyUpdated (object o, EventArgs args)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
@@ -342,11 +344,11 @@ namespace Banshee.Sources.Gui
                 if (iter.Equals (TreeIter.Zero)) {
                     return;
                 }
-                
+
                 notify_stage.AddOrReset (iter);
             });
         }
-        
+
 #endregion
 
 #region List/View Utility Methods
@@ -358,115 +360,124 @@ namespace Banshee.Sources.Gui
                 if (!store.IterNthChild (out iter, i)) {
                     continue;
                 }
-                
+
                 if (store.IterNChildren (iter) > 0) {
                     ExpanderColumn = Columns[1];
                     return true;
                 }
             }
-        
+
             ExpanderColumn = Columns[0];
             return false;
         }
-        
+
         internal void UpdateRow (TreePath path, string text)
         {
             TreeIter iter;
-            
+
             if (!store.GetIter (out iter, path)) {
                 return;
             }
-            
+
             Source source = store.GetValue (iter, 0) as Source;
             source.Rename (text);
         }
-        
+
         public void BeginRenameSource (Source source)
         {
             TreeIter iter = store.FindSource (source);
             if (iter.Equals (TreeIter.Zero)) {
                 return;
             }
-            
+
             renderer.Editable = true;
             SetCursor (store.GetPath (iter), focus_column, true);
             renderer.Editable = false;
         }
-        
+
         private void ResetSelection ()
         {
             TreeIter iter = store.FindSource (ServiceManager.SourceManager.ActiveSource);
-            
+
             if (!iter.Equals (TreeIter.Zero)){
                 Selection.SelectIter (iter);
             }
         }
-        
+
         public void HighlightPath (TreePath path)
         {
             highlight_path = path;
             QueueDraw ();
         }
-        
+
         public void ResetHighlight ()
-        {   
+        {
             highlight_path = null;
             QueueDraw ();
         }
-        
+
 #endregion
 
 #region Public Properties
-                
+
         public Source HighlightedSource {
             get {
                 TreeIter iter;
-                
+
                 if (highlight_path == null || !store.GetIter (out iter, highlight_path)) {
                     return null;
                 }
-                    
+
                 return store.GetValue (iter, 0) as Source;
             }
         }
 
         public bool EditingRow {
             get { return editing_row; }
-            set { 
+            set {
                 editing_row = value;
-                QueueDraw (); 
+                QueueDraw ();
             }
         }
-        
+
 #endregion
 
 #region Internal Properties
-      
+
         internal TreePath HighlightedPath {
             get { return highlight_path; }
         }
-        
+
         internal Cairo.Context Cr {
             get { return cr; }
         }
-        
+
         internal Theme Theme {
             get { return theme; }
         }
-        
+
         internal Stage<TreeIter> NotifyStage {
             get { return notify_stage; }
         }
-        
+
         internal Source NewPlaylistSource {
             get {
                 return new_playlist_source ??
-                    (new_playlist_source = new PlaylistSource (Catalog.GetString ("New Playlist"), 
+                    (new_playlist_source = new PlaylistSource (Catalog.GetString ("New Playlist"),
                         ServiceManager.SourceManager.MusicLibrary));
             }
         }
 
-#endregion        
+#endregion
+
+#region Property Schemas
+
+        private static SchemaEntry<int> RowHeight = new SchemaEntry<int> (
+            "player_window", "source_view_row_height", 22, "The height of each source row in the SourceView.  22 is the default.", "");
 
+        private static SchemaEntry<int> RowPadding = new SchemaEntry<int> (
+            "player_window", "source_view_row_padding", 5, "The padding between sources in the SourceView.  5 is the default.", "");
+
+#endregion
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs
index b6181f9..5911592 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceView_DragAndDrop.cs
@@ -49,34 +49,34 @@ namespace Banshee.Sources.Gui
         private static TargetEntry [] dnd_source_entries = new TargetEntry [] {
             Banshee.Gui.DragDrop.DragDropTarget.Source
         };
-            
+
         private static TargetEntry [] dnd_dest_entries = new TargetEntry [] {
             Banshee.Gui.DragDrop.DragDropTarget.Source,
             Hyena.Data.Gui.ListViewDragDropTarget.ModelSelection,
             Banshee.Gui.DragDrop.DragDropTarget.UriList
         };
-        
+
         private Source new_playlist_source = null;
         private TreeIter new_playlist_iter = TreeIter.Zero;
         private bool new_playlist_visible = false;
-        
+
         private Source final_drag_source = null;
         private uint final_drag_start_time = 0;
-        
+
         private void ConfigureDragAndDrop ()
         {
             EnableModelDragSource (Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask,
                 dnd_source_entries, DragAction.Copy | DragAction.Move);
-        
+
             EnableModelDragDest (dnd_dest_entries, DragAction.Copy | DragAction.Copy);
         }
-        
+
         protected override bool OnDragMotion (Gdk.DragContext context, int x, int y, uint time)
         {
             TreePath path;
             TreeViewDropPosition pos;
             Source active_source = ServiceManager.SourceManager.ActiveSource;
-            
+
             if (active_source.SupportedMergeTypes == SourceMergeType.None) {
                 Gdk.Drag.Status (context, 0, time);
                 return false;
@@ -84,7 +84,7 @@ namespace Banshee.Sources.Gui
                 Gdk.Drag.Status (context, 0, time);
                 return false;
             }
-            
+
             Source drop_source = store.GetSource (path);
             Source parent_source = (drop_source as LibrarySource) ?? (drop_source.Parent as LibrarySource);
 
@@ -105,7 +105,7 @@ namespace Banshee.Sources.Gui
 
             bool move = (active_source is LibrarySource) && (drop_source is LibrarySource);
             Gdk.Drag.Status (context, move ? Gdk.DragAction.Move : Gdk.DragAction.Copy, time);
-            
+
             return true;
         }
 
@@ -119,7 +119,7 @@ namespace Banshee.Sources.Gui
                 else
                     HideNewPlaylistRow ();
             }
-            
+
             if (parent == null || active == null) {
                 return;
             }
@@ -132,7 +132,7 @@ namespace Banshee.Sources.Gui
 
             TreeIter parent_iter = store.FindSource (parent);
             new_playlist_iter = store.AppendNode (parent_iter);
-            
+
             store.SetValue (new_playlist_iter, 0, NewPlaylistSource);
             store.SetValue (new_playlist_iter, 1, 999);
             new_playlist_visible = true;
@@ -151,7 +151,7 @@ namespace Banshee.Sources.Gui
             if (!new_playlist_visible) {
                 return;
             }
-            
+
             if (!parent_was_expanded) {
                 TreeIter iter = store.FindSource (new_playlist_parent);
                 TreePath path = store.GetPath (iter);
@@ -160,10 +160,10 @@ namespace Banshee.Sources.Gui
 
             store.Remove (ref new_playlist_iter);
             new_playlist_visible = false;
-            
+
             UpdateView ();
         }
-        
+
         protected override void OnDragLeave (Gdk.DragContext context, uint time)
         {
             TreePath path;
@@ -173,7 +173,7 @@ namespace Banshee.Sources.Gui
             if (path == null && !TreeIter.Zero.Equals (new_playlist_iter)) {
                 path = store.GetPath (new_playlist_iter);
             }
-            
+
             if (path != null) {
                 final_drag_source = store.GetSource (path);
             }
@@ -182,7 +182,7 @@ namespace Banshee.Sources.Gui
             HideNewPlaylistRow ();
             SetDragDestRow (null, TreeViewDropPosition.Before);
         }
-        
+
         protected override void OnDragBegin (Gdk.DragContext context)
         {
             if (ServiceManager.SourceManager.ActiveSource.SupportedMergeTypes != SourceMergeType.None) {
@@ -204,17 +204,17 @@ namespace Banshee.Sources.Gui
                     Gtk.Drag.Finish (context, false, false, time);
                     return;
                 }
-                
-                Source drop_source = final_drag_source;    
-                
+
+                Source drop_source = final_drag_source;
+
                 if (final_drag_source == NewPlaylistSource) {
-                    PlaylistSource playlist = new PlaylistSource (Catalog.GetString ("New Playlist"), 
+                    PlaylistSource playlist = new PlaylistSource (Catalog.GetString ("New Playlist"),
                         (new_playlist_parent as PrimarySource));
                     playlist.Save ();
                     playlist.PrimarySource.AddChildSource (playlist);
                     drop_source = playlist;
                 }
-                
+
                 if (data.Target.Name == Banshee.Gui.DragDrop.DragDropTarget.Source.Target) {
                     DragDropList<Source> sources = data;
                     if (sources.Count > 0) {
@@ -239,25 +239,25 @@ namespace Banshee.Sources.Gui
                 } else {
                     Hyena.Log.DebugFormat ("SourceView got unknown drag target type: {0}", data.Target.Name);
                 }
-                
+
                 Gtk.Drag.Finish (context, true, false, time);
             } finally {
                 HideNewPlaylistRow ();
             }
         }
-        
+
         protected override void OnDragDataGet (Gdk.DragContext context, SelectionData selectionData,
             uint info, uint time)
         {
             switch ((DragDropTargetType)info) {
                 case DragDropTargetType.Source:
-                    new DragDropList<Source> (ServiceManager.SourceManager.ActiveSource, 
+                    new DragDropList<Source> (ServiceManager.SourceManager.ActiveSource,
                         selectionData, context.Targets[0]);
                     break;
                 default:
                     return;
             }
-            
+
             base.OnDragDataGet (context, selectionData, info, time);
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml b/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml
index daabd16..e43c3b2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml
+++ b/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml
@@ -41,6 +41,11 @@
     <Description>Defines a new GTK+ source view, possibly in conjunction with a Source extension.</Description>
     <ExtensionNode name="SourceView"/>
   </ExtensionPoint>
+  
+  <ExtensionPoint path="/Banshee/ThickClient/GtkBaseClient/PostInitializeGtk">
+    <Description>An extension point that runs immediately after initializing GTK.</Description>
+    <ExtensionNode name="PostInitializeGtk"/>
+  </ExtensionPoint>
 
   <ExtensionPoint path="/Banshee/ThickClient/ContextPane">
     <Description>Defines a new GTK+ context page, for showing contextual information beneath the main track source view.</Description>
diff --git a/src/Core/Banshee.ThickClient/Banshee.ThickClient.dll.config b/src/Core/Banshee.ThickClient/Banshee.ThickClient.dll.config
deleted file mode 100644
index ca9834e..0000000
--- a/src/Core/Banshee.ThickClient/Banshee.ThickClient.dll.config
+++ /dev/null
@@ -1,3 +0,0 @@
-<configuration>
-  <dllmap dll="clutter-gtk" target="libclutter-gtk-0.8.so.0"/>
-</configuration>
diff --git a/src/Core/Banshee.ThickClient/Makefile.am b/src/Core/Banshee.ThickClient/Makefile.am
index d53e769..3569988 100644
--- a/src/Core/Banshee.ThickClient/Makefile.am
+++ b/src/Core/Banshee.ThickClient/Makefile.am
@@ -135,6 +135,7 @@ SOURCES =  \
 	Banshee.Preferences.Gui/SectionBox.cs \
 	Banshee.Preferences.Gui/WidgetFactory.cs \
 	Banshee.Query.Gui/BansheeQueryBox.cs \
+	Banshee.Query.Gui/PlaybackErrorQueryValueEntry.cs \
 	Banshee.Query.Gui/PlaylistQueryValueEntry.cs \
 	Banshee.Query.Gui/RatingQueryValueEntry.cs \
 	Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs \
@@ -164,6 +165,3 @@ RESOURCES =  \
 
 include $(top_srcdir)/build/build.mk
 
-module_SCRIPTS += Banshee.ThickClient.dll.config
-EXTRA_DIST += Banshee.ThickClient.dll.config
-
diff --git a/src/Core/Banshee.ThickClient/Makefile.in b/src/Core/Banshee.ThickClient/Makefile.in
index 9b54403..6f8f55c 100644
--- a/src/Core/Banshee.ThickClient/Makefile.in
+++ b/src/Core/Banshee.ThickClient/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -477,6 +486,7 @@ SOURCES = \
 	Banshee.Preferences.Gui/SectionBox.cs \
 	Banshee.Preferences.Gui/WidgetFactory.cs \
 	Banshee.Query.Gui/BansheeQueryBox.cs \
+	Banshee.Query.Gui/PlaybackErrorQueryValueEntry.cs \
 	Banshee.Query.Gui/PlaylistQueryValueEntry.cs \
 	Banshee.Query.Gui/RatingQueryValueEntry.cs \
 	Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs \
@@ -525,6 +535,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -628,11 +639,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -650,6 +662,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -679,6 +692,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -686,9 +700,8 @@ OUTPUT_FILES = \
 	$(ASSEMBLY_FILE).mdb
 
 moduledir = $(INSTALL_DIR_RESOLVED)
-module_SCRIPTS = $(OUTPUT_FILES) Banshee.ThickClient.dll.config
-EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \
-	$(THEME_ICONS_SOURCE) Banshee.ThickClient.dll.config
+module_SCRIPTS = $(OUTPUT_FILES)
+EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE)
 CLEANFILES = $(OUTPUT_FILES)
 DISTCLEANFILES = *.pidb
 MAINTAINERCLEANFILES = Makefile.in
@@ -699,14 +712,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Banshee.ThickClient/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Banshee.ThickClient/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Banshee.ThickClient/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Banshee.ThickClient/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -724,25 +737,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -772,13 +801,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -810,6 +843,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -830,6 +864,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -838,18 +874,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -910,7 +956,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -927,6 +973,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade b/src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade
index c1ebf94..7fd9816 100644
--- a/src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade
+++ b/src/Core/Banshee.ThickClient/Resources/banshee-dialogs.glade
@@ -4,7 +4,7 @@
 <glade-interface>
   <widget class="GtkDialog" id="ImportDialog">
     <property name="border_width">12</property>
-    <property name="title" translatable="yes">Import Media to Library</property>
+    <property name="title" translatable="no"></property>
     <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="window_position">GTK_WIN_POS_CENTER</property>
@@ -57,7 +57,7 @@
                   <widget class="GtkLabel" id="choose_label">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Choose an import _source:</property>
+                    <property name="label" translatable="yes">Import _from:</property>
                     <property name="use_underline">True</property>
                   </widget>
                   <packing>
@@ -131,7 +131,7 @@
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="has_default">True</property>
-                <property name="label" translatable="yes">I_mport Media Source</property>
+                <property name="label" translatable="no">Import</property>
                 <property name="use_underline">True</property>
                 <property name="response_id">-5</property>
               </widget>
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/CustomActionProxy.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/CustomActionProxy.cs
index 7338e4e..d28a505 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/CustomActionProxy.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/CustomActionProxy.cs
@@ -1,4 +1,4 @@
-// 
+//
 // CustomActionProxy.cs
 //
 // Author:
@@ -126,7 +126,7 @@ namespace Banshee.Widgets
         {
             return null;
         }
-        
+
         protected virtual ToolItem GetNewToolItem () {
             return null;
         }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/DateButton.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/DateButton.cs
index 7e0844a..fceb774 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/DateButton.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/DateButton.cs
@@ -6,27 +6,27 @@
  *  Written by Aaron Bockover (aaron at aaronbock.net)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using GLib;
 using Gtk;
@@ -67,7 +67,7 @@ namespace Banshee.Widgets
 			
 			cal = new Calendar();
 			cal.DisplayOptions = CalendarDisplayOptions.ShowHeading
-				| CalendarDisplayOptions.ShowDayNames 
+				| CalendarDisplayOptions.ShowDayNames
 				| CalendarDisplayOptions.ShowWeekNumbers;
 				
 			cal.KeyPressEvent += OnCalendarKeyPressed;
@@ -91,13 +91,13 @@ namespace Banshee.Widgets
 				
 			Grab.Add(popup);
 
-			Gdk.GrabStatus grabbed = Gdk.Pointer.Grab(popup.GdkWindow, true, 
-				Gdk.EventMask.ButtonPressMask 
-				| Gdk.EventMask.ButtonReleaseMask 
+			Gdk.GrabStatus grabbed = Gdk.Pointer.Grab(popup.GdkWindow, true,
+				Gdk.EventMask.ButtonPressMask
+				| Gdk.EventMask.ButtonReleaseMask
 				| Gdk.EventMask.PointerMotionMask, null, null, CURRENT_TIME);
 
 			if(grabbed == Gdk.GrabStatus.Success) {
-				grabbed = Gdk.Keyboard.Grab(popup.GdkWindow, 
+				grabbed = Gdk.Keyboard.Grab(popup.GdkWindow,
 					true, CURRENT_TIME);
 
 				if(grabbed != Gdk.GrabStatus.Success) {
@@ -156,7 +156,7 @@ namespace Banshee.Widgets
 			HideCalendar(true);
 		}
 		
-		private void OnCalendarButtonPressed(object o, 
+		private void OnCalendarButtonPressed(object o,
 			ButtonPressEventArgs args)
 		{
 			args.RetVal = true;
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/DictionaryComboBox.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/DictionaryComboBox.cs
index a250830..59d00e3 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/DictionaryComboBox.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/DictionaryComboBox.cs
@@ -5,24 +5,24 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -34,37 +34,37 @@ namespace Banshee.Widgets
     public class DictionaryComboBox<T> : ComboBox
     {
         private ListStore store;
-        
+
         public DictionaryComboBox()
         {
             store = new ListStore(typeof(string), typeof(T));
             Model = store;
-                        
+
             CellRendererText text_renderer = new CellRendererText();
             PackStart(text_renderer, true);
             AddAttribute(text_renderer, "text", 0);
         }
-        
+
         public TreeIter Add(string key, T value)
         {
             return store.AppendValues(key, value);
         }
-        
+
         public new void Clear ()
         {
             store.Clear ();
         }
-        
+
         public T ActiveValue {
-            get { 
+            get {
                 TreeIter iter;
                 if(GetActiveIter(out iter)) {
                     return (T)store.GetValue(iter, 1);
                 }
-                
+
                 return default(T);
             }
-            
+
             set {
                 if(value == null) {
                     SetActiveIter(TreeIter.Zero);
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs
index b53fde4..3bf57d7 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/DiscUsageDisplay.cs
@@ -5,24 +5,24 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -47,7 +47,7 @@ namespace Banshee.Widgets
         private RadialGradient fg_gradient_full;
         private RadialGradient fg_gradient;
         private RadialGradient bound_gradient;
-        
+
         private Color fill_color_a;
         private Color fill_color_b;
         private Color fill_color_c;
@@ -55,8 +55,8 @@ namespace Banshee.Widgets
         private Color inner_stroke_color;
         private Color text_color;
         private Color text_bg_color;
-        
-        private static readonly double a1 = 3 * Math.PI / 2;        
+
+        private static readonly double a1 = 3 * Math.PI / 2;
         private double x, y, radius, a2, base_line_width;
 
         private long capacity;
@@ -66,7 +66,7 @@ namespace Banshee.Widgets
         {
             AppPaintable = true;
         }
-        
+
         protected override void OnStyleSet(Gtk.Style style)
         {
             fill_color_a = CairoExtensions.GdkColorToCairoColor(Style.Background(StateType.Selected));
@@ -77,67 +77,67 @@ namespace Banshee.Widgets
             text_color = CairoExtensions.GdkColorToCairoColor(Style.Foreground(StateType.Normal), 0.8);
             text_bg_color = CairoExtensions.GdkColorToCairoColor(Style.Background(StateType.Normal), 0.6);
         }
-        
+
         protected override void OnSizeAllocated(Gdk.Rectangle rect)
         {
             x = rect.Width / 2.0;
             y = rect.Height / 2.0;
             radius = Math.Min(rect.Width / 2, rect.Height / 2) - 5;
             base_line_width = Math.Sqrt(radius) * 0.2;
-            
+
             bg_gradient = new RadialGradient(x, y, 0, x, y, radius);
             bg_gradient.AddColorStop(0, disc_color_a);
             bg_gradient.AddColorStop(1, disc_color_b);
-            
+
             fg_gradient = new RadialGradient(x, y, 0, x, y, radius * 2);
             fg_gradient.AddColorStop(0, fill_color_a);
             fg_gradient.AddColorStop(1, fill_color_b);
-                        
+
             fg_gradient_full = new RadialGradient(x, y, 0, x, y, radius);
             fg_gradient_full.AddColorStop(0, disc_color_b);
             fg_gradient_full.AddColorStop(1, red_color);
-            
+
             bound_gradient = new RadialGradient(x, y, 0, x, y, radius * 2);
             bound_gradient.AddColorStop(0, bound_color_a);
             bound_gradient.AddColorStop(1, bound_color_b);
-        
+
             base.OnSizeAllocated(rect);
         }
-        
+
         protected override bool OnExposeEvent(Gdk.EventExpose evnt)
         {
             if(!IsRealized) {
                 return false;
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create(GdkWindow);
-            
+
             foreach(Gdk.Rectangle rect in evnt.Region.GetRectangles()) {
                 cr.Rectangle(rect.X, rect.Y, rect.Width, rect.Height);
                 cr.Clip();
                 Draw(cr);
             }
-            
+
             ((IDisposable)cr).Dispose();
             return false;
         }
-        
+
         private void Draw(Cairo.Context cr)
         {
             cr.Antialias = Antialias.Subpixel;
             cr.LineWidth = base_line_width / 1.5;
-            
+
             cr.Arc(x, y, radius, 0, 2 * Math.PI);
             cr.Pattern = bg_gradient;
             cr.Fill();
-             
+
             /*cr.LineTo(x, y);
             cr.Arc(x, y, radius, a1 + 2 * Math.PI * 0.92, a1);
             cr.LineTo(x, y);
             cr.Pattern = bound_gradient;
             cr.Fill();
             cr.Stroke();*/
-            
+
             if(Capacity > 0) {
                 if(Fraction < 1.0) {
                     cr.LineTo(x, y);
@@ -146,93 +146,93 @@ namespace Banshee.Widgets
                 } else {
                     cr.Arc(x, y, radius, 0, 2 * Math.PI);
                 }
-                
+
                 cr.Pattern = Fraction >= 1.0 ? fg_gradient_full : fg_gradient;
                 cr.FillPreserve();
-                          
+
                 cr.Color = stroke_color;
                 cr.Stroke();
             }
-            
+
             cr.Arc(x, y, radius / 2.75, 0, 2 * Math.PI);
             cr.Color = fill_color_c;
             cr.FillPreserve();
             cr.Color = new Cairo.Color(1, 1, 1, 0.75);
             cr.FillPreserve();
-            
+
             cr.LineWidth = base_line_width / 1.5;
-            
+
             cr.Color = stroke_color;
             cr.Stroke();
-            
+
             cr.Arc(x, y, radius / 5.5, 0, 2 * Math.PI);
             cr.Color = fill_color_c;
             cr.FillPreserve();
-            
+
             cr.LineWidth = base_line_width / 2;
-            
+
             cr.Color = inner_stroke_color;
             cr.Stroke();
-            
+
             cr.Arc(x, y, radius, 0, 2 * Math.PI);
             cr.Stroke();
-            
+
             if(Capacity <= 0) {
                 // this sucks balls
                 cr.Rectangle(0, 0, Allocation.Width, Allocation.Height);
                 cr.Color = text_bg_color;
                 cr.FillPreserve();
-            
+
                 cr.SelectFontFace("Sans", FontSlant.Normal, FontWeight.Bold);
                 cr.Color = text_color;
                 cr.SetFontSize(Allocation.Width * 0.2);
                 DrawText(cr, Mono.Unix.Catalog.GetString("Insert\nDisc"), 3);
             }
         }
-        
+
         private void DrawText(Cairo.Context cr, string text, double lineSpacing)
         {
             string [] lines = text.Split('\n');
             double [] cuml_heights = new double[lines.Length];
             double y_start = 0.0;
-            
+
             for(int i = 0; i < lines.Length; i++) {
                 TextExtents extents = cr.TextExtents(lines[i]);
                 double height = extents.Height + (i > 0 ? lineSpacing : 0);
                 cuml_heights[i] = i > 0 ? cuml_heights[i - 1] + height : height;
             }
-            
+
             y_start = (Allocation.Height / 2) - (cuml_heights[cuml_heights.Length - 1] / 2);
-            
+
             for(int i = 0; i < lines.Length; i++) {
                 TextExtents extents = cr.TextExtents(lines[i]);
-            
+
                 double x = (Allocation.Width / 2) - (extents.Width / 2);
                 double y = y_start + cuml_heights[i];
-        
+
                 cr.MoveTo(x, y);
                 cr.ShowText(lines[i]);
-            }   
+            }
         }
 
         private void CalculateA2()
         {
             a2 = a1 + 2 * Math.PI * Fraction;
         }
-        
+
         private double Fraction {
             get { return (double)Usage / (double)Capacity; }
         }
-        
+
         public long Capacity {
             get { return capacity; }
-            set { 
+            set {
                 capacity = value;
                 CalculateA2();
                 QueueDraw();
             }
         }
-        
+
         public long Usage {
             get { return usage; }
             set {
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/GenericToolItem.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/GenericToolItem.cs
index 8a92a02..052c2d5 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/GenericToolItem.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/GenericToolItem.cs
@@ -34,13 +34,13 @@ namespace Banshee.Widgets
     public class GenericToolItem<T> : ToolItem where T : Widget
     {
         private T widget;
-        
+
         public GenericToolItem (T widget)
         {
             this.widget = widget;
             Add (widget);
         }
-        
+
         public T Widget {
             get { return widget; }
         }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/HigMessageDialog.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/HigMessageDialog.cs
index f7abfdd..c945774 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/HigMessageDialog.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/HigMessageDialog.cs
@@ -3,34 +3,33 @@
  *  HigMessageDialog.cs
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Banshee.Widgets
 {
     public class HigMessageDialog : Gtk.Dialog
-    {    
-        private Gtk.AccelGroup accel_group;
+    {
         private Gtk.Image image;
         private Gtk.VBox label_vbox;
         private Gtk.Label message_label;
@@ -52,9 +51,6 @@ namespace Banshee.Widgets
             VBox.Spacing = 12;
             ActionArea.Layout = Gtk.ButtonBoxStyle.End;
 
-            accel_group = new Gtk.AccelGroup ();
-            AddAccelGroup (accel_group);
-
             Gtk.HBox hbox = new Gtk.HBox (false, 12);
             hbox.BorderWidth = 5;
             hbox.Show ();
@@ -80,7 +76,7 @@ namespace Banshee.Widgets
             image.Yalign = 0.1f;
             image.Show ();
             hbox.PackStart (image, false, false, 0);
-            
+
             label_vbox = new Gtk.VBox (false, 0);
             label_vbox.Show ();
             hbox.PackStart (label_vbox, true, true, 0);
@@ -107,7 +103,7 @@ namespace Banshee.Widgets
             label.SetAlignment (0.0f, 0.5f);
             label.Show ();
             label_vbox.PackStart (label, false, false, 0);
-            
+
             switch (buttons) {
             case Gtk.ButtonsType.None:
                 break;
@@ -161,7 +157,7 @@ namespace Banshee.Widgets
             AddButton (button, response, isDefault);
             return button;
         }
-        
+
         public void AddButton (string stock_id, Gtk.ResponseType response, bool isDefault)
         {
             Gtk.Button button = new Gtk.Button (stock_id);
@@ -175,12 +171,9 @@ namespace Banshee.Widgets
             AddActionWidget (button, response);
 
             if (isDefault) {
+                Default = button;
                 DefaultResponse = response;
-                button.AddAccelerator ("activate",
-                               accel_group,
-                               (uint) Gdk.Key.Return, 
-                               0,
-                               Gtk.AccelFlags.Visible);
+                button.GrabDefault ();
             }
         }
 
@@ -197,7 +190,7 @@ namespace Banshee.Widgets
                  return (Gtk.ResponseType)hmd.Run();
              } finally {
                  hmd.Destroy();
-             }    
+             }
         }
 
         //Run and destroy a standard confirmation dialog
@@ -213,23 +206,23 @@ namespace Banshee.Widgets
                  return (Gtk.ResponseType)hmd.Run();
              } finally {
                  hmd.Destroy();
-             }    
+             }
          }
-         
+
          public Gdk.Pixbuf Image {
             set {
                 image.Pixbuf = value;
             }
-             
+
             get {
                 return image.Pixbuf;
             }
         }
-        
+
         public Gtk.Label MessageLabel {
             get { return message_label; }
         }
-        
+
         public Gtk.VBox LabelVBox {
             get { return label_vbox; }
         }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/HoverImageButton.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/HoverImageButton.cs
index 763c53b..998a9a1 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/HoverImageButton.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/HoverImageButton.cs
@@ -5,24 +5,24 @@
  *  Written by Aaron Bockover <abockover at novell.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -61,7 +61,7 @@ namespace Banshee.Widgets
             Add(image);
         }
 
-        public HoverImageButton(IconSize size, string icon_name) : 
+        public HoverImageButton(IconSize size, string icon_name) :
             this(size, new string [] { icon_name })
         {
         }
@@ -79,7 +79,7 @@ namespace Banshee.Widgets
                 handler(this, EventArgs.Empty);
             }
         }
-        
+
         private bool changing_style = false;
         protected override void OnStyleSet(Style previous_style)
         {
@@ -130,7 +130,7 @@ namespace Banshee.Widgets
             HasFocus = true;
             is_pressed = true;
             QueueDraw();
-            
+
             return base.OnButtonPressEvent(evnt);
         }
 
@@ -150,12 +150,12 @@ namespace Banshee.Widgets
         protected override bool OnExposeEvent(Gdk.EventExpose evnt)
         {
             base.OnExposeEvent(evnt);
-            
+
             PropagateExpose(Child, evnt);
-            
+
             if(HasFocus && draw_focus) {
                 Style.PaintFocus(Style, GdkWindow, StateType.Normal, evnt.Area, this, "button",
-                    0, 0, Allocation.Width, Allocation.Height); 
+                    0, 0, Allocation.Width, Allocation.Height);
             }
 
             return true;
@@ -163,7 +163,7 @@ namespace Banshee.Widgets
 
         private void UpdateImage()
         {
-            image.Pixbuf = is_hovering || is_pressed || HasFocus 
+            image.Pixbuf = is_hovering || is_pressed || HasFocus
                 ? active_pixbuf : normal_pixbuf;
         }
 
@@ -199,43 +199,43 @@ namespace Banshee.Widgets
         {
             return (byte)Math.Max(0, Math.Min(255, val));
         }
-        
+
         private unsafe Gdk.Pixbuf ColorShiftPixbuf(Gdk.Pixbuf src, byte shift)
         {
             Gdk.Pixbuf dest = new Gdk.Pixbuf(src.Colorspace, src.HasAlpha, src.BitsPerSample, src.Width, src.Height);
-            
+
             byte *src_pixels_orig = (byte *)src.Pixels;
             byte *dest_pixels_orig = (byte *)dest.Pixels;
-            
+
             for(int i = 0; i < src.Height; i++) {
                 byte *src_pixels = src_pixels_orig + i * src.Rowstride;
                 byte *dest_pixels = dest_pixels_orig + i * dest.Rowstride;
-                
+
                 for(int j = 0; j < src.Width; j++) {
                     *(dest_pixels++) = PixelClamp(*(src_pixels++) + shift);
                     *(dest_pixels++) = PixelClamp(*(src_pixels++) + shift);
                     *(dest_pixels++) = PixelClamp(*(src_pixels++) + shift);
-                    
+
                     if(src.HasAlpha) {
                         *(dest_pixels++) = *(src_pixels++);
                     }
                 }
             }
-            
+
             return dest;
         }
 
         public string [] IconNames {
             get { return icon_names; }
-            set { 
-                icon_names = value; 
+            set {
+                icon_names = value;
                 LoadPixbufs();
             }
         }
 
         public IconSize IconSize {
             get { return icon_size; }
-            set { 
+            set {
                 icon_size = value;
                 LoadPixbufs();
             }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/LinearProgress.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/LinearProgress.cs
index b985542..9bcbd47 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/LinearProgress.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/LinearProgress.cs
@@ -6,24 +6,24 @@
  *  Written by Aaron Bockover (aaron at aaronbock.net)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -48,16 +48,16 @@ namespace Banshee.Widgets
         {
             if(bar_gc == null) {
                 bar_gc = new Gdk.GC(GdkWindow);
-                Gdk.Color color = Hyena.Gui.GtkUtilities.ColorBlend(Style.Background(StateType.Normal), 
+                Gdk.Color color = Hyena.Gui.GtkUtilities.ColorBlend(Style.Background(StateType.Normal),
                     Style.Foreground(StateType.Normal));
                 bar_gc.Background = color;
                 bar_gc.Foreground = color;
             }
-        
+
             DrawGdk();
             return false;
         }
-        
+
         private void DrawGdk()
         {
             int bar_width = (int)((double)Allocation.Width * fraction - 3.0);
@@ -66,12 +66,12 @@ namespace Banshee.Widgets
                 GdkWindow.DrawRectangle(bar_gc, true, 2, 2, bar_width, Allocation.Height - 4);
             }
         }
-        
+
         public double Fraction {
             get {
                 return fraction;
             }
-            
+
             set {
                 fraction = Math.Max(0.0, Math.Min(1.0, value));
                 QueueDraw();
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/LinkLabel.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/LinkLabel.cs
index 04735f5..27370a2 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/LinkLabel.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/LinkLabel.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 
@@ -36,10 +36,10 @@ namespace Banshee.Widgets
     public class LinkLabel : EventBox
     {
         public delegate bool UriOpenHandler(string uri);
-    
+
         private static UriOpenHandler default_open_handler;
         private static Gdk.Cursor hand_cursor = new Gdk.Cursor(Gdk.CursorType.Hand1);
-        
+
         private Label label;
         private Uri uri;
         private bool act_as_link;
@@ -48,42 +48,42 @@ namespace Banshee.Widgets
         private bool selectable;
         private UriOpenHandler open_handler;
         private Gdk.Color link_color;
-        
+
         private bool interior_focus;
         private int focus_width;
         private int focus_padding;
         private int padding;
-        
-        public event EventHandler Clicked; 
-        
+
+        public event EventHandler Clicked;
+
         public LinkLabel() : this(null, null)
         {
             Open = DefaultOpen;
         }
-        
+
         public LinkLabel(string text, Uri uri)
         {
             CanFocus = true;
             AppPaintable = true;
-            
+
             this.uri = uri;
-            
+
             label = new Label(text);
             label.Show();
-            
+
             link_color = label.Style.Background(StateType.Selected);
             ActAsLink = true;
-            
+
             Add(label);
         }
 
         protected override void OnStyleSet (Style previous_style)
         {
             base.OnStyleSet (previous_style);
-            
+
             CheckButton check = new CheckButton ();
             check.EnsureStyle ();
-            
+
             interior_focus = GtkUtilities.StyleGetProperty<bool> (check, "interior-focus", false);
             focus_width = GtkUtilities.StyleGetProperty<int> (check, "focus-line-width", -1);
             focus_padding = GtkUtilities.StyleGetProperty<int> (check, "focus-padding", -1);
@@ -95,70 +95,70 @@ namespace Banshee.Widgets
             if(uri != null && Open != null) {
                 Open(uri.AbsoluteUri);
             }
-        
+
             EventHandler handler = Clicked;
             if(handler != null) {
                 handler(this, new EventArgs());
             }
         }
-        
+
         protected override bool OnExposeEvent(Gdk.EventExpose evnt)
         {
             if(!IsDrawable) {
                 return false;
             }
-            
+
             if(evnt.Window == GdkWindow && HasFocus) {
                 int layout_width = 0, layout_height = 0;
                 label.Layout.GetPixelSize(out layout_width, out layout_height);
-                Style.PaintFocus (Style, GdkWindow, State, evnt.Area, this, "checkbutton", 
+                Style.PaintFocus (Style, GdkWindow, State, evnt.Area, this, "checkbutton",
                     0, 0, layout_width + 2 * padding, layout_height + 2 * padding);
             }
-            
+
             if(Child != null) {
                 PropagateExpose(Child, evnt);
             }
-            
+
             return false;
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             if (label == null) {
                 base.OnSizeRequested (ref requisition);
                 return;
             }
-            
+
             requisition.Width = 0;
             requisition.Height = 0;
-                
+
             Requisition child_requisition = label.SizeRequest ();
             requisition.Width = Math.Max (requisition.Width, child_requisition.Width);
             requisition.Height += child_requisition.Height;
-            
+
             requisition.Width += ((int)BorderWidth + padding) * 2;
             requisition.Height += ((int)BorderWidth + padding) * 2;
-            
+
             base.OnSizeRequested (ref requisition);
         }
 
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             Gdk.Rectangle child_allocation = new Gdk.Rectangle ();
-            
+
             if (label == null || !label.Visible) {
                 return;
             }
-            
+
             int total_padding = (int)BorderWidth + padding;
-            
+
             child_allocation.X = total_padding;
             child_allocation.Y = total_padding;
             child_allocation.Width = (int)Math.Max (1, Allocation.Width - 2 * total_padding);
             child_allocation.Height = (int)Math.Max (1, Allocation.Height - 2 * total_padding);
-            
+
             label.SizeAllocate (child_allocation);
         }
 
@@ -168,31 +168,31 @@ namespace Banshee.Widgets
                 HasFocus = true;
                 is_pressed = true;
             }
-            
+
             return false;
         }
-        
+
         protected override bool OnButtonReleaseEvent(Gdk.EventButton evnt)
         {
             if(evnt.Button == 1 && is_pressed && is_hovering) {
                 OnClicked();
                 is_pressed = false;
             }
-            
+
             return false;
         }
-        
+
         protected override bool OnKeyReleaseEvent(Gdk.EventKey evnt)
         {
-            if(evnt.Key != Gdk.Key.KP_Enter && evnt.Key != Gdk.Key.Return 
+            if(evnt.Key != Gdk.Key.KP_Enter && evnt.Key != Gdk.Key.Return
                 && evnt.Key != Gdk.Key.space) {
                 return  false;
             }
-            
+
             OnClicked();
             return false;
         }
-        
+
         protected override bool OnEnterNotifyEvent(Gdk.EventCrossing evnt)
         {
             is_hovering = true;
@@ -206,70 +206,70 @@ namespace Banshee.Widgets
             GdkWindow.Cursor = null;
             return false;
         }
-        
+
         public Pango.EllipsizeMode Ellipsize {
             get { return label.Ellipsize; }
             set { label.Ellipsize = value; }
         }
-        
+
         public string Text {
             get { return label.Text; }
             set { label.Text = value; }
         }
-        
+
         public string Markup {
             set { label.Markup = value; }
         }
-        
+
         public Label Label {
             get { return label; }
         }
-        
+
         public float Xalign {
             get { return label.Xalign; }
             set { label.Xalign = value; }
         }
-        
+
         public float Yalign {
             get { return label.Yalign; }
             set { label.Yalign = value; }
         }
-        
+
         public bool Selectable {
             get { return selectable; }
             set {
                 if((value && !ActAsLink) || !value) {
                     label.Selectable = value;
                 }
-                
+
                 selectable = value;
             }
         }
-        
+
         public Uri Uri {
             get { return uri; }
             set { uri = value; }
         }
-        
+
         public string UriString {
             get { return uri == null ? null : uri.AbsoluteUri; }
             set { uri = value == null ? null : new Uri(value); }
         }
-        
+
         public UriOpenHandler Open {
             get { return open_handler; }
             set { open_handler = value; }
         }
-        
+
         public bool ActAsLink {
             get { return act_as_link; }
             set {
                 if(act_as_link == value) {
                     return;
                 }
-                
+
                 act_as_link = value;
-                
+
                 if(act_as_link) {
                     label.Selectable = false;
                     label.ModifyFg(Gtk.StateType.Normal, link_color);
@@ -277,11 +277,11 @@ namespace Banshee.Widgets
                     label.Selectable = selectable;
                     label.ModifyFg(Gtk.StateType.Normal, label.Style.Foreground(Gtk.StateType.Normal));
                 }
-                
+
                 label.QueueDraw();
             }
         }
-        
+
         public static UriOpenHandler DefaultOpen {
             get { return default_open_handler; }
             set { default_open_handler = value; }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/MenuTile.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/MenuTile.cs
index c4ac917..f94b871 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/MenuTile.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/MenuTile.cs
@@ -5,27 +5,27 @@
  *  Written by Gabriel Burt <gburt at novell.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 
@@ -36,7 +36,7 @@ namespace Banshee.Widgets
         public MenuTile () : base ()
         {
         }
-        
+
         protected override bool OnButtonPressEvent (Gdk.EventButton press)
         {
             return false;
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/MessagePane.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/MessagePane.cs
index 4701252..c06ba18 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/MessagePane.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/MessagePane.cs
@@ -32,9 +32,9 @@ using System;
 using Mono.Unix;
 using Gtk;
 
-namespace Banshee.Widgets 
+namespace Banshee.Widgets
 {
-    public class MessagePane : Table 
+    public class MessagePane : Table
     {
         private Image headerIcon;
         private Label header;
@@ -58,7 +58,7 @@ namespace Banshee.Widgets
         public Gdk.Pixbuf HeaderIcon {
             set { headerIcon.Pixbuf = value; }
         }
-        
+
         public Gdk.Pixbuf ArrowIcon {
             set { arrow = value; }
         }
@@ -70,11 +70,11 @@ namespace Banshee.Widgets
         public string HeaderMarkup {
             set { header.Markup = value; }
         }
-        
+
         private void AttachArrow (Gdk.Pixbuf arrow)
         {
             uint row = NRows;
-            
+
             Image image = arrow == null ? new Image (this.arrow) : new Image (arrow);
             image.Yalign = 0.0f;
             image.Xalign = 1.0f;
@@ -91,7 +91,7 @@ namespace Banshee.Widgets
         {
             Append (tip, showArrow, null);
         }
-        
+
         public void Append (string tip, bool showArrow, Gdk.Pixbuf arrow)
         {
             uint row = NRows;
@@ -120,7 +120,7 @@ namespace Banshee.Widgets
             Append(widget, xoptions, yoptions, showArrow, null);
         }
 
-        public void Append (Widget widget, AttachOptions xoptions, AttachOptions yoptions, 
+        public void Append (Widget widget, AttachOptions xoptions, AttachOptions yoptions,
             bool showArrow, Gdk.Pixbuf arrow)
         {
             uint row = NRows;
@@ -132,7 +132,7 @@ namespace Banshee.Widgets
             Attach (widget, 1, 2, row, row + 1, xoptions, yoptions, 0, 0);
             widget.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
         }
-        
+
         public void Clear ()
         {
             foreach (Widget child in Children) {
@@ -140,10 +140,10 @@ namespace Banshee.Widgets
                     Remove (child);
                 }
             }
-            
+
             Resize (1, 2);
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/PropertyTable.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/PropertyTable.cs
index f67a7b2..7cb9bd2 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/PropertyTable.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/PropertyTable.cs
@@ -6,24 +6,24 @@
  *  Written by Aaron Bockover (aaron at aaronbock.net)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -36,13 +36,13 @@ namespace Banshee.Widgets
     {
         public PropertyTable() : base(1, 1, false)
         {
-        
+
         }
-        
+
         public void AddWidget(string key, Widget widget, bool boldLabel)
         {
             uint rows = NRows;
-            
+
             if(key != null) {
                 Label keyLabel = new Label();
                 if(boldLabel) {
@@ -50,54 +50,54 @@ namespace Banshee.Widgets
                 } else {
                     keyLabel.Text = key;
                 }
-                keyLabel.Xalign = 0.0f; 
-            
+                keyLabel.Xalign = 0.0f;
+
                 Attach(keyLabel, 0, 1, rows, rows + 1);
             }
-            
+
             Attach(widget, 1, 2, rows, rows + 1);
         }
-        
+
         public void AddWidget(string key, Widget widget)
         {
             AddWidget(key, widget, true);
         }
-        
+
         public void AddSeparator()
         {
             HSeparator sep = new HSeparator();
             Attach(sep, 0, 2, NRows, NRows + 1);
             sep.HeightRequest = 10;
         }
-        
+
         public void AddLabel(string key, object value, bool boldLabel)
         {
             if(value == null)
                 return;
-                
+
             Label valLabel = new Label(value.ToString());
             valLabel.Xalign = 0.0f;
             valLabel.UseUnderline = false;
             valLabel.Selectable = true;
-            
+
             AddWidget(key, valLabel, boldLabel);
         }
-        
+
         public void AddLabel(string key, object value)
         {
             AddLabel(key, value, true);
         }
-        
+
         public Entry AddEntry(string key, object value, bool boldLabel)
-        {        
+        {
             Entry valEntry = new Entry();
             valEntry.Text = value == null ? String.Empty : value.ToString();
-            
+
             AddWidget(key, valEntry, boldLabel);
-            
+
             return valEntry;
         }
-        
+
         public Entry AddEntry(string key, object value)
         {
             return AddEntry(key, value, true);
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/RatingActionProxy.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/RatingActionProxy.cs
index e115045..4136adf 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/RatingActionProxy.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/RatingActionProxy.cs
@@ -1,4 +1,4 @@
-// 
+//
 // RatingActionProxy.cs
 //
 // Author:
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/SearchEntry.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/SearchEntry.cs
index f2871b0..11fa899 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/SearchEntry.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/SearchEntry.cs
@@ -26,7 +26,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using Gtk;
 
@@ -43,7 +43,7 @@ namespace Banshee.Widgets
         private int active_filter_id = -1;
 
         private uint changed_timeout_id = 0;
-        
+
         private string empty_message;
         private bool ready = false;
 
@@ -64,7 +64,7 @@ namespace Banshee.Widgets
             add { filter_changed += value; }
             remove { filter_changed -= value; }
         }
-        
+
         public Menu Menu {
             get { return menu; }
         }
@@ -75,10 +75,10 @@ namespace Banshee.Widgets
 
             BuildWidget();
             BuildMenu();
-            
+
             NoShowAll = true;
         }
-            
+
         private void BuildWidget()
         {
             box = new HBox();
@@ -135,7 +135,7 @@ namespace Banshee.Widgets
         private void OnPositionMenu(Menu menu, out int x, out int y, out bool push_in)
         {
             int origin_x, origin_y, tmp;
-            
+
             filter_button.GdkWindow.GetOrigin(out origin_x, out tmp);
             GdkWindow.GetOrigin(out tmp, out origin_y);
 
@@ -156,10 +156,10 @@ namespace Banshee.Widgets
             if(toggling || !(o is FilterMenuItem)) {
                 return;
             }
-            
+
             toggling = true;
             FilterMenuItem item = (FilterMenuItem)o;
-            
+
             foreach(MenuItem child_item in menu) {
                 if(!(child_item is FilterMenuItem)) {
                     continue;
@@ -199,20 +199,20 @@ namespace Banshee.Widgets
             Gdk.Color color = entry.Style.Base (entry.State);
             filter_button.ModifyBg (entry.State, color);
             clear_button.ModifyBg (entry.State, color);
-            
+
             box.BorderWidth = (uint)entry.Style.XThickness;
         }
-        
+
         private void OnInnerEntryStyleSet (object o, StyleSetArgs args)
         {
             UpdateStyle ();
         }
-        
+
         private void OnInnerEntryStateChanged (object o, EventArgs args)
         {
             UpdateStyle ();
         }
-        
+
         private void OnInnerEntryFocusEvent(object o, EventArgs args)
         {
             QueueDraw();
@@ -250,9 +250,9 @@ namespace Banshee.Widgets
         protected override bool OnExposeEvent(Gdk.EventExpose evnt)
         {
             PropagateExpose(Child, evnt);
-            Style.PaintShadow(entry.Style, GdkWindow, StateType.Normal, 
+            Style.PaintShadow(entry.Style, GdkWindow, StateType.Normal,
                 ShadowType.In, evnt.Area, entry, "entry",
-                0, 0, Allocation.Width, Allocation.Height); 
+                0, 0, Allocation.Width, Allocation.Height);
             return true;
         }
 
@@ -280,7 +280,7 @@ namespace Banshee.Widgets
             if(handler != null) {
                 handler(this, EventArgs.Empty);
             }
-            
+
             if(IsQueryAvailable) {
                 OnInnerEntryChanged(this, EventArgs.Empty);
             }
@@ -353,7 +353,7 @@ namespace Banshee.Widgets
 
         public int ActiveFilterID {
             get { return active_filter_id; }
-            private set { 
+            private set {
                 if(value == active_filter_id) {
                     return;
                 }
@@ -386,13 +386,13 @@ namespace Banshee.Widgets
             get { return ready; }
             set { ready = value; }
         }
-        
+
         public new bool HasFocus {
             get { return entry.HasFocus; }
             set { entry.HasFocus = true; }
         }
 
-        
+
         public Entry InnerEntry {
             get { return entry; }
         }
@@ -425,14 +425,14 @@ namespace Banshee.Widgets
             public string Label {
                 get { return label; }
             }
-            
+
             // FIXME: Remove when restored to CheckMenuItem
             private bool active;
             public bool Active {
                 get { return active; }
                 set { active = value; }
             }
-            
+
             public new event EventHandler Toggled;
             protected override void OnActivated ()
             {
@@ -455,9 +455,6 @@ namespace Banshee.Widgets
             {
                 this.parent = parent;
                 HasFrame = false;
-                
-                layout = new Pango.Layout(PangoContext);
-                layout.FontDescription = PangoContext.FontDescription.Copy();
 
                 parent.StyleSet += OnParentStyleSet;
                 WidthChars = 1;
@@ -504,6 +501,11 @@ namespace Banshee.Widgets
                     return ret;
                 }
 
+                if (layout == null) {
+                    layout = new Pango.Layout(PangoContext);
+                    layout.FontDescription = PangoContext.FontDescription.Copy();
+                }
+
                 int width, height;
                 layout.SetMarkup(parent.EmptyMessage);
                 layout.GetPixelSize(out width, out height);
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs
index 12769e8..83dc20d 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/SeekSlider.cs
@@ -5,29 +5,30 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 using Gtk;
+using Mono.Unix;
 
 namespace Banshee.Widgets
 {
@@ -39,36 +40,38 @@ namespace Banshee.Widgets
         private bool raise_seek_requested;
         private bool can_set_value;
         private double pressed_x;
-        
+
         public event EventHandler SeekRequested;
         public event EventHandler DurationChanged;
 
-        public SeekSlider() : base(0.0, 0.0, 0.0)
+        public SeekSlider () : base (0.0, 0.0, 0.0)
         {
             UpdatePolicy = UpdateType.Continuous;
             DrawValue = false;
-            
+
             raise_seek_requested = true;
             can_set_value = true;
-            
+
             Adjustment.Lower = 0;
             Adjustment.Upper = 0;
-            
-            SetIdle();
+
+            Accessible.Name = Catalog.GetString ("Seek");
+
+            SetIdle ();
         }
-        
-        protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
+
+        protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
         {
             can_set_value = false;
             if (evnt.Button == 1) {
                 pressed_x = evnt.X;
             }
-            return base.OnButtonPressEvent(evnt);
+            return base.OnButtonPressEvent (evnt);
         }
 
-        protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
+        protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
         {
-            switch(evnt.Key) {
+            switch (evnt.Key) {
                 case Gdk.Key.Left:
                 case Gdk.Key.Right:
                     return false;
@@ -77,65 +80,65 @@ namespace Banshee.Widgets
             }
         }
 
-        protected override bool OnScrollEvent(Gdk.EventScroll evnt) {
+        protected override bool OnScrollEvent (Gdk.EventScroll evnt) {
             if (can_seek) {
                 SeekValue += (evnt.Direction.Equals (Gdk.ScrollDirection.Down) ? -1 : 1) * 10000; // skip 10s
-                OnSeekRequested();
+                OnSeekRequested ();
             }
-            
+
             return base.OnScrollEvent (evnt);
         }
 
-        protected override bool OnButtonReleaseEvent(Gdk.EventButton evnt)
+        protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt)
         {
             can_set_value = true;
-            
-            if(timeout > 0) {
-                GLib.Source.Remove(timeout);
+
+            if (timeout > 0) {
+                GLib.Source.Remove (timeout);
             }
-            
+
             if (can_seek) {
                 if (evnt.Button == 1 && Math.Abs (pressed_x - evnt.X) <= 3.0) {
                     SeekValue = (long) (evnt.X / Allocation.Width * Duration); // seek to clicked position
                 }
-                OnSeekRequested();
+                OnSeekRequested ();
             }
-            
-            return base.OnButtonReleaseEvent(evnt);
+
+            return base.OnButtonReleaseEvent (evnt);
         }
-        
-        protected override void OnValueChanged()
+
+        protected override void OnValueChanged ()
         {
-            if(timeout == 0 && raise_seek_requested) {
-                timeout = GLib.Timeout.Add(timeout_delay, OnSeekRequested);
+            if (timeout == 0 && raise_seek_requested) {
+                timeout = GLib.Timeout.Add (timeout_delay, OnSeekRequested);
             }
-            
-            base.OnValueChanged();
+
+            base.OnValueChanged ();
         }
-        
-        private bool OnSeekRequested()
-        {   
-            if(raise_seek_requested) {
+
+        private bool OnSeekRequested ()
+        {
+            if (raise_seek_requested) {
                 EventHandler handler = SeekRequested;
-                if(handler != null) {
-                    handler(this, new EventArgs());
+                if (handler != null) {
+                    handler (this, new EventArgs ());
                 }
             }
-            
+
             timeout = 0;
             return false;
         }
-        
+
         public long SeekValue {
             get { return (long)Value; }
             set {
-                if(!can_set_value) {
+                if (!can_set_value) {
                     return;
                 }
-                
+
                 raise_seek_requested = false;
-                
-                if(value > Duration) {
+
+                if (value > Duration) {
                     Duration = Int64.MaxValue;
                     Value = value;
                 } else {
@@ -145,34 +148,34 @@ namespace Banshee.Widgets
                 raise_seek_requested = true;
             }
         }
-        
+
         public double Duration {
             get { return Adjustment.Upper; }
             set {
                 Adjustment.Upper = value;
                 EventHandler handler = DurationChanged;
-                if(handler != null) {
-                    handler(this, new EventArgs());
+                if (handler != null) {
+                    handler (this, EventArgs.Empty);
                 }
             }
         }
-        
-        public void SetIdle()
+
+        public void SetIdle ()
         {
             Sensitive = false;
             SeekValue = 0;
             Duration = 0;
         }
-        
+
         public uint SeekRequestDelay {
             get { return timeout_delay; }
             set { timeout_delay = value; }
         }
-        
+
         public bool CanSeek {
             get { return can_seek; }
-            set { 
-                can_seek = value; 
+            set {
+                can_seek = value;
                 Sensitive = value;
             }
         }
@@ -185,6 +188,6 @@ namespace Banshee.Widgets
                 }
                 base.Sensitive = value;
             }
-        } 
+        }
     }
 }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs
index 4cb3694..4283508 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/StreamPositionLabel.cs
@@ -48,103 +48,103 @@ namespace Banshee.Widgets
         private string format_string = "<small>{0}</small>";
         private Pango.Layout layout;
         private StreamLabelState state;
-        
+
         public StreamPositionLabel (SeekSlider seekRange) : base (0.0f, 0.0f, 1.0f, 1.0f)
         {
             AppPaintable = true;
-            
+
             this.seekRange = seekRange;
             this.seekRange.ValueChanged += OnSliderUpdated;
         }
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
             BuildLayouts ();
             UpdateLabel ();
         }
-        
+
         private void BuildLayouts ()
         {
             if (layout != null) {
                 layout.Dispose ();
             }
-            
+
             layout = new Pango.Layout (PangoContext);
             layout.FontDescription = PangoContext.FontDescription.Copy ();
             layout.Ellipsize = Pango.EllipsizeMode.None;
         }
-        
+
         private bool first_style_set = false;
-        
+
         protected override void OnStyleSet (Style old_style)
         {
             base.OnStyleSet (old_style);
-            
+
             if (first_style_set) {
                 BuildLayouts ();
                 UpdateLabel ();
             }
-            
+
             first_style_set = true;
         }
-        
+
         protected override void OnSizeRequested (ref Gtk.Requisition requisition)
         {
             if (!IsRealized || layout == null) {
                 return;
             }
-            
+
             EnsureStyle ();
-            
+
             int width, height;
             layout.GetPixelSize (out width, out height);
-            
+
             requisition.Width = width;
             requisition.Height = height;
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             int bar_width = (int)((double)Allocation.Width * buffering_progress);
             bool render_bar = false;
-            
+
             if (bar_width > 0 && IsBuffering) {
                 bar_width -= 2 * Style.XThickness;
                 render_bar = true;
-                
-                Gtk.Style.PaintBox (Style, GdkWindow, StateType.Normal, ShadowType.In, evnt.Area, this, null, 
+
+                Gtk.Style.PaintBox (Style, GdkWindow, StateType.Normal, ShadowType.In, evnt.Area, this, null,
                     Allocation.X, Allocation.Y, Allocation.Width, Allocation.Height);
-                
+
                 if (bar_width > 0) {
-                    Gtk.Style.PaintBox (Style, GdkWindow, StateType.Selected, ShadowType.EtchedOut, 
-                        evnt.Area, this, "bar", 
-                        Allocation.X + Style.XThickness, Allocation.Y + Style.YThickness, 
+                    Gtk.Style.PaintBox (Style, GdkWindow, StateType.Selected, ShadowType.EtchedOut,
+                        evnt.Area, this, "bar",
+                        Allocation.X + Style.XThickness, Allocation.Y + Style.YThickness,
                         bar_width, Allocation.Height - 2 * Style.YThickness);
                 }
             }
-            
+
             int width, height;
             layout.GetPixelSize (out width, out height);
-            
+
             int x = Allocation.X + ((Allocation.Width - width) / 2);
             int y = Allocation.Y + ((Allocation.Height - height) / 2);
             Gdk.Rectangle rect = evnt.Area;
-            
+
             if (render_bar) {
                 width = bar_width + Style.XThickness;
                 rect = new Gdk.Rectangle (evnt.Area.X, evnt.Area.Y, width, evnt.Area.Height);
                 Gtk.Style.PaintLayout (Style, GdkWindow, StateType.Selected, true, rect, this, null, x, y, layout);
-                
+
                 rect.X += rect.Width;
                 rect.Width = evnt.Area.Width - rect.Width;
             }
-            
+
             Gtk.Style.PaintLayout (Style, GdkWindow, StateType.Normal, false, rect, this, null, x, y, layout);
-            
+
             return true;
         }
-        
+
         private static string idle = Catalog.GetString ("Idle");
         private static string contacting = Catalog.GetString ("Contacting...");
 
@@ -153,7 +153,7 @@ namespace Banshee.Widgets
             if (!IsRealized || layout == null) {
                 return;
             }
-            
+
             if (IsBuffering) {
                 double progress = buffering_progress * 100.0;
                 UpdateLabel (String.Format ("{0}: {1}%", Catalog.GetString("Buffering"), progress.ToString ("0.0")));
@@ -173,30 +173,30 @@ namespace Banshee.Widgets
                     FormatDuration ((long)seekRange.Value), FormatDuration ((long)seekRange.Adjustment.Upper)));
             }
         }
-        
+
         private void UpdateLabel (string text)
         {
             if (!IsRealized || layout == null) {
                 return;
             }
-            
+
             layout.SetMarkup (String.Format (format_string, GLib.Markup.EscapeText (text)));
             QueueResize ();
         }
-        
+
         private static string FormatDuration (long time)
         {
             time /= 1000;
-            return (time > 3600 ? 
+            return (time > 3600 ?
                     String.Format ("{0}:{1:00}:{2:00}", time / 3600, (time / 60) % 60, time % 60) :
                     String.Format ("{0}:{1:00}", time / 60, time % 60));
         }
-        
+
         private void OnSliderUpdated (object o, EventArgs args)
         {
             UpdateLabel ();
         }
-        
+
         public double BufferingProgress {
             get { return buffering_progress; }
             set {
@@ -205,7 +205,7 @@ namespace Banshee.Widgets
                 QueueDraw ();
             }
         }
-        
+
         public bool IsIdle {
             get { return StreamState == StreamLabelState.Idle; }
         }
@@ -213,7 +213,7 @@ namespace Banshee.Widgets
         public bool IsBuffering {
             get { return StreamState == StreamLabelState.Buffering; }
         }
-        
+
         public bool IsContacting {
             get { return StreamState == StreamLabelState.Contacting; }
         }
@@ -224,7 +224,7 @@ namespace Banshee.Widgets
 
         public StreamLabelState StreamState {
             get { return state; }
-            set { 
+            set {
                 if (state != value) {
                     state = value;
                     UpdateLabel ();
@@ -235,7 +235,7 @@ namespace Banshee.Widgets
 
         public bool IsLive {
             get { return is_live; }
-            set { 
+            set {
                 if (is_live != value) {
                     is_live = value;
                     UpdateLabel ();
@@ -243,9 +243,9 @@ namespace Banshee.Widgets
                 }
             }
         }
-        
+
         public string FormatString {
-            set { 
+            set {
                 format_string = value;
                 BuildLayouts ();
                 UpdateLabel ();
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/Tile.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/Tile.cs
index 778c928..363920e 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/Tile.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/Tile.cs
@@ -5,27 +5,27 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 
@@ -34,52 +34,52 @@ namespace Banshee.Widgets
     public class Tile : Button
     {
         private static readonly int pixbuf_size = 40;
-    
+
         private Image image = new Image();
         private Label primary_label = new Label();
         private Label secondary_label = new Label();
-        
+
         private string primary_text;
         private string secondary_text;
-        
+
         public Tile (string primaryText) : base ()
         {
             PrimaryText = primaryText;
         }
-    
+
         public Tile()
         {
             Table table = new Table(2, 2, false);
             table.ColumnSpacing = 6;
             table.RowSpacing = 2;
             table.BorderWidth = 2;
-            
+
             table.Attach(image, 0, 1, 0, 2, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
-            table.Attach(primary_label, 1, 2, 0, 1, 
+            table.Attach(primary_label, 1, 2, 0, 1,
                 AttachOptions.Fill | AttachOptions.Expand,
                 AttachOptions.Shrink, 0, 0);
-            table.Attach(secondary_label, 1, 2, 1, 2, 
+            table.Attach(secondary_label, 1, 2, 1, 2,
                 AttachOptions.Fill | AttachOptions.Expand,
                 AttachOptions.Fill | AttachOptions.Expand, 0, 0);
-                
+
             table.ShowAll();
             Add(table);
-            
+
             primary_label.Xalign = 0.0f;
             primary_label.Yalign = 0.0f;
-            
+
             secondary_label.Xalign = 0.0f;
             secondary_label.Yalign = 0.0f;
-            
+
             StyleSet += delegate {
                 primary_label.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
                 secondary_label.ModifyFg (StateType.Normal, Hyena.Gui.GtkUtilities.ColorBlend (
                     Style.Foreground (StateType.Normal), Style.Background (StateType.Normal)));
             };
-                
+
             Relief = ReliefStyle.None;
         }
-        
+
         public string PrimaryText {
             get { return primary_text; }
             set {
@@ -87,7 +87,7 @@ namespace Banshee.Widgets
                 primary_label.Text = value;
             }
         }
-        
+
         public string SecondaryText {
             get { return secondary_text; }
             set {
@@ -96,7 +96,7 @@ namespace Banshee.Widgets
                     GLib.Markup.EscapeText(value));
             }
         }
-        
+
         public Gdk.Pixbuf Pixbuf {
             get { return image.Pixbuf; }
             set {
@@ -108,7 +108,7 @@ namespace Banshee.Widgets
                     image.Pixbuf = value;
                     return;
                 }
-                
+
                 image.Pixbuf = value.ScaleSimple(pixbuf_size, pixbuf_size,
                     Gdk.InterpType.Bilinear);
             }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/TileView.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/TileView.cs
index b602885..6c922db 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/TileView.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/TileView.cs
@@ -26,7 +26,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Collections.Generic;
 
@@ -45,7 +45,7 @@ namespace Banshee.Widgets
         public TileView(int initialColumnCount) : base(null, null)
         {
             current_column_count = initialColumnCount;
-            
+
             Table table = new Table(1, 1, true);
 
             table.Show();
@@ -54,7 +54,7 @@ namespace Banshee.Widgets
 
             Show ();
         }
-        
+
         public void AddWidget(Widget widget)
         {
             widgets.Add(widget);
@@ -66,7 +66,7 @@ namespace Banshee.Widgets
             widgets.Remove(widget);
             LayoutTableDefault(cached_tables[0], widgets);
         }
-        
+
         public void ClearWidgets()
         {
             widgets.Clear();
@@ -76,7 +76,7 @@ namespace Banshee.Widgets
         protected override void OnSizeAllocated(Gdk.Rectangle allocation)
         {
             Widget child = null;
-            
+
             if(Children != null && Children.Length > 0) {
                 child = Children[0];
             }
@@ -86,10 +86,10 @@ namespace Banshee.Widgets
                 SetSize((uint)allocation.Width, (uint)allocation.Height);
                 return;
             }
-            
+
             if(cached_tables.Count == 0) {
                 base.OnSizeAllocated(allocation);
-                
+
                 Gdk.Rectangle child_allocation;
                 child_allocation.X = 0;
                 child_allocation.Y = 0;
@@ -100,16 +100,16 @@ namespace Banshee.Widgets
                 SetSize((uint)child_allocation.Width, (uint)child_allocation.Height);
                 return;
             }
-            
+
             Table first_table = cached_tables[0];
             int usable_area = allocation.Width - (child.Requisition.Width - first_table.Requisition.Width);
             int new_column_count = RelayoutTablesIfNeeded(usable_area, current_column_count);
-            
+
             if(current_column_count != new_column_count) {
                 child.SizeRequest();
                 current_column_count = new_column_count;
             }
-            
+
             base.OnSizeAllocated(allocation);
             SetSizeRequest (child.Allocation.Width, child.Allocation.Height);
             SetSize ((uint)child.Allocation.Width, (uint)child.Allocation.Height);
@@ -120,38 +120,38 @@ namespace Banshee.Widgets
             if(widget.Children == null) {
                 return;
             }
-            
+
             while(widget.Children.Length > 0) {
                 widget.Remove(widget.Children[0]);
             }
         }
-        
+
         private void ResizeTable(Table table, int columns, IList<Widget> list)
         {
             RemoveContainerEntries(table);
-            
+
             double rows = (double)list.Count / (double)columns;
             double remainder = rows - (int)rows;
-            
+
             if(remainder != 0.0) {
                 rows++;
             }
-            
+
             if(rows > 0 && columns > 0) {
                 table.Resize((uint)rows, (uint)columns);
             }
         }
-        
+
         private void RelayoutTable(Table table, IList<Widget> widgets)
         {
             uint maxcols = table.NColumns;
             uint row = 0, col = 0;
-            
+
             foreach(Widget widget in widgets) {
                 table.Attach(widget, col, col + 1, row, row + 1,
                     AttachOptions.Expand | AttachOptions.Fill,
                     AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
+
                 if(++col == maxcols) {
                     col = 0;
                     row++;
@@ -164,7 +164,7 @@ namespace Banshee.Widgets
             ResizeTable(table, current_column_count, widgets);
             RelayoutTable(table, widgets);
         }
-        
+
         private void RelayoutTables(int columnCount)
         {
             foreach(Table table in cached_tables) {
@@ -197,12 +197,12 @@ namespace Banshee.Widgets
             if(column_count < 1) {
                 column_count = 1;
             }
-            
+
             if(currentColumnCount != column_count) {
                 RelayoutTables(column_count);
                 return column_count;
             }
-            
+
             return currentColumnCount;
         }
     }
diff --git a/src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs b/src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs
index e9be31c..0a2663a 100644
--- a/src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs
+++ b/src/Core/Banshee.Widgets/Banshee.Widgets/VolumeButton.cs
@@ -14,24 +14,24 @@
  *    Christian Persch <chpe at gnome.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -50,18 +50,18 @@ namespace Bacon
     public class VolumeButton : Button
     {
         public delegate void VolumeChangedHandler(int volume);
-        
+
         private const int SCALE_SIZE = 100;
         private const int CLICK_TIMEOUT = 250;
-    
+
         private Tooltips tooltips = new Tooltips();
-        
+
         private Window dock;
         private VolumeScale slider;
         private Image image;
         private Button plus;
         private Button minus;
-        
+
         private IconSize size;
         private uint click_id;
         private int direction;
@@ -69,59 +69,60 @@ namespace Bacon
         private uint pop_time;
         private bool timeout;
         private bool classic;
-        
+
         private Gdk.Pixbuf [] pixbufs;
-        
+
         public event VolumeChangedHandler VolumeChanged;
-        
+
         public bool Classic {
             get { return classic; }
             set { classic = value; }
         }
-        
+
         public bool Active {
             get { return dock == null ? false : dock.Visible; }
         }
-        
+
         public VolumeButton() : this(0.0, 100.0, 5.0, IconSize.SmallToolbar)
         {
         }
-        
+
         public VolumeButton(double min, double max, double step, IconSize size) : base()
         {
             this.size = size;
-            
+
             BuildButton();
             BuildPopup(min, max, step);
-            
+            Accessible.Name = Catalog.GetString ("Volume");
+
             WidgetEventAfter += OnWidgetEventAfter;
         }
-        
+
         public override void Dispose()
         {
             if(dock != null) {
                 dock.Destroy();
                 dock = null;
             }
-            
+
             if(click_id != 0) {
                 GLib.Source.Remove(click_id);
                 click_id = 0;
             }
-            
+
             base.Dispose();
         }
-        
+
         private void BuildButton()
         {
             FocusOnClick = false;
             Relief = ReliefStyle.None;
-            
+
             image = new Image();
             image.Show();
             Add(image);
         }
-        
+
         private void BuildPopup(double min, double max, double step)
         {
             dock = new Window(WindowType.Popup);
@@ -131,7 +132,7 @@ namespace Bacon
             dock.KeyReleaseEvent += OnDockKeyReleaseEvent;
             dock.ScrollEvent += OnPlusMinusScollEvent;
             dock.Hidden += OnDockHidden;
-            
+
             Frame frame = new Frame();
             frame.Shadow = ShadowType.Out;
             frame.Show();
@@ -169,10 +170,10 @@ namespace Bacon
             minus.ScrollEvent += OnPlusMinusScollEvent;
             minus.ShowAll();
             box.PackEnd(minus, false, true, 0);
-            
+
             Show();
         }
-        
+
         protected virtual void OnVolumeChanged()
         {
             VolumeChangedHandler handler = VolumeChanged;
@@ -180,7 +181,7 @@ namespace Bacon
                 handler(Volume);
             }
         }
-        
+
         private bool ShowDock(Gdk.Event evnt)
         {
             Adjustment adj = slider.Adjustment;
@@ -191,7 +192,7 @@ namespace Bacon
             if(previous_volume != (int)slider.Adjustment.Lower) {
                 previous_volume = Volume;
             }
-            
+
             if(evnt is Gdk.EventKey) {
                 event_time = ((Gdk.EventKey)evnt).Time;
             } else if(evnt is Gdk.EventButton) {
@@ -201,18 +202,18 @@ namespace Bacon
             } else {
                 throw new ApplicationException("ShowDock expects EventKey, EventButton, or EventScroll");
             }
-  
+
             if(classic) {
                 dock.Realize();
             }
-            
+
             dock.Screen = Screen;
-            
+
             GdkWindow.GetOrigin(out x, out y);
             x += Allocation.X;
-            
+
             v = Volume / (adj.Upper - adj.Lower);
-            
+
             if(classic) {
                 dock.Move(x + (Allocation.Width - dock.Allocation.Width) / 2, y - dock.Allocation.Height);
                 dock.ShowAll();
@@ -220,80 +221,80 @@ namespace Bacon
                 State = StateType.Active;
             } else {
                 y += Allocation.Y;
-                
+
                 dock.Move(x, y - (SCALE_SIZE / 2));
                 dock.ShowAll();
-                
+
                 dock.GdkWindow.GetOrigin(out dx, out dy);
                 dy += dock.Allocation.Y;
-                
+
                 slider.GdkWindow.GetOrigin(out sx, out sy);
                 sy += slider.Allocation.Y;
                 ystartoff = sy - dy;
-                
+
                 timeout = true;
-                
+
                 x += (Allocation.Width - dock.Allocation.Width) / 2;
                 y -= ystartoff;
                 y -= slider.MinSliderSize / 2;
                 m = slider.Allocation.Height - slider.MinSliderSize;
                 y -= (int)(m * (1.0 - v));
-                
+
                 if(evnt is Gdk.EventButton) {
                     y += (int)((Gdk.EventButton)evnt).Y;
                 } else if(evnt is Gdk.EventScroll) {
                     y += (int)((Gdk.EventScroll)evnt).Y;
                 }
-                
+
                 dock.Move(x, y);
                 slider.GdkWindow.GetOrigin(out sx, out sy);
             }
-            
-            bool base_result = !classic && evnt is Gdk.EventButton 
-                ? base.OnButtonPressEvent((Gdk.EventButton)evnt) 
+
+            bool base_result = !classic && evnt is Gdk.EventButton
+                ? base.OnButtonPressEvent((Gdk.EventButton)evnt)
                 : true;
-            
+
             Gtk.Grab.Add(dock);
-            
-            if(Gdk.Pointer.Grab(dock.GdkWindow, true, 
-                Gdk.EventMask.ButtonPressMask | 
-                Gdk.EventMask.ButtonReleaseMask | 
+
+            if(Gdk.Pointer.Grab(dock.GdkWindow, true,
+                Gdk.EventMask.ButtonPressMask |
+                Gdk.EventMask.ButtonReleaseMask |
                 Gdk.EventMask.PointerMotionMask, null, null, event_time) != Gdk.GrabStatus.Success) {
                 Gtk.Grab.Remove(dock);
                 dock.Hide();
                 return false;
             }
-            
+
             if(Gdk.Keyboard.Grab(dock.GdkWindow, true, event_time) != Gdk.GrabStatus.Success) {
                 Display.PointerUngrab(event_time);
                 Gtk.Grab.Remove(dock);
                 dock.Hide();
                 return false;
             }
-            
+
             if(!classic && evnt is Gdk.EventButton) {
                 dock.GrabFocus();
-            
+
                 Gdk.EventButton evnt_copy = (Gdk.EventButton)Gdk.EventHelper.Copy(evnt);
                 m = slider.Allocation.Height - slider.MinSliderSize;
-                UpdateEventButton(evnt_copy, slider.GdkWindow, slider.Allocation.Width / 2, 
+                UpdateEventButton(evnt_copy, slider.GdkWindow, slider.Allocation.Width / 2,
                     ((1.0 - v) * m) + slider.MinSliderSize / 2);
                 slider.ProcessEvent(evnt_copy);
                 Gdk.EventHelper.Free(evnt_copy);
             } else {
                 slider.GrabFocus();
             }
-                   
+
             pop_time = event_time;
-            
+
             return base_result;
         }
-        
+
         protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
         {
             return ShowDock(evnt);
         }
-        
+
         protected override bool OnKeyReleaseEvent(Gdk.EventKey evnt)
         {
             switch(evnt.Key) {
@@ -305,7 +306,7 @@ namespace Bacon
                     return false;
             }
         }
-        
+
         protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
         {
             switch(evnt.Key) {
@@ -325,26 +326,26 @@ namespace Bacon
                 default:
                     break;
             }
-            
+
             return false;
         }
-        
+
         // FIXME: There's no g_signal_stop_emission* binding:
         // http://bugzilla.ximian.com/show_bug.cgi?id=76416
-        
+
         [DllImport("libgobject-2.0-0.dll")]
         private static extern void g_signal_stop_emission_by_name(IntPtr o, string signal);
-        
+
         // In case there's no map provided by the assembly .config file
         [DllImport("libgobject-2.0-0.dll", EntryPoint="g_signal_stop_emission_by_name")]
         private static extern void g_signal_stop_emission_by_name_fallback(IntPtr o, string signal);
-            
+
         private void OnWidgetEventAfter(object o, WidgetEventAfterArgs args)
         {
             if(args.Event.Type != Gdk.EventType.Scroll) {
                 return;
             }
-            
+
             try {
                 g_signal_stop_emission_by_name(Handle, "event-after");
             } catch(DllNotFoundException) {
@@ -352,33 +353,33 @@ namespace Bacon
                 g_signal_stop_emission_by_name_fallback(Handle, "event-after");
             }
         }
-        
+
         protected override bool OnScrollEvent(Gdk.EventScroll evnt)
         {
             if(evnt.Type != Gdk.EventType.Scroll) {
                 return false;
             }
-            
+
             if(evnt.Direction == Gdk.ScrollDirection.Up) {
                 AdjustVolume(1);
             } else if(evnt.Direction == Gdk.ScrollDirection.Down) {
                 AdjustVolume(-1);
             }
-            
+
             return true;
         }
-        
+
         protected override void OnStyleSet(Style previous)
         {
             base.OnStyleSet(previous);
             LoadIcons();
         }
-        
+
         private void OnDockKeyPressEvent(object o, KeyPressEventArgs args)
         {
             args.RetVal = args.Event.Key == Gdk.Key.Escape;
         }
-        
+
         private void OnDockKeyReleaseEvent(object o, KeyReleaseEventArgs args)
         {
             if(args.Event.Key == Gdk.Key.Escape) {
@@ -390,16 +391,16 @@ namespace Bacon
                 args.RetVal = true;
                 return;
             }
-            
+
             args.RetVal = false;
         }
-        
+
         private void OnDockHidden(object o, EventArgs args)
         {
             State = StateType.Normal;
             Relief = ReliefStyle.None;
         }
-        
+
         private void OnDockButtonPressEvent(object o, ButtonPressEventArgs args)
         {
             if(args.Event.Type == Gdk.EventType.ButtonPress) {
@@ -407,41 +408,41 @@ namespace Bacon
                 args.RetVal = true;
                 return;
             }
-            
+
             args.RetVal = false;
         }
-        
+
         private bool PlusMinusButtonTimeout()
         {
             if(click_id == 0) {
                 return false;
             }
-            
+
             bool result = AdjustVolume(direction);
-            
+
             if(!result) {
                 GLib.Source.Remove(click_id);
                 click_id = 0;
             }
-            
+
             return result;
         }
-        
+
         [GLib.ConnectBefore]
         private void OnPlusMinusButtonPressEvent(object o, ButtonPressEventArgs args)
         {
             if(click_id != 0) {
                 GLib.Source.Remove(click_id);
             }
-            
+
             direction = o == minus ? -1 : 1;
-            
+
             click_id = GLib.Timeout.Add(CLICK_TIMEOUT / 2, PlusMinusButtonTimeout);
             PlusMinusButtonTimeout();
-            
+
             args.RetVal = true;
         }
-        
+
         [GLib.ConnectBefore]
         private void OnPlusMinusButtonReleaseEvent(object o, ButtonReleaseEventArgs args)
         {
@@ -450,7 +451,7 @@ namespace Bacon
                 click_id = 0;
             }
         }
-        
+
         [GLib.ConnectBefore]
         private void OnPlusMinusScollEvent(object o, ScrollEventArgs args)
         {
@@ -460,11 +461,11 @@ namespace Bacon
                 AdjustVolume(-1);
             }
         }
-        
+
         private void ReleaseGrab(Gdk.Event evnt)
-        {       
+        {
             uint event_time;
-                 
+
             if(evnt is Gdk.EventKey) {
                 event_time = ((Gdk.EventKey)evnt).Time;
             } else if(evnt is Gdk.EventButton) {
@@ -472,14 +473,14 @@ namespace Bacon
             } else {
                 throw new ApplicationException("ShowDock expects EventKey or EventButton");
             }
-            
+
             Display.KeyboardUngrab(event_time);
             Display.PointerUngrab(event_time);
             Gtk.Grab.Remove(dock);
-            
+
             dock.Hide();
             timeout = false;
-            
+
             if(evnt is Gdk.EventButton) {
                 Gdk.EventButton evnt_copy = (Gdk.EventButton)Gdk.EventHelper.Copy(evnt);
                 UpdateEventButton(evnt_copy, GdkWindow, Gdk.EventType.ButtonRelease);
@@ -487,10 +488,10 @@ namespace Bacon
                 Gdk.EventHelper.Free(evnt_copy);
             }
         }
-        
+
         private void LoadIcons()
         {
-            string [,] icon_names = { 
+            string [,] icon_names = {
                 { "audio-volume-muted",  "stock_volume-0"   },
                 { "audio-volume-low",    "stock_volume-min" },
                 { "audio-volume-medium", "stock_volume-med" },
@@ -500,18 +501,18 @@ namespace Bacon
             int width, height;
             Icon.SizeLookup(size, out width, out height);
             IconTheme theme = IconTheme.GetForScreen(Screen);
-            
+
             if(pixbufs == null) {
                 pixbufs = new Gdk.Pixbuf[icon_names.Length / icon_names.Rank];
             }
-            
+
             for(int i = 0; i < icon_names.Length / icon_names.Rank; i++) {
                 for(int j = 0; j < icon_names.Rank; j++) {
                     if(pixbufs[i] != null) {
                         pixbufs[i].Dispose();
                         pixbufs[i] = null;
                     }
-                    
+
                     try {
                         pixbufs[i] = theme.LoadIcon(icon_names[i, j], width, 0);
                         break;
@@ -519,30 +520,30 @@ namespace Bacon
                     }
                 }
             }
-            
+
             Update();
         }
-        
+
         private void Update()
         {
             UpdateIcon();
             UpdateTip();
         }
-        
+
         private void UpdateIcon()
         {
             if(slider == null || pixbufs == null) {
                 return;
             }
-            
+
             double step = (slider.Adjustment.Upper - slider.Adjustment.Lower - 1) / (pixbufs.Length - 1);
             image.Pixbuf = pixbufs[(int)Math.Ceiling((Volume - 1) / step)];
         }
-        
+
         private void UpdateTip()
         {
             string tip;
-            
+
             if(Volume == slider.Adjustment.Lower) {
                 tip = Catalog.GetString("Muted");
             } else if(Volume == slider.Adjustment.Upper) {
@@ -551,14 +552,14 @@ namespace Bacon
                 tip = String.Format("{0}%", (int)((Volume - slider.Adjustment.Lower) /
                     (slider.Adjustment.Upper - slider.Adjustment.Lower) * 100.0));
             }
-            
+
             tooltips.SetTip(this, tip, null);
         }
-        
-        private bool AdjustVolume(int direction) 
+
+        private bool AdjustVolume(int direction)
         {
             Adjustment adj = slider.Adjustment;
-            
+
             double temp_vol = Volume + direction * adj.StepIncrement;
             temp_vol = Math.Min(adj.Upper, temp_vol);
             temp_vol = Math.Max(adj.Lower, temp_vol);
@@ -567,7 +568,7 @@ namespace Bacon
 
             return Volume > adj.Lower && Volume < adj.Upper;
         }
-        
+
         public void ToggleMute()
         {
             if(Volume == (int)slider.Adjustment.Lower) {
@@ -577,47 +578,47 @@ namespace Bacon
                 Volume = (int)slider.Adjustment.Lower;
             }
         }
-        
+
         public int Volume {
             get { return (int)slider.Value; }
-            set { 
-                slider.Value = value; 
+            set {
+                slider.Value = value;
                 Update();
             }
         }
-        
+
         // FIXME: This is seriously LAME. The Gtk# binding does not support mutating
         // Gdk.Event* objects. All the properties are marked read only. Support for
         // these objects is simply incomplete.
         // http://bugzilla.ximian.com/show_bug.cgi?id=80685
-        
+
         private void UpdateEventButton(Gdk.EventButton evnt, Gdk.Window window, Gdk.EventType type)
         {
             Marshal.WriteInt32(evnt.Handle, 0, (int)type);
             UpdateEventButtonWindow(evnt, window);
         }
-        
+
         private void UpdateEventButton(Gdk.EventButton evnt, Gdk.Window window, double x, double y)
         {
             int x_offset = IntPtr.Size * 2 + 8;
-       
-            UpdateEventButtonWindow(evnt, window);                    
+
+            UpdateEventButtonWindow(evnt, window);
             MarshalWriteDouble(evnt.Handle, x_offset, x);
             MarshalWriteDouble(evnt.Handle, x_offset + 8, y);
         }
-    
+
         private void UpdateEventButtonWindow(Gdk.EventButton evnt, Gdk.Window window)
         {
             // FIXME: GLib.Object.Ref is obsolete because it's low level and shouldn't
             // be exposed, but it was in 1.x, and it's not going to go away, so this is OK.
-            
+
             #pragma warning disable 0612
             window.Ref();
             #pragma warning restore 0612
-            
+
             Marshal.WriteIntPtr(evnt.Handle, IntPtr.Size, window.Handle);
         }
-    
+
         private void MarshalWriteDouble(IntPtr ptr, int offset, double value)
         {
             byte [] bytes = BitConverter.GetBytes(value);
@@ -630,30 +631,30 @@ namespace Bacon
         {
             Console.Error.WriteLine("* WARNING *: Provide a DLL Map for libgobject-2.0-0.dll");
         }
-            
+
         private class VolumeScale : VScale
         {
             private VolumeButton button;
-            
+
             public VolumeScale(VolumeButton button, double min, double max, double step)
                 : base(new Adjustment(min, min, max, step, 10 * step, 0))
             {
                 this.button = button;
             }
-            
+
             protected override void OnValueChanged()
             {
                 base.OnValueChanged();
                 button.Update();
                 button.OnVolumeChanged();
             }
-            
+
             protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
             {
                 Gtk.Grab.Remove(button.dock);
                 return base.OnButtonPressEvent(evnt);
             }
-            
+
             protected override bool OnButtonReleaseEvent(Gdk.EventButton evnt)
             {
                 if(button.timeout) {
@@ -661,17 +662,17 @@ namespace Bacon
                         button.ReleaseGrab(evnt);
                         return base.OnButtonReleaseEvent(evnt);
                     }
-                    
+
                     button.timeout = false;
                 }
-            
+
                 bool result = base.OnButtonReleaseEvent(evnt);
-                
+
                 Gtk.Grab.Add(button.dock);
-                
+
                 return result;
             }
-            
+
             protected override bool OnKeyReleaseEvent(Gdk.EventKey evnt)
             {
                 switch(evnt.Key) {
@@ -681,18 +682,18 @@ namespace Bacon
                         button.ReleaseGrab(evnt);
                         break;
                 }
-            
+
                 return base.OnKeyReleaseEvent(evnt);
             }
-            
+
             // FIXME: This is also seriously LAME. The MinSliderSize property is "protected"
-            // according to gtkrange.h, and thus should be exposed and accessible through 
+            // according to gtkrange.h, and thus should be exposed and accessible through
             // this sub-class, but GAPI does not bind protected structure fields. LAME LAME.
             // http://bugzilla.ximian.com/show_bug.cgi?id=80684
-            
+
             [DllImport("libgobject-2.0-0.dll")]
             private static extern void g_type_query(IntPtr type, IntPtr query);
-            
+
             // In case there's no map provided by the assembly .config file
             [DllImport("libgobject-2.0-0.dll", EntryPoint="g_type_query")]
             private static extern void g_type_query_fallback(IntPtr type, IntPtr query);
@@ -700,20 +701,20 @@ namespace Bacon
             private int min_slider_size_offset = -1;
 
             public int MinSliderSize {
-                get { 
+                get {
                     if(min_slider_size_offset < 0) {
                         IntPtr query = Marshal.AllocHGlobal(5 * IntPtr.Size);
-                        
+
                         try {
                             g_type_query(Gtk.Widget.GType.Val, query);
                         } catch(DllNotFoundException) {
                             button.WarnGObjectMap();
                             g_type_query_fallback(Gtk.Widget.GType.Val, query);
                         }
-                        
-                        min_slider_size_offset = (int)Marshal.ReadIntPtr(query, 2 * IntPtr.Size + 4); 
+
+                        min_slider_size_offset = (int)Marshal.ReadIntPtr(query, 2 * IntPtr.Size + 4);
                         min_slider_size_offset += IntPtr.Size + 8;
-                            
+
                         Marshal.FreeHGlobal(query);
                     }
 
diff --git a/src/Core/Banshee.Widgets/Makefile.in b/src/Core/Banshee.Widgets/Makefile.in
index 400559f..db95a7a 100644
--- a/src/Core/Banshee.Widgets/Makefile.in
+++ b/src/Core/Banshee.Widgets/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -388,6 +397,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -491,11 +501,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -513,6 +524,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -542,6 +554,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -562,14 +575,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Banshee.Widgets/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Banshee.Widgets/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Banshee.Widgets/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Banshee.Widgets/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -587,25 +600,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -635,13 +664,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -673,6 +706,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -693,6 +727,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -701,18 +737,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -773,7 +819,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -790,6 +836,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Core/Makefile.in b/src/Core/Makefile.in
index dac769f..8f9c0df 100644
--- a/src/Core/Makefile.in
+++ b/src/Core/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -361,14 +378,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Core/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Core/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Core/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -386,6 +403,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -417,7 +435,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -451,16 +469,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -468,14 +486,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -487,7 +505,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -496,29 +514,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -539,29 +562,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -591,6 +629,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -610,6 +649,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -618,18 +659,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -650,8 +701,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -672,6 +723,7 @@ run:
 	@pushd $(top_builddir); \
 	make run; \
 	popd;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs
index 53ad203..72dcb71 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/DatabaseRebuilder.cs
@@ -49,7 +49,7 @@ namespace Banshee.Dap.Ipod
             public string Path;
             public TagLib.File File;
         }
-        
+
         private class FileContainerComparer : IComparer<FileContainer>
         {
             public int Compare (FileContainer a, FileContainer b)
@@ -58,25 +58,25 @@ namespace Banshee.Dap.Ipod
                 if (artist != 0) {
                     return artist;
                 }
-                
+
                 int album = String.Compare (a.File.Tag.Album, b.File.Tag.Album);
                 if (album != 0) {
                     return album;
                 }
-                
+
                 int at = (int)a.File.Tag.Track;
                 int bt = (int)b.File.Tag.Track;
-                
+
                 if (at == bt) {
                     return 0;
                 } else if (at < bt) {
                     return -1;
                 }
-                
+
                 return 1;
             }
         }
-    
+
         private IpodSource source;
         private UserJob user_job;
         private Queue<FileInfo> song_queue = new Queue<FileInfo>();
@@ -88,7 +88,7 @@ namespace Banshee.Dap.Ipod
         public DatabaseRebuilder (IpodSource source)
         {
             this.source = source;
-            
+
             user_job = new UserJob (Catalog.GetString ("Rebuilding Database"));
             user_job.PriorityHints = PriorityHints.SpeedSensitive | PriorityHints.DataLossIfStopped;
             user_job.SetResources (Resource.Disk, Resource.Cpu);
@@ -97,78 +97,78 @@ namespace Banshee.Dap.Ipod
             user_job.IconNames = source._GetIconNames ();
             user_job.CanCancel = true;
             user_job.Register ();
-            
+
             ThreadPool.QueueUserWorkItem (RebuildDatabase);
         }
-        
+
         private void RebuildDatabase (object state)
         {
             string music_path = Paths.Combine (source.IpodDevice.ControlPath, "Music");
-            
+
             Directory.CreateDirectory (source.IpodDevice.ControlPath);
             Directory.CreateDirectory (music_path);
-        
+
             DirectoryInfo music_dir = new DirectoryInfo (music_path);
-                
+
             foreach (DirectoryInfo directory in music_dir.GetDirectories ()) {
                 ScanMusicDirectory (directory);
             }
-            
+
             ProcessTrackQueue ();
         }
-        
+
         private void ScanMusicDirectory (DirectoryInfo directory)
         {
             foreach (FileInfo file in directory.GetFiles ()) {
                 song_queue.Enqueue (file);
             }
         }
-        
+
         private void ProcessTrackQueue ()
         {
             discovery_count = song_queue.Count;
-            
+
             user_job.Status = Catalog.GetString ("Processing Tracks...");
-            
+
             while (song_queue.Count > 0) {
                 user_job.Progress = (double)(discovery_count - song_queue.Count) / (double)discovery_count;
-                
+
                 try {
                     ProcessTrack (song_queue.Dequeue ());
                 } catch {
                 }
-                
+
                 if (user_job.IsCancelRequested) {
                     break;
                 }
             }
-            
+
             user_job.Progress = 0.0;
             user_job.Status = Catalog.GetString ("Ordering Tracks...");
-            
+
             files.Sort (new FileContainerComparer ());
-            
+
             foreach (FileContainer container in files) {
                 try {
                     ProcessTrack (container);
                 } catch {
                 }
-                
+
                 if (user_job.IsCancelRequested) {
                     break;
                 }
             }
-            
+
             if (!user_job.IsCancelRequested) {
                 SaveDatabase ();
             }
-            
+
             user_job.Finish ();
             user_job = null;
-            
+
             OnFinished ();
         }
-        
+
         private void ProcessTrack (FileInfo file)
         {
             TagLib.File af = Banshee.IO.DemuxVfs.OpenFile (file.FullName);
@@ -177,7 +177,7 @@ namespace Banshee.Dap.Ipod
             container.Path = file.FullName;
             files.Add (container);
         }
-        
+
         private void ProcessTrack (FileContainer container)
         {
             TagLib.File af = container.File;
@@ -198,26 +198,26 @@ namespace Banshee.Dap.Ipod
             if ((af.Properties.MediaTypes & TagLib.MediaTypes.Video) != 0) {
                 song.Type = MediaType.Video;
             }
-            
+
             ResolveCoverArt (song);
         }
-        
+
         private void ResolveCoverArt (Track track)
         {
             string aaid = CoverArtSpec.CreateArtistAlbumId (track.Artist, track.Album);
             string path = CoverArtSpec.GetPath (aaid);
-            
+
             if (File.Exists (path)) {
                 IpodTrackInfo.SetIpodCoverArt (source.IpodDevice, track, path);
             }
         }
-        
+
         private void SaveDatabase ()
         {
             user_job.CanCancel = false;
             user_job.Status = Catalog.GetString ("Saving new database...");
             user_job.Progress = 0.0;
-            
+
             try {
                 source.IpodDevice.Name = source.Name;
                 source.IpodDevice.TrackDatabase.Save ();
@@ -230,7 +230,7 @@ namespace Banshee.Dap.Ipod
                 Log.Error (Catalog.GetString ("Error rebuilding iPod database"), e.Message);
             }
         }
-        
+
         protected virtual void OnFinished ()
         {
             ThreadAssist.ProxyToMain (delegate {
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
index 797c053..4ccdafb 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
@@ -54,28 +54,28 @@ namespace Banshee.Dap.Ipod
         internal PodSleuthDevice IpodDevice {
             get { return ipod_device; }
         }
-        
+
         private Dictionary<int, IpodTrackInfo> tracks_map = new Dictionary<int, IpodTrackInfo> (); // FIXME: EPIC FAIL
         private bool database_loaded;
-        
+
         private string name_path;
         internal string NamePath {
             get { return name_path; }
         }
-        
+
         private bool database_supported;
         internal bool DatabaseSupported {
             get { return database_supported; }
         }
-        
+
         private UnsupportedDatabaseView unsupported_view;
-        
+
 #region Device Setup/Dispose
-        
+
         public override void DeviceInitialize (IDevice device)
         {
             base.DeviceInitialize (device);
-            
+
             ipod_device = device as PodSleuthDevice;
             if (ipod_device == null) {
                 throw new InvalidDeviceException ();
@@ -88,7 +88,7 @@ namespace Banshee.Dap.Ipod
 
             // TODO disable this later, but right now it won't disable it in Sync, so might as well
             // leave it enabled
-            //SupportsPodcasts = ipod_device.ModelInfo.HasCapability ("podcast");
+            SupportsPodcasts = ipod_device.ModelInfo.HasCapability ("podcast");
             SupportsVideo = ipod_device.ModelInfo.DeviceClass == "video" ||
                             ipod_device.ModelInfo.DeviceClass == "classic" ||
                             (ipod_device.ModelInfo.DeviceClass == "nano" && ipod_device.ModelInfo.Generation >= 3);
@@ -129,10 +129,10 @@ namespace Banshee.Dap.Ipod
             if (ipod_device.CanEject) {
                 ipod_device.Eject ();
             }
-            
+
             Dispose ();
         }
-        
+
         protected override bool CanHandleDeviceCommand (DeviceCommand command)
         {
             try {
@@ -142,11 +142,11 @@ namespace Banshee.Dap.Ipod
                 return false;
             }
         }
-        
+
         protected override IDeviceMediaCapabilities MediaCapabilities {
             get { return ipod_device.Parent.MediaCapabilities ?? base.MediaCapabilities; }
         }
-        
+
 #endregion
 
 #region Database Loading
@@ -162,9 +162,9 @@ namespace Banshee.Dap.Ipod
         private void LoadIpod ()
         {
             database_supported = false;
-            
+
             try {
-                if (File.Exists (ipod_device.TrackDatabasePath)) { 
+                if (File.Exists (ipod_device.TrackDatabasePath)) {
                     ipod_device.LoadTrackDatabase (false);
                 } else {
                     int count = CountMusicFiles ();
@@ -178,7 +178,7 @@ namespace Banshee.Dap.Ipod
             } catch (DatabaseReadException e) {
                 Log.Exception ("Could not read iPod database", e);
                 ipod_device.LoadTrackDatabase (true);
-                
+
                 ThreadAssist.ProxyToMain (delegate {
                     DestroyUnsupportedView ();
                     unsupported_view = new UnsupportedDatabaseView (this);
@@ -188,39 +188,39 @@ namespace Banshee.Dap.Ipod
             } catch (Exception e) {
                 Log.Exception (e);
             }
-            
+
             database_loaded = true;
 
             Name = GetDeviceName ();
         }
-        
+
         private int CountMusicFiles ()
         {
             try {
                 int file_count = 0;
-                
+
                 DirectoryInfo m_dir = new DirectoryInfo (Path.Combine (ipod_device.ControlPath, "Music"));
                 foreach (DirectoryInfo f_dir in m_dir.GetDirectories ()) {
                     file_count += f_dir.GetFiles().Length;
                 }
-                
+
                 return file_count;
             } catch {
                 return 0;
             }
         }
-        
+
         private void LoadFromDevice (bool refresh)
         {
             // bool previous_database_supported = database_supported;
-            
+
             if (refresh) {
                 ipod_device.TrackDatabase.Reload ();
             }
-            
+
             tracks_map.Clear ();
 
-            if (database_supported || (ipod_device.HasTrackDatabase && 
+            if (database_supported || (ipod_device.HasTrackDatabase &&
                 ipod_device.ModelInfo.DeviceClass == "shuffle")) {
                 foreach (Track ipod_track in ipod_device.TrackDatabase.Tracks) {
                     try {
@@ -238,7 +238,6 @@ namespace Banshee.Dap.Ipod
                         SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?");
                 foreach (IPod.Playlist playlist in ipod_device.TrackDatabase.Playlists) {
                     if (playlist.IsOnTheGo) { // || playlist.IsPodcast) {
-                        Console.WriteLine ("have playlist {0} with {1} items but ignoring b/c otg or podcast", playlist.Name, playlist.Tracks.Count);
                         continue;
                     }
                     PlaylistSource pl_src = new PlaylistSource (playlist.Name, this);
@@ -252,22 +251,22 @@ namespace Banshee.Dap.Ipod
                     AddChildSource (pl_src);
                 }
             }
-            
+
             /*else {
                 BuildDatabaseUnsupportedWidget ();
             }*/
-            
+
             /*if(previous_database_supported != database_supported) {
                 OnPropertiesChanged();
             }*/
         }
-        
+
         private void OnRebuildDatabaseRefresh (object o, EventArgs args)
         {
             ServiceManager.SourceManager.SetActiveSource (MusicGroupSource);
             base.LoadDeviceContents ();
         }
-        
+
         private void DestroyUnsupportedView ()
         {
             if (unsupported_view != null) {
@@ -276,7 +275,7 @@ namespace Banshee.Dap.Ipod
                 unsupported_view = null;
             }
         }
-        
+
 #endregion
 
 #region Source Cosmetics
@@ -291,23 +290,23 @@ namespace Banshee.Dap.Ipod
             string [] names = new string[4];
             string prefix = "multimedia-player-";
             string shell_color = ipod_device.ModelInfo.ShellColor;
-            
+
             names[0] = ipod_device.ModelInfo.IconName;
             names[2] = "ipod-standard-color";
             names[3] = "multimedia-player";
-            
+
             switch (ipod_device.ModelInfo.DeviceClass) {
-                case "grayscale": 
+                case "grayscale":
                     names[1] = "ipod-standard-monochrome";
                     break;
-                case "color": 
-                    names[1] = "ipod-standard-color"; 
+                case "color":
+                    names[1] = "ipod-standard-color";
                     break;
-                case "mini": 
+                case "mini":
                     names[1] = String.Format ("ipod-mini-{0}", shell_color);
                     names[2] = "ipod-mini-silver";
                     break;
-                case "shuffle": 
+                case "shuffle":
                     names[1] = String.Format ("ipod-shuffle-{0}", shell_color);
                     names[2] = "ipod-shuffle";
                     break;
@@ -326,25 +325,25 @@ namespace Banshee.Dap.Ipod
                 default:
                     break;
             }
-            
+
             names[1] = names[1] ?? names[2];
             names[1] = prefix + names[1];
             names[2] = prefix + names[2];
-            
+
             return names;
         }
-        
+
         public override void Rename (string name)
         {
             if (!CanRename) {
                 return;
             }
-        
+
             try {
                 if (name_path != null) {
                     Directory.CreateDirectory (Path.GetDirectoryName (name_path));
-                
-                    using (StreamWriter writer = new StreamWriter (File.Open (name_path, FileMode.Create), 
+
+                    using (StreamWriter writer = new StreamWriter (File.Open (name_path, FileMode.Create),
                         System.Text.Encoding.Unicode)) {
                         writer.Write (name);
                     }
@@ -352,11 +351,11 @@ namespace Banshee.Dap.Ipod
             } catch (Exception e) {
                 Log.Exception (e);
             }
-            
+
             ipod_device.Name = name;
             base.Rename (name);
         }
-        
+
         private string GetDeviceName ()
         {
             string name = null;
@@ -365,11 +364,11 @@ namespace Banshee.Dap.Ipod
                     name = reader.ReadLine ();
                 }
             }
-            
+
             if (String.IsNullOrEmpty (name) && database_loaded && database_supported) {
                 name = ipod_device.Name;
             }
-                
+
             if (!String.IsNullOrEmpty (name)) {
                 return name;
             } else if (ipod_device.PropertyExists ("volume.label")) {
@@ -379,22 +378,22 @@ namespace Banshee.Dap.Ipod
             } else {
                 name = ((IDevice)ipod_device).Name ?? "iPod";
             }
-            
+
             return name;
         }
-        
+
         public override bool CanRename {
             get { return !(IsAdding || IsDeleting || IsReadOnly); }
         }
-        
+
         public override long BytesUsed {
             get { return (long)ipod_device.VolumeInfo.SpaceUsed; }
         }
-        
+
         public override long BytesCapacity {
             get { return (long)ipod_device.VolumeInfo.Size; }
         }
-        
+
 #endregion
 
 #region Syncing
@@ -414,10 +413,10 @@ namespace Banshee.Dap.Ipod
             }
             base.OnTracksDeleted ();
         }
-        
+
         private Queue<IpodTrackInfo> tracks_to_add = new Queue<IpodTrackInfo> ();
         private Queue<IpodTrackInfo> tracks_to_remove = new Queue<IpodTrackInfo> ();
-        
+
         private uint sync_timeout_id = 0;
         private object sync_timeout_mutex = new object ();
         private object sync_mutex = new object ();
@@ -428,7 +427,7 @@ namespace Banshee.Dap.Ipod
         public override bool IsReadOnly {
             get { return ipod_device.IsReadOnly || !database_supported; }
         }
-        
+
         public override void Import ()
         {
             Banshee.ServiceStack.ServiceManager.Get<LibraryImportManager> ().Enqueue (Path.Combine (ipod_device.ControlPath, "Music"));
@@ -445,28 +444,28 @@ namespace Banshee.Dap.Ipod
                 if (!tracks_map.ContainsKey (track.TrackId)) {
                     return true;
                 }
-                
+
                 IpodTrackInfo ipod_track = tracks_map[track.TrackId];
                 if (ipod_track != null) {
                     tracks_to_remove.Enqueue (ipod_track);
                 }
-                
+
                 return true;
             }
         }
-        
+
         protected override void AddTrackToDevice (DatabaseTrackInfo track, SafeUri fromUri)
         {
             lock (sync_mutex) {
                 if (track.PrimarySourceId == DbId) {
                     return;
                 }
-                
+
                 IpodTrackInfo ipod_track = new IpodTrackInfo (track);
                 ipod_track.Uri = fromUri;
                 ipod_track.PrimarySource = this;
                 ipod_track.Save (false);
-            
+
                 tracks_to_add.Enqueue (ipod_track);
             }
         }
@@ -485,11 +484,11 @@ namespace Banshee.Dap.Ipod
                 if (sync_timeout_id > 0) {
                     Application.IdleTimeoutRemove (sync_timeout_id);
                 }
-                
+
                 sync_timeout_id = Application.RunTimeout (150, PerformSync);
             }
         }
-        
+
         private void CancelSyncThread ()
         {
             Thread thread = sync_thread;
@@ -504,30 +503,30 @@ namespace Banshee.Dap.Ipod
                 thread.Join ();
             }
         }
-        
+
         private bool PerformSync ()
         {
             lock (sync_mutex) {
                 if (sync_thread == null) {
                     sync_thread_wait = new AutoResetEvent (false);
-                
+
                     sync_thread = new Thread (new ThreadStart (PerformSyncThread));
                     sync_thread.Name = "iPod Sync Thread";
                     sync_thread.IsBackground = false;
                     sync_thread.Priority = ThreadPriority.Lowest;
                     sync_thread.Start ();
                 }
-                
+
                 sync_thread_wait.Set ();
-                
+
                 lock (sync_timeout_mutex) {
                     sync_timeout_id = 0;
                 }
-                
+
                 return false;
             }
         }
-        
+
         private void PerformSyncThread ()
         {
             try {
@@ -536,10 +535,10 @@ namespace Banshee.Dap.Ipod
                     if (sync_thread_dispose) {
                         break;
                     }
-                    
+
                     PerformSyncThreadCycle ();
                 }
-                
+
                 lock (sync_mutex) {
                     sync_thread_dispose = false;
                     sync_thread_wait.Close ();
@@ -550,7 +549,7 @@ namespace Banshee.Dap.Ipod
                 Log.Exception (e);
             }
         }
-        
+
         private void PerformSyncThreadCycle ()
         {
             while (tracks_to_add.Count > 0) {
@@ -558,7 +557,7 @@ namespace Banshee.Dap.Ipod
                 lock (sync_mutex) {
                     track = tracks_to_add.Dequeue ();
                 }
-                
+
                 try {
                     track.CommitToIpod (ipod_device);
                     tracks_map[track.TrackId] = track;
@@ -568,17 +567,17 @@ namespace Banshee.Dap.Ipod
             }
 
             // TODO sync updated metadata to changed tracks
-            
+
             while (tracks_to_remove.Count > 0) {
                 IpodTrackInfo track = null;
                 lock (sync_mutex) {
                     track = tracks_to_remove.Dequeue ();
                 }
-                
+
                 if (tracks_map.ContainsKey (track.TrackId)) {
                     tracks_map.Remove (track.TrackId);
                 }
-                
+
                 try {
                     if (track.IpodTrack != null) {
                         ipod_device.TrackDatabase.RemoveTrack (track.IpodTrack);
@@ -591,12 +590,12 @@ namespace Banshee.Dap.Ipod
             // Remove playlists on the device
             List<IPod.Playlist> device_playlists = new List<IPod.Playlist> (ipod_device.TrackDatabase.Playlists);
             foreach (IPod.Playlist playlist in device_playlists) {
-                if (!playlist.IsOnTheGo) { // && !playlist.IsPodcast) {
+                if (!playlist.IsOnTheGo) {
                     ipod_device.TrackDatabase.RemovePlaylist (playlist);
                 }
             }
             device_playlists.Clear ();
-            
+
             if (SupportsPlaylists) {
                 // Add playlists from Banshee to the device
                 foreach (Source child in Children) {
@@ -612,17 +611,7 @@ namespace Banshee.Dap.Ipod
                     }
                 }
             }
-    
-            // Sync podcast playlist
-            /*IPod.Playlist podcast_playlist = GetPodcastPlaylist ();
-            podcast_playlist.Clear ();
-            foreach (int track_id in ServiceManager.DbConnection.QueryEnumerable<int> (
-                "SELECT CoreTracks.TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND (Attributes & ?) != 0",
-                DbId, (int)Banshee.Collection.TrackMediaAttributes.Podcast))
-            {
-                podcast_playlist.AddTrack (tracks_map[track_id].IpodTrack);
-            }*/
-            
+
             try {
                 ipod_device.TrackDatabase.SaveStarted += OnIpodDatabaseSaveStarted;
                 ipod_device.TrackDatabase.SaveEnded += OnIpodDatabaseSaveEnded;
@@ -639,35 +628,22 @@ namespace Banshee.Dap.Ipod
             }
         }
 
-        /*private IPod.Playlist GetPodcastPlaylist ()
-        {
-            foreach (IPod.Playlist playlist in ipod_device.TrackDatabase.Playlists) {
-                if (playlist.IsPodcast) {
-                    return playlist;
-                }
-            }
-
-            IPod.Playlist podcast_playlist= ipod_device.TrackDatabase.CreatePlaylist (Catalog.GetString ("Podcasts"));
-            podcast_playlist.IsPodcast = true;
-            return podcast_playlist;
-        }*/
-        
         private UserJob sync_user_job;
-        
+
         private void OnIpodDatabaseSaveStarted (object o, EventArgs args)
         {
             DisposeSyncUserJob ();
-            
-            sync_user_job = new UserJob (Catalog.GetString ("Syncing iPod"), 
+
+            sync_user_job = new UserJob (Catalog.GetString ("Syncing iPod"),
                 Catalog.GetString ("Preparing to synchronize..."), GetIconNames ());
             sync_user_job.Register ();
         }
-        
+
         private void OnIpodDatabaseSaveEnded (object o, EventArgs args)
         {
             DisposeSyncUserJob ();
         }
-        
+
         private void DisposeSyncUserJob ()
         {
             if (sync_user_job != null) {
@@ -675,14 +651,14 @@ namespace Banshee.Dap.Ipod
                 sync_user_job = null;
             }
         }
-        
+
         private void OnIpodDatabaseSaveProgressChanged (object o, IPod.TrackSaveProgressArgs args)
         {
             double progress = args.CurrentTrack == null ? 0.0 : args.TotalProgress;
-            string message = args.CurrentTrack == null 
+            string message = args.CurrentTrack == null
                     ? Catalog.GetString ("Updating...")
                     : String.Format ("{0} - {1}", args.CurrentTrack.Artist, args.CurrentTrack.Title);
-             
+
              if (progress >= 0.99) {
                  sync_user_job.Status = Catalog.GetString ("Flushing to disk...");
                  sync_user_job.Progress = 0;
@@ -691,7 +667,7 @@ namespace Banshee.Dap.Ipod
                  sync_user_job.Progress = progress;
              }
         }
-        
+
         public bool SyncNeeded {
             get {
                 lock (sync_mutex) {
@@ -701,6 +677,6 @@ namespace Banshee.Dap.Ipod
         }
 
 #endregion
-        
+
     }
 }
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
index e04ba5f..289e6cc 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
@@ -36,26 +36,29 @@ using Banshee.Collection.Database;
 using Hyena;
 
 namespace Banshee.Dap.Ipod
-{   
+{
     public class IpodTrackInfo : DatabaseTrackInfo
     {
         private IPod.Track track;
         internal IPod.Track IpodTrack {
             get { return track; }
         }
-        
+
         private int ipod_id;
         internal int IpodId {
             get { return ipod_id; }
         }
-        
+
+        // Used for podcasts only
+        private string description;
+
         public IpodTrackInfo (IPod.Track track) : base ()
         {
             this.track = track;
             LoadFromIpodTrack ();
             CanSaveToDatabase = true;
         }
-        
+
         public IpodTrackInfo (TrackInfo track)
         {
             if (track is IpodTrackInfo) {
@@ -90,22 +93,28 @@ namespace Banshee.Dap.Ipod
                 TrackTitle = track.TrackTitle;
                 Year = track.Year;
                 MediaAttributes = track.MediaAttributes;
+
+                var podcast_info = track.ExternalObject as IPodcastInfo;
+                if (podcast_info != null) {
+                    description = podcast_info.Description;
+                    ReleaseDate = podcast_info.ReleaseDate;
+                }
             }
-            
+
             CanSaveToDatabase = true;
         }
-        
+
         private void LoadFromIpodTrack ()
         {
             try {
                 Uri = new SafeUri (track.Uri.LocalPath);
-            } catch { 
+            } catch {
                 Uri = null;
             }
 
             ExternalId = track.Id;
             ipod_id = (int)track.Id;
-            
+
             AlbumArtist = track.AlbumArtist;
             AlbumTitle = String.IsNullOrEmpty (track.Album) ? null : track.Album;
             ArtistName = String.IsNullOrEmpty (track.Artist) ? null : track.Artist;
@@ -126,25 +135,26 @@ namespace Banshee.Dap.Ipod
             TrackCount = track.TotalTracks;
             TrackNumber = track.TrackNumber;
             TrackTitle = String.IsNullOrEmpty (track.Title) ? null : track.Title;
-            //ReleaseDate = track.DateReleased;
             Year = track.Year;
-            
+            description = track.Description;
+            ReleaseDate = track.DateReleased;
+
             switch (track.Rating) {
                 case IPod.TrackRating.One:   rating = 1; break;
                 case IPod.TrackRating.Two:   rating = 2; break;
                 case IPod.TrackRating.Three: rating = 3; break;
                 case IPod.TrackRating.Four:  rating = 4; break;
                 case IPod.TrackRating.Five:  rating = 5; break;
-                case IPod.TrackRating.Zero: 
+                case IPod.TrackRating.Zero:
                 default:                     rating = 0; break;
             }
-            
+
             if (track.IsProtected) {
                 PlaybackError = StreamPlaybackError.Drm;
             }
-            
+
             MediaAttributes = TrackMediaAttributes.AudioStream;
-            
+
             switch (track.Type) {
                 case IPod.MediaType.Audio:
                     MediaAttributes |= TrackMediaAttributes.Music;
@@ -174,7 +184,7 @@ namespace Banshee.Dap.Ipod
                     break;
             }
         }
-        
+
         public void CommitToIpod (IPod.Device device)
         {
             track = track ?? device.TrackDatabase.CreateTrack ();
@@ -186,7 +196,7 @@ namespace Banshee.Dap.Ipod
                 Log.Exception ("Failed to create System.Uri for iPod track", e);
                 device.TrackDatabase.RemoveTrack (track);
             }
-            
+
             track.AlbumArtist = AlbumArtist;
             track.BitRate = BitRate;
             track.BPM = (short)Bpm;
@@ -204,13 +214,13 @@ namespace Banshee.Dap.Ipod
             track.TotalTracks = TrackCount;
             track.TrackNumber = TrackNumber;
             track.Year = Year;
-            //track.DateReleased = ReleaseDate;
-            
+            track.DateReleased = ReleaseDate;
+
             track.Album = AlbumTitle;
             track.Artist = ArtistName;
             track.Title = TrackTitle;
             track.Genre = Genre;
-            
+
             switch (Rating) {
                 case 1: track.Rating = IPod.TrackRating.Zero; break;
                 case 2: track.Rating = IPod.TrackRating.Two; break;
@@ -221,10 +231,10 @@ namespace Banshee.Dap.Ipod
             }
 
             if (HasAttribute (TrackMediaAttributes.Podcast)) {
-                //track.Description = ..
-                //track.Category = ..
-                //track.RememberPosition = true;
-                //track.NotPlayedMark = track.PlayCount == 0;
+                track.DateReleased = ReleaseDate;
+                track.Description = description;
+                track.RememberPosition = true;
+                track.NotPlayedMark = track.PlayCount == 0;
             }
 
             if (HasAttribute (TrackMediaAttributes.VideoStream)) {
@@ -250,13 +260,13 @@ namespace Banshee.Dap.Ipod
                     track.Type = IPod.MediaType.Audio;
                 }
             }
-            
+
             if (CoverArtSpec.CoverExists (ArtworkId)) {
                 SetIpodCoverArt (device, track, CoverArtSpec.GetPath (ArtworkId));
             }
         }
-        
-        // FIXME: No reason for this to use GdkPixbuf - the file is on disk already in 
+
+        // FIXME: No reason for this to use GdkPixbuf - the file is on disk already in
         // the artwork cache as a JPEG, so just shove the bytes from disk into the track
         public static void SetIpodCoverArt (IPod.Device device, IPod.Track track, string path)
         {
@@ -268,11 +278,11 @@ namespace Banshee.Dap.Ipod
                         if (pixbuf == null) {
                             pixbuf = new Gdk.Pixbuf (path);
                         }
-                        
+
                         track.SetCoverArt (format, IPod.ArtworkHelpers.ToBytes (format, pixbuf));
                     }
                 }
-                
+
                 if (pixbuf != null) {
                     pixbuf.Dispose ();
                 }
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDevice.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDevice.cs
index 3e85582..26b974c 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDevice.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDevice.cs
@@ -51,72 +51,72 @@ namespace Banshee.Dap.Ipod
                 Year = volume.GetPropertyInteger (PodsleuthPrefix + "production.year");
             }
         }
-        
+
         private class _VolumeInfo : IPod.VolumeInfo
         {
             private IVolume volume;
-            
+
             public _VolumeInfo (IVolume volume)
             {
                 this.volume = volume;
-                
+
                 MountPoint = volume.GetPropertyString ("volume.mount_point");
                 Label = volume.GetPropertyString ("volume.label");
                 IsMountedReadOnly = volume.GetPropertyBoolean ("volume.is_mounted_read_only");
                 Uuid = volume.GetPropertyString ("volume.uuid");
             }
-            
+
             public override ulong Size {
                 get { return volume.Capacity; }
             }
-        
+
             public override ulong SpaceUsed {
                 get { return volume.Capacity - (ulong)volume.Available; }
             }
         }
-        
+
         private class _ModelInfo : IPod.ModelInfo
         {
             public _ModelInfo (IVolume volume)
             {
                 AdvertisedCapacity = GetVolumeSizeString (volume);
-                
+
                 IsUnknown = true;
                 if (volume.PropertyExists (PodsleuthPrefix + "is_unknown")) {
                     IsUnknown = volume.GetPropertyBoolean (PodsleuthPrefix + "is_unknown");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "images.album_art_supported")) {
                     AlbumArtSupported = volume.GetPropertyBoolean (PodsleuthPrefix + "images.album_art_supported");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "images.photos_supported")) {
                     PhotosSupported = volume.GetPropertyBoolean (PodsleuthPrefix + "images.photos_supported");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "model.device_class")) {
                     DeviceClass = volume.GetPropertyString (PodsleuthPrefix + "model.device_class");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "model.generation")) {
                     Generation = volume.GetPropertyDouble (PodsleuthPrefix + "model.generation");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "model.shell_color")) {
                     ShellColor = volume.GetPropertyString (PodsleuthPrefix + "model.shell_color");
                 }
-                
+
                 if (volume.PropertyExists ("info.icon_name")) {
                     IconName = volume.GetPropertyString ("info.icon_name");
                 }
-                
+
                 if (volume.PropertyExists (PodsleuthPrefix + "capabilities")) {
                     foreach (string capability in volume.GetPropertyStringList (PodsleuthPrefix + "capabilities")) {
                         AddCapability (capability);
                     }
                 }
             }
-            
+
             private static string GetVolumeSizeString (IVolume volume)
             {
                 string format = "GiB";
@@ -130,42 +130,42 @@ namespace Banshee.Dap.Ipod
                 return String.Format ("{0} {1}", (int)Math.Round (value), format);
             }
         }
-        
+
         private IVolume volume;
-        
+
         private IPod.ProductionInfo production_info;
         private IPod.VolumeInfo volume_info;
         private IPod.ModelInfo model_info;
-        
+
         public override IPod.ProductionInfo ProductionInfo {
             get { return production_info; }
         }
-        
+
         public override IPod.VolumeInfo VolumeInfo {
             get { return volume_info; }
         }
-        
+
         public override IPod.ModelInfo ModelInfo {
             get { return model_info; }
         }
 
-        internal PodSleuthDevice (IVolume volume) 
+        internal PodSleuthDevice (IVolume volume)
         {
             this.volume = volume;
 
             volume_info = new _VolumeInfo (volume);
             production_info = new _ProductionInfo (volume);
             model_info = new _ModelInfo (volume);
-            
+
             if (volume.PropertyExists (PodsleuthPrefix + "control_path")) {
                 string relative_control = volume.GetPropertyString (PodsleuthPrefix + "control_path");
                 if (relative_control[0] == Path.DirectorySeparatorChar) {
                     relative_control = relative_control.Substring (1);
                 }
-                
+
                 ControlPath = Path.Combine(VolumeInfo.MountPoint, relative_control);
             }
-            
+
             ArtworkFormats = new ReadOnlyCollection<ArtworkFormat> (LoadArtworkFormats ());
 
             if (volume.PropertyExists (PodsleuthPrefix + "firmware_version")) {
@@ -175,27 +175,27 @@ namespace Banshee.Dap.Ipod
             if (volume.PropertyExists (PodsleuthPrefix + "firewire_id")) {
                 FirewireId = volume.GetPropertyString (PodsleuthPrefix + "firewire_id");
             }
-            
+
             RescanDisk ();
         }
-        
+
         public override void Eject ()
         {
             volume.Eject ();
         }
-        
-        public override void RescanDisk () 
+
+        public override void RescanDisk ()
         {
         }
 
-        private List<ArtworkFormat> LoadArtworkFormats () 
+        private List<ArtworkFormat> LoadArtworkFormats ()
         {
             List<ArtworkFormat> formats = new List<ArtworkFormat> ();
 
             if (!ModelInfo.AlbumArtSupported) {
                 return formats;
             }
-            
+
             string [] formatList = volume.GetPropertyStringList (PodsleuthPrefix + "images.formats");
 
             foreach (string formatStr in formatList) {
@@ -210,13 +210,13 @@ namespace Banshee.Dap.Ipod
                 pformat = PixelFormat.Unknown;
 
                 string[] pairs = formatStr.Split(',');
-                
+
                 foreach (string pair in pairs) {
                     string[] splitPair = pair.Split('=');
                     if (splitPair.Length != 2) {
                         continue;
                     }
-                    
+
                     string value = splitPair[1];
                     switch (splitPair[0]) {
                         case "corr_id": correlationId = Int16.Parse (value); break;
@@ -261,7 +261,7 @@ namespace Banshee.Dap.Ipod
         {
             volume.Unmount ();
         }
-        
+
         public string Uuid {
             get { return volume.Uuid; }
         }
@@ -356,12 +356,12 @@ namespace Banshee.Dap.Ipod
         {
             return volume.GetPropertyStringList (key);
         }
-        
+
         public IUsbDevice ResolveRootUsbDevice ()
         {
             return volume.ResolveRootUsbDevice ();
         }
-        
+
 #endregion
 
     }
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDeviceProvider.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDeviceProvider.cs
index 5925fe9..42a0e3b 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDeviceProvider.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/PodSleuthDeviceProvider.cs
@@ -38,26 +38,26 @@ namespace Banshee.Dap.Ipod
         {
             IDiskDevice disk_device = device as IDiskDevice;
             IVolume volume = device as IVolume;
-            
+
             if (volume != null && CheckStorageCaps (volume.Parent) && CheckVolume (volume)) {
                 return AsPodSleuthDevice<T> (volume, device);
             } else if (disk_device == null || !CheckStorageCaps (device)) {
                 return device;
             }
-            
+
             foreach (IVolume child_volume in disk_device.Volumes) {
                 if (CheckVolume (child_volume)) {
                     return AsPodSleuthDevice<T> (child_volume, device);
                 }
             }
-            
+
             return device;
         }
-        
+
         public void Dispose ()
         {
         }
-        
+
         private T AsPodSleuthDevice<T> (IVolume volume, T original)
         {
             try {
@@ -67,12 +67,12 @@ namespace Banshee.Dap.Ipod
                 return original;
             }
         }
-        
+
         private bool CheckStorageCaps (IDevice device)
         {
             return device != null && device.MediaCapabilities != null && device.MediaCapabilities.IsType ("ipod");
         }
-        
+
         private bool CheckVolume (IVolume volume)
         {
             return volume.PropertyExists ("org.podsleuth.version");
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs
index e231ef2..cde763b 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/UnsupportedDatabaseView.cs
@@ -45,53 +45,53 @@ namespace Banshee.Dap.Ipod
         private MessagePane pane;
         private bool info_link_clicked = false;
         private IpodSource source;
-        
+
         public event EventHandler Refresh;
-        
+
         public UnsupportedDatabaseView (IpodSource source) : base (source)
         {
             this.source = source;
-            
+
             pane = new MessagePane();
             pane.HeaderIcon = IconThemeUtils.LoadIcon(48, "face-surprise", Stock.DialogError);
             pane.ArrowIcon = IconThemeUtils.LoadIcon(24, "go-next", Stock.GoForward);
-            pane.HeaderMarkup = String.Format("<big><b>{0}</b></big>", 
+            pane.HeaderMarkup = String.Format("<big><b>{0}</b></big>",
                 GLib.Markup.EscapeText(Catalog.GetString("Unable to read your iPod")));
-                
+
             AddPaneItems();
-            
+
             Add(pane);
             ShowAll ();
         }
-        
+
         private void AddPaneItems()
         {
             if(info_link_clicked) {
                 bool file_exists = System.IO.File.Exists (Paths.Combine (
                     source.IpodDevice.ControlPath, "iTunes", "iTunesDB"));
-                
+
                 if(file_exists) {
                     pane.Append(Catalog.GetString(
                         "You have used this iPod with a version of iTunes that saves a " +
                         "version of the song database for your iPod that is too new " +
                         "for Banshee to recognize.\n\n" +
-                        
+
                         "Banshee can rebuild your database, but some settings might be lost. " +
                         "Using Banshee and iTunes with the same iPod is not recommended."
                     ));
-                    
+
                     LinkLabel link = new LinkLabel();
                     link.Xalign = 0.0f;
                     link.Markup = String.Format("<u>{0}</u>", GLib.Markup.EscapeText(Catalog.GetString(
                         "Learn more about Banshee's iPod support")));
-                    
+
                     link.Clicked += delegate { Banshee.Web.Browser.Open ("http://banshee-project.org/IpodAndItunes"); };
-                    
+
                     link.Show();
                     pane.Append(link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true);
                 } else {
                     pane.Append(Catalog.GetString(
-                        "An iPod database could not be found on this device.\n\n" + 
+                        "An iPod database could not be found on this device.\n\n" +
                         "Banshee can build a new database for you."
                     ));
                 }
@@ -100,36 +100,36 @@ namespace Banshee.Dap.Ipod
                 link.Xalign = 0.0f;
                 link.Markup = String.Format("<u>{0}</u>", GLib.Markup.EscapeText(Catalog.GetString(
                     "What is the reason for this?")));
-                    
+
                 link.Clicked += delegate {
                     info_link_clicked = true;
                     pane.Clear();
                     AddPaneItems();
                 };
-                
+
                 link.Show();
                 pane.Append(link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true);
             }
-            
+
             if(source.IpodDevice.VolumeInfo.IsMountedReadOnly) {
-                pane.Append(Catalog.GetString("Your iPod is mounted read only. Banshee can not restore your iPod."), 
+                pane.Append(Catalog.GetString("Your iPod is mounted read only. Banshee can not restore your iPod."),
                     true, IconThemeUtils.LoadIcon(48, "dialog-error"));
                 return;
             }
-            
+
             LinkLabel rebuild_link = new LinkLabel();
             rebuild_link.Xalign = 0.0f;
             rebuild_link.Markup = String.Format("<u>{0}</u>", GLib.Markup.EscapeText(Catalog.GetString(
                 "Rebuild iPod Database...")));
-            rebuild_link.Clicked += OnRebuildDatabase; 
+            rebuild_link.Clicked += OnRebuildDatabase;
             rebuild_link.Show();
             pane.Append(rebuild_link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true);
         }
-        
+
         private void OnRebuildDatabase(object o, EventArgs args)
         {
             string title = Catalog.GetString("Confirm Rebuild iPod Database");
-            HigMessageDialog md = new HigMessageDialog(null, 
+            HigMessageDialog md = new HigMessageDialog(null,
                 DialogFlags.DestroyWithParent, MessageType.Question,
                 ButtonsType.Cancel,
                 title,
@@ -139,19 +139,19 @@ namespace Banshee.Dap.Ipod
                     "Are you sure you want to rebuild your iPod database?"));
             md.Title = title;
             md.AddButton(Catalog.GetString("Rebuild Database"), Gtk.ResponseType.Yes, true);
-            
+
             if(md.Run() != (int)ResponseType.Yes) {
                 md.Destroy();
                 return;
             }
-            
+
             md.Destroy();
-            
+
             pane.HeaderIcon = null;
             pane.HeaderMarkup = null;
 
             pane.Clear();
-            pane.Append(String.Format("<big><b>{0}</b></big>", 
+            pane.Append(String.Format("<big><b>{0}</b></big>",
                 GLib.Markup.EscapeText(Catalog.GetString("Rebuilding iPod Database..."))),
                 true, LargeIcon);
 
@@ -160,7 +160,7 @@ namespace Banshee.Dap.Ipod
                 OnRefresh ();
             };
         }
-        
+
         protected virtual void OnRefresh()
         {
             EventHandler handler = Refresh;
diff --git a/src/Dap/Banshee.Dap.Ipod/Makefile.in b/src/Dap/Banshee.Dap.Ipod/Makefile.in
index 463b6e4..786c8cd 100644
--- a/src/Dap/Banshee.Dap.Ipod/Makefile.in
+++ b/src/Dap/Banshee.Dap.Ipod/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -376,6 +385,7 @@ EXTRA_BUNDLE = $(IPODSHARP_ASSEMBLIES)
 @ENABLE_IPOD_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_IPOD_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_IPOD_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_IPOD_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_IPOD_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_IPOD_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_IPOD_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -479,11 +489,12 @@ EXTRA_BUNDLE = $(IPODSHARP_ASSEMBLIES)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_IPOD_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_IPOD_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_IPOD_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_IPOD_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_IPOD_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -501,6 +512,7 @@ EXTRA_BUNDLE = $(IPODSHARP_ASSEMBLIES)
 @ENABLE_IPOD_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_IPOD_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_IPOD_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_IPOD_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_IPOD_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -530,6 +542,7 @@ EXTRA_BUNDLE = $(IPODSHARP_ASSEMBLIES)
 @ENABLE_IPOD_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_IPOD_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_IPOD_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_IPOD_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_IPOD_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_IPOD_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_IPOD_TRUE at OUTPUT_FILES = \
@@ -550,14 +563,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Ipod/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Ipod/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Ipod/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Ipod/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -575,25 +588,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -623,13 +652,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -661,6 +694,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -685,6 +719,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -692,21 +728,30 @@ info-am:
 install-data-am: install-data-local install-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
-
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -728,7 +773,6 @@ ps-am:
 uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-
 .MAKE: install-am install-data-am install-strip uninstall-am
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
@@ -769,7 +813,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_IPOD_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_IPOD_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_IPOD_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_IPOD_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_IPOD_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_IPOD_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_IPOD_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_IPOD_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -796,6 +840,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_IPOD_TRUE@	for ASM in $(IPODSHARP_ASSEMBLIES); do \
 @ENABLE_IPOD_TRUE@		rm -f $(DESTDIR)$(moduledir)/`basename $$ASM`; \
 @ENABLE_IPOD_TRUE@	done;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Banshee.Dap.Karma/Banshee.Dap.Karma/KarmaSource.cs b/src/Dap/Banshee.Dap.Karma/Banshee.Dap.Karma/KarmaSource.cs
index cd9fcad..50819bc 100644
--- a/src/Dap/Banshee.Dap.Karma/Banshee.Dap.Karma/KarmaSource.cs
+++ b/src/Dap/Banshee.Dap.Karma/Banshee.Dap.Karma/KarmaSource.cs
@@ -120,7 +120,7 @@ namespace Banshee.Dap.Karma
                 device.Save();
                 track_map.Remove(track.TrackId);
             }
-            
+
             return true;
         }
 
diff --git a/src/Dap/Banshee.Dap.Karma/Makefile.in b/src/Dap/Banshee.Dap.Karma/Makefile.in
index 299c64e..b1551f4 100644
--- a/src/Dap/Banshee.Dap.Karma/Makefile.in
+++ b/src/Dap/Banshee.Dap.Karma/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -372,6 +381,7 @@ EXTRA_BUNDLE = $(KARMASHARP_ASSEMBLIES)
 @ENABLE_KARMA_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_KARMA_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_KARMA_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_KARMA_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_KARMA_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_KARMA_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_KARMA_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -475,11 +485,12 @@ EXTRA_BUNDLE = $(KARMASHARP_ASSEMBLIES)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_KARMA_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_KARMA_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_KARMA_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_KARMA_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_KARMA_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -497,6 +508,7 @@ EXTRA_BUNDLE = $(KARMASHARP_ASSEMBLIES)
 @ENABLE_KARMA_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_KARMA_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_KARMA_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_KARMA_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_KARMA_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -526,6 +538,7 @@ EXTRA_BUNDLE = $(KARMASHARP_ASSEMBLIES)
 @ENABLE_KARMA_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_KARMA_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_KARMA_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_KARMA_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_KARMA_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_KARMA_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_KARMA_TRUE at OUTPUT_FILES = \
@@ -546,14 +559,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Karma/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Karma/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Karma/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Karma/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -571,25 +584,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -619,13 +648,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -657,6 +690,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -681,6 +715,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -688,21 +724,30 @@ info-am:
 install-data-am: install-data-local install-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
-
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -724,7 +769,6 @@ ps-am:
 uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-
 .MAKE: install-am install-data-am install-strip uninstall-am
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
@@ -765,7 +809,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_KARMA_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_KARMA_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_KARMA_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_KARMA_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_KARMA_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_KARMA_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_KARMA_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_KARMA_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -792,6 +836,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_KARMA_TRUE@	for ASM in $(KARMASHARP_ASSEMBLIES); do \
 @ENABLE_KARMA_TRUE@		rm -f $(DESTDIR)$(moduledir)/`basename $$ASM`; \
 @ENABLE_KARMA_TRUE@	done;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage.addin.xml b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage.addin.xml
index acc2463..962f526 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage.addin.xml
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage.addin.xml
@@ -30,10 +30,16 @@
         vendor-id="0x0bb4" product-id="0x0c01,0x0c02"/>
     <MassStorageDevice class="Banshee.Dap.MassStorage.AndroidDevice" 
         vendor-name="Samsung" product-name="Samsung Galaxy"
-        vendor-id="0x04e8" product-id="0x6603,0x6601"/>
+        vendor-id="0x04e8" product-id="0x6603,0x6601,0x6640"/>
+    <MassStorageDevice class="Banshee.Dap.MassStorage.AndroidDevice"
+        vendor-name="Motorola" product-name="Motorola Droid"
+        vendor-id="0x22b8" product-id="0x41d9,0x41db"/>
+    <MassStorageDevice class="Banshee.Dap.MassStorage.AndroidDevice"
+        vendor-name="Huawei" product-name="Pulse"
+        vendor-id="0x12d1" product-id="0x1501"/>
     <MassStorageDevice class="Banshee.Dap.MassStorage.WebOSDevice"
         vendor-name="Palm" product-name="Pre"
-        vendor-id="0x0830" product-id="0x8004"/>
+        vendor-id="0x0830" product-id="0x8004,0x8002"/>
   </Extension>
 
 </Addin>
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AndroidDevice.cs b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AndroidDevice.cs
index ca5e3a9..23bf5cf 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AndroidDevice.cs
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/AndroidDevice.cs
@@ -52,7 +52,7 @@ namespace Banshee.Dap.MassStorage
             "audio/3gpp",
             "audio/x-midi"
         };
-        
+
         private static string [] audio_folders = new string [] {
             "Music/",
             "amazonmp3/",
@@ -68,31 +68,31 @@ namespace Banshee.Dap.MassStorage
         };
 
         private static string playlists_path = "Playlists/";
-        
+
         private static string [] icon_names = new string [] {
             "phone-htc-g1-white", DapSource.FallbackIcon
         };
-        
+
         private AmazonMp3GroupSource amazon_source;
         private string amazon_base_dir;
-        
+
         public override void SourceInitialize ()
         {
             amazon_base_dir = System.IO.Path.Combine (Source.Volume.MountPoint, audio_folders[1]);
-            
+
             amazon_source = new AmazonMp3GroupSource (Source, "amazonmp3", amazon_base_dir);
             amazon_source.AutoHide = true;
         }
-        
+
         public override bool LoadDeviceConfiguration ()
         {
             return true;
         }
-        
+
         public override string Name {
             get { return VendorProductInfo.ProductName; }
         }
-        
+
         public override string [] AudioFolders {
             get { return audio_folders; }
         }
@@ -104,7 +104,7 @@ namespace Banshee.Dap.MassStorage
         public override string [] PlaylistFormats {
             get { return playlist_formats; }
         }
-        
+
         public override string PlaylistPath {
             get { return playlists_path; }
         }
@@ -112,32 +112,32 @@ namespace Banshee.Dap.MassStorage
         public override string [] PlaybackMimeTypes {
             get { return playback_mime_types; }
         }
-        
+
         // Cover art information gleaned from Android's Music application
         // packages/apps/Music/src/com/android/music/MusicUtils.java
         // <3 open source
-        
+
         public override int FolderDepth {
             get { return 2; }
         }
-        
+
         public override string CoverArtFileName {
             get { return "AlbumArt.jpg"; }
         }
-        
+
         public override string CoverArtFileType {
             get { return "jpeg"; }
         }
-        
+
         public override int CoverArtSize {
             get { return 320; }
         }
-        
-        public override string [] GetIconNames () 
+
+        public override string [] GetIconNames ()
         {
             return icon_names;
         }
-        
+
         public override bool GetTrackPath (TrackInfo track, out string path)
         {
             path = FileNamePattern.CreateFromTrackInfo (
@@ -145,28 +145,28 @@ namespace Banshee.Dap.MassStorage
                 track);
             return true;
         }
-        
+
 #region Amazon MP3 Store Purchased Tracks Management
 
         public override bool DeleteTrackHook (DatabaseTrackInfo track)
         {
             // Do not allow removing purchased tracks if not in the
             // Amazon Purchased Music source; this should prevent
-            // accidental deletion of purchased music that may not 
+            // accidental deletion of purchased music that may not
             // have been copied from the device yet.
             //
             // TODO: Provide some feedback when a purchased track is
             // skipped from deletion
             //
-            // FIXME: unfortunately this does not work due to 
+            // FIXME: unfortunately this does not work due to
             // the cache models being potentially different
             // even though they will always reference the same tracks
             // amazon_source.TrackModel.IndexOf (track) >= 0
-            
+
             if (!amazon_source.Active && amazon_source.Count > 0 && track.Uri.LocalPath.StartsWith (amazon_base_dir)) {
                 return false;
             }
-            
+
             return true;
         }
 
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/CustomMassStorageDevice.cs b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/CustomMassStorageDevice.cs
index 37182b5..1eb1df3 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/CustomMassStorageDevice.cs
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/CustomMassStorageDevice.cs
@@ -31,15 +31,15 @@ using System;
 using Banshee.Hardware;
 
 namespace Banshee.Dap.MassStorage
-{   
+{
     public class CustomMassStorageDevice : MassStorageDevice
-    {       
+    {
         private VendorProductInfo vendor_product_info;
         public VendorProductInfo VendorProductInfo {
             get { return vendor_product_info; }
             set { vendor_product_info = value; }
         }
-        
+
         public override string Name {
             get { return vendor_product_info.ProductName; }
         }
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/DeviceMapper.cs b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/DeviceMapper.cs
index 1818988..4008a0f 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/DeviceMapper.cs
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/DeviceMapper.cs
@@ -37,13 +37,15 @@ namespace Banshee.Dap.MassStorage
     {
         public static MassStorageDevice Map (MassStorageSource source)
         {
+            var u = source.UsbDevice;
+
             foreach (VendorProductDeviceNode node in AddinManager.GetExtensionNodes (
                 "/Banshee/Dap/MassStorage/Device")) {
-                short vendor_id = (short)source.UsbDevice.VendorId;
-                short product_id = (short)source.UsbDevice.ProductId;
-                
+                short vendor_id = (short)u.VendorId;
+                short product_id = (short)u.ProductId;
+
                 if (node.Matches (vendor_id, product_id)) {
-                    CustomMassStorageDevice device = (CustomMassStorageDevice)node.CreateInstance (); 
+                    CustomMassStorageDevice device = (CustomMassStorageDevice)node.CreateInstance ();
                     device.VendorProductInfo = new VendorProductInfo (
                         node.VendorName, node.ProductName,
                         vendor_id, product_id);
@@ -51,7 +53,18 @@ namespace Banshee.Dap.MassStorage
                     return device;
                 }
             }
-            
+
+            // Look for 'Android' in the product/name/uuid/serial of the device to identify
+            // other Android devices
+            foreach (var str in new string [] { u.Product, u.Name, u.Uuid, u.Serial }) {
+                if (str != null && str.ToLower ().Contains ("android")) {
+                    return new AndroidDevice () {
+                        VendorProductInfo = new VendorProductInfo (u.Vendor, u.Name ?? u.Product, (short)u.VendorId, (short)u.ProductId),
+                        Source = source
+                    };
+                }
+            }
+
             return new MassStorageDevice (source);
         }
     }
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs
index 1a1b91d..a4c8153 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageDevice.cs
@@ -48,35 +48,35 @@ namespace Banshee.Dap.MassStorage
             get { return source; }
             set { source = value; }
         }
-        
+
         public MassStorageDevice ()
         {
         }
-        
+
         public MassStorageDevice (MassStorageSource source)
         {
             Source = source;
         }
-        
+
         public virtual void SourceInitialize ()
         {
         }
-        
+
         public virtual bool DeleteTrackHook (DatabaseTrackInfo track)
         {
             return true;
         }
-        
+
         public virtual bool LoadDeviceConfiguration ()
         {
             string path = IsAudioPlayerPath;
             string path_rockbox = System.IO.Path.Combine (source.Volume.MountPoint, ".rockbox/config.cfg");
             StreamReader reader = null;
-            
+
             if (!File.Exists (path) && !File.Exists (path_rockbox) ) {
                 return false;
             }
-            
+
             if (File.Exists (path_rockbox) ) {
                 Hyena.Log.DebugFormat ("Found RockBox Device");
                 name = Catalog.GetString ("Rockbox Device");
@@ -106,14 +106,14 @@ namespace Banshee.Dap.MassStorage
                                 case "output_formats": playback_mime_types = item.Value; break;
                                 case "playlist_format": playlist_formats = item.Value; break;
                                 case "playlist_path": playlist_path = item.Value[0]; break;
-                                case "folder_depth": 
+                                case "folder_depth":
                                     if (!Int32.TryParse (item.Value[0], out folder_depth)) {
                                         folder_depth = -1;
                                     }
                                     Hyena.Log.DebugFormat ("MassStorageDevice.LoadDeviceConfiguration {0}", folder_depth);
                                     break;
                                 default:
-                                    throw new ApplicationException ("unsupported key");    
+                                    throw new ApplicationException ("unsupported key");
                             }
                         } catch (Exception e) {
                             Log.Exception ("Invalid .is_audio_player item " + item.Key, e);
@@ -129,21 +129,21 @@ namespace Banshee.Dap.MassStorage
             }
 
             has_is_audio_player_file = true;
-            
+
             return true;
         }
-        
+
         public virtual bool GetTrackPath (TrackInfo track, out string path)
         {
             path = null;
             return false;
         }
-        
+
         private bool has_is_audio_player_file;
         public bool HasIsAudioPlayerFile {
             get { return has_is_audio_player_file; }
         }
-        
+
         private string IsAudioPlayerPath {
             get { return System.IO.Path.Combine (source.Volume.MountPoint, ".is_audio_player"); }
         }
@@ -152,61 +152,61 @@ namespace Banshee.Dap.MassStorage
         public virtual string Name {
             get { return name ?? source.Volume.Name; }
         }
-        
+
         private int cover_art_size;
-        public virtual int CoverArtSize { 
-            get { return cover_art_size; } 
+        public virtual int CoverArtSize {
+            get { return cover_art_size; }
         }
-        
+
         private int folder_depth = -1;
-        public virtual int FolderDepth { 
-            get { return folder_depth; } 
+        public virtual int FolderDepth {
+            get { return folder_depth; }
         }
-        
+
         private string [] audio_folders = new string[0];
-        public virtual string [] AudioFolders { 
-            get { return audio_folders; } 
+        public virtual string [] AudioFolders {
+            get { return audio_folders; }
         }
 
         private string [] video_folders = new string[0];
-        public virtual string [] VideoFolders { 
-            get { return video_folders; } 
+        public virtual string [] VideoFolders {
+            get { return video_folders; }
         }
-        
+
         private string cover_art_file_type;
-        public virtual string CoverArtFileType { 
-            get { return cover_art_file_type; } 
+        public virtual string CoverArtFileType {
+            get { return cover_art_file_type; }
         }
-        
+
         private string cover_art_file_name;
-        public virtual string CoverArtFileName { 
-            get { return cover_art_file_name; } 
+        public virtual string CoverArtFileName {
+            get { return cover_art_file_name; }
         }
-        
+
         private string [] playlist_formats;
-        public virtual string [] PlaylistFormats { 
-            get { return playlist_formats; } 
+        public virtual string [] PlaylistFormats {
+            get { return playlist_formats; }
         }
-        
+
         private string playlist_path;
-        public virtual string PlaylistPath { 
-            get { return playlist_path; } 
+        public virtual string PlaylistPath {
+            get { return playlist_path; }
         }
-        
+
         private string [] playback_mime_types;
-        public virtual string [] PlaybackMimeTypes { 
-            get { return playback_mime_types; } 
+        public virtual string [] PlaybackMimeTypes {
+            get { return playback_mime_types; }
         }
-        
+
         public virtual string DeviceType {
             get { return "mass-storage"; }
         }
-        
+
         public virtual string [] GetIconNames ()
         {
             return null;
         }
-        
+
         public bool IsType (string type)
         {
             return type == DeviceType;
diff --git a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs
index b00b145..ba753a0 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs
+++ b/src/Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage/MassStorageSource.cs
@@ -50,9 +50,9 @@ namespace Banshee.Dap.MassStorage
 {
     public class MassStorageSource : DapSource
     {
-        private Banshee.Collection.Gui.ArtworkManager artwork_manager 
+        private Banshee.Collection.Gui.ArtworkManager artwork_manager
             = ServiceManager.Get<Banshee.Collection.Gui.ArtworkManager> ();
-        
+
         private MassStorageDevice ms_device;
         private IVolume volume;
         private IUsbDevice usb_device;
@@ -60,12 +60,12 @@ namespace Banshee.Dap.MassStorage
         public override void DeviceInitialize (IDevice device)
         {
             base.DeviceInitialize (device);
-            
+
             volume = device as IVolume;
             if (volume == null || (usb_device = volume.ResolveRootUsbDevice ()) == null) {
                 throw new InvalidDeviceException ();
             }
-            
+
             ms_device = DeviceMapper.Map (this);
             try {
                 if (!ms_device.LoadDeviceConfiguration ()) {
@@ -78,7 +78,7 @@ namespace Banshee.Dap.MassStorage
             if (!HasMediaCapabilities && ms_device == null) {
                 throw new InvalidDeviceException ();
             }
-            
+
             // Ignore iPods, except ones with .is_audio_player files
             if (MediaCapabilities != null && MediaCapabilities.IsType ("ipod")) {
                 if (ms_device != null && ms_device.HasIsAudioPlayerFile) {
@@ -96,11 +96,11 @@ namespace Banshee.Dap.MassStorage
             mount_point = volume.MountPoint;
 
             Initialize ();
-            
+
             if (ms_device != null) {
                 ms_device.SourceInitialize ();
             }
-            
+
             AddDapProperties ();
 
             // TODO differentiate between Audio Players and normal Disks, and include the size, eg "2GB Audio Player"?
@@ -203,7 +203,7 @@ namespace Banshee.Dap.MassStorage
         public IVolume Volume {
             get { return volume; }
         }
-        
+
         public IUsbDevice UsbDevice {
             get { return usb_device; }
         }
@@ -271,7 +271,7 @@ namespace Banshee.Dap.MassStorage
                         }
                     }
                 }
-                
+
                 SupportsPlaylists &= CanSyncPlaylists;
                 return playlist_types;
             }
@@ -335,11 +335,11 @@ namespace Banshee.Dap.MassStorage
             string [] names = ms_device != null ? ms_device.GetIconNames () : null;
             return names == null ? base.GetIconNames () : names;
         }
-        
+
         public override long BytesUsed {
             get { return BytesCapacity - volume.Available; }
         }
-        
+
         public override long BytesCapacity {
             get { return (long) volume.Capacity; }
         }
@@ -486,19 +486,21 @@ namespace Banshee.Dap.MassStorage
                 // and the MetadataHash will actually match.  We do this by comparing the time
                 // stamps on files for last update of the db metadata vs the sync to file.
                 // The equals on the inequality below is necessary for podcasts who often have a sync and
-                // update time that are the same to the second, even though the album metadata has changed in the 
+                // update time that are the same to the second, even though the album metadata has changed in the
                 // DB to the feedname instead of what is in the file.  It should be noted that writing the metadata
                 // is a small fraction of the total copy time anyway.
 
                 if (track.LastSyncedStamp >= Hyena.DateTimeUtil.ToDateTime (track.FileModifiedStamp)) {
                     Log.DebugFormat ("Copying Metadata to File Since Sync time >= Updated Time");
-                    Banshee.Streaming.StreamTagger.SaveToFile (copied_track);
+                    bool write_metadata = Metadata.SaveTrackMetadataService.WriteMetadataEnabled.Value;
+                    bool write_ratings_and_playcounts = Metadata.SaveTrackMetadataService.WriteRatingsAndPlayCountsEnabled.Value;
+                    Banshee.Streaming.StreamTagger.SaveToFile (copied_track, write_metadata, write_ratings_and_playcounts);
                 }
 
                 copied_track.Save (false);
             }
 
-            if (CoverArtSize > -1 && !String.IsNullOrEmpty (CoverArtFileType) && 
+            if (CoverArtSize > -1 && !String.IsNullOrEmpty (CoverArtFileType) &&
                     !String.IsNullOrEmpty (CoverArtFileName) && (FolderDepth == -1 || FolderDepth > 0)) {
                 SafeUri cover_uri = new SafeUri (System.IO.Path.Combine (System.IO.Path.GetDirectoryName (new_uri.LocalPath),
                                                                          CoverArtFileName));
@@ -507,13 +509,13 @@ namespace Banshee.Dap.MassStorage
                     coverart_id = String.Format ("podcast-{0}", Banshee.Base.CoverArtSpec.EscapePart (track.AlbumTitle));
                 } else {
                     coverart_id = track.ArtworkId;
-                }                
-                
-                if (!File.Exists (cover_uri) && CoverArtSpec.CoverExists (coverart_id)) {       
+                }
+
+                if (!File.Exists (cover_uri) && CoverArtSpec.CoverExists (coverart_id)) {
                     Gdk.Pixbuf pic = null;
-                    
+
                     if (CoverArtSize == 0) {
-                        if (CoverArtFileType == "jpg" || CoverArtFileType == "jpeg") {                        
+                        if (CoverArtFileType == "jpg" || CoverArtFileType == "jpeg") {
                             SafeUri local_cover_uri = new SafeUri (Banshee.Base.CoverArtSpec.GetPath (coverart_id));
                             Banshee.IO.File.Copy (local_cover_uri, cover_uri, false);
                         } else {
@@ -524,7 +526,7 @@ namespace Banshee.Dap.MassStorage
                     }
 
                     if (pic != null) {
-                        try {                        
+                        try {
                             byte [] bytes = pic.SaveToBuffer (CoverArtFileType);
                             System.IO.Stream cover_art_file = File.OpenWrite (cover_uri, true);
                             cover_art_file.Write (bytes, 0, bytes.Length);
@@ -545,11 +547,11 @@ namespace Banshee.Dap.MassStorage
                 if (ms_device != null && !ms_device.DeleteTrackHook (track)) {
                     return false;
                 }
-            
+
                 string track_file = System.IO.Path.GetFileName (track.Uri.LocalPath);
                 string track_dir = System.IO.Path.GetDirectoryName (track.Uri.LocalPath);
                 int files = 0;
-                
+
                 // Count how many files remain in the track's directory,
                 // excluding self or cover art
                 foreach (string file in System.IO.Directory.GetFiles (track_dir)) {
@@ -558,18 +560,18 @@ namespace Banshee.Dap.MassStorage
                         files++;
                     }
                 }
-                
+
                 // If we are the last track, go ahead and delete the artwork
                 // to ensure that the directory tree can get trimmed away too
                 if (files == 0 && CoverArtFileName != null) {
                     System.IO.File.Delete (Paths.Combine (track_dir, CoverArtFileName));
                 }
-                
+
                 Banshee.IO.Utilities.DeleteFileTrimmingParentDirectories (track.Uri);
             } catch (System.IO.FileNotFoundException) {
             } catch (System.IO.DirectoryNotFoundException) {
             }
-            
+
             return true;
         }
 
@@ -584,7 +586,7 @@ namespace Banshee.Dap.MassStorage
                 volume.Eject ();
             }
         }
-        
+
         protected override bool CanHandleDeviceCommand (DeviceCommand command)
         {
             try {
@@ -617,7 +619,7 @@ namespace Banshee.Dap.MassStorage
                     string track_album  = FileNamePattern.Escape (track.DisplayAlbumTitle);
                     string track_number = FileNamePattern.Escape (Convert.ToString (track.TrackNumber));
                     string track_title  = FileNamePattern.Escape (track.DisplayTrackTitle);
-    
+
                     if (depth == 0) {
                         // Artist - Album - 01 - Title
                         string track_artist = FileNamePattern.Escape (track.DisplayArtistName);
@@ -638,10 +640,10 @@ namespace Banshee.Dap.MassStorage
                                 file_path = album_artist.Substring (0, Math.Min (i+1, album_artist.Length)).Trim ();
                             } else {
                                 file_path = System.IO.Path.Combine (file_path, album_artist.Substring (0, Math.Min (i+1, album_artist.Length)).Trim ());
-                            }                                        
-                            
+                            }
+
                         }
-    
+
                         // Finally add on the Artist/Album/01 - Track
                         file_path = System.IO.Path.Combine (file_path, album_artist);
                         file_path = System.IO.Path.Combine (file_path, track_album);
@@ -651,14 +653,14 @@ namespace Banshee.Dap.MassStorage
                     file_path = FileNamePattern.CreateFromTrackInfo (track);
                 }
             }
-            
+
             if (track.HasAttribute (TrackMediaAttributes.VideoStream)) {
               file_path = System.IO.Path.Combine (WritePathVideo, file_path);
             } else {
               file_path = System.IO.Path.Combine (WritePath, file_path);
             }
             file_path += ext;
-            
+
             return file_path;
         }
     }
diff --git a/src/Dap/Banshee.Dap.MassStorage/Makefile.in b/src/Dap/Banshee.Dap.MassStorage/Makefile.in
index 2b0f55c..ea9876b 100644
--- a/src/Dap/Banshee.Dap.MassStorage/Makefile.in
+++ b/src/Dap/Banshee.Dap.MassStorage/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,6 +386,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -480,11 +490,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -502,6 +513,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -531,6 +543,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -550,14 +563,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.MassStorage/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.MassStorage/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.MassStorage/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.MassStorage/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -575,25 +588,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -623,13 +652,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -661,6 +694,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -681,6 +715,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -689,18 +725,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -761,7 +807,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -778,6 +824,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
index 87cd88e..560f11f 100644
--- a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
+++ b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
@@ -67,7 +67,7 @@ namespace Banshee.Dap.Mtp
         public override void DeviceInitialize (IDevice device)
         {
             base.DeviceInitialize (device);
-            
+
             if (MediaCapabilities == null || !MediaCapabilities.IsType ("mtp")) {
                 throw new InvalidDeviceException ();
             }
@@ -244,7 +244,7 @@ namespace Banshee.Dap.Mtp
                     playlist.Remove ();
                 }
                 device_playlists.Clear ();
-    
+
                 // Add playlists from Banshee to the device
                 foreach (Source child in Children) {
                     PlaylistSource from = child as PlaylistSource;
@@ -308,7 +308,7 @@ namespace Banshee.Dap.Mtp
                 return bytes_used;
             }
         }
-        
+
         private long bytes_capacity;
         public override long BytesCapacity {
             get {
@@ -412,7 +412,7 @@ namespace Banshee.Dap.Mtp
                         album_cache.Remove (key);
                     }
                 }
-                
+
                 return true;
             }
         }
diff --git a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
index eb90d24..8932d0f 100644
--- a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
+++ b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
@@ -5,28 +5,28 @@
  *  Written by Patrick van Staveren (trick at vanstaveren.us)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
-using System; 
+using System;
 using System.IO;
 
 using Banshee.Base;
@@ -42,7 +42,7 @@ namespace Banshee.Dap.Mtp
     public class MtpTrackInfo : DatabaseTrackInfo
     {
         private Track file;
-        
+
         public Track OriginalFile {
             get { return file; }
         }
@@ -51,12 +51,12 @@ namespace Banshee.Dap.Mtp
         {
             return String.Format ("mtp://{0}/{1}", track.FileId, track.FileName);
         }
-        
+
         public MtpTrackInfo (MtpDevice device, Track file) : base()
         {
             this.file = file;
             ExternalId = file.FileId;
-            
+
             AlbumTitle = file.Album;
             ArtistName = file.Artist;
             Duration = TimeSpan.FromMilliseconds (file.Duration);
@@ -75,7 +75,7 @@ namespace Banshee.Dap.Mtp
                 SetAttributeIf (file.InFolder (device.MusicFolder), TrackMediaAttributes.Music);
                 SetAttributeIf (file.InFolder (device.VideoFolder), TrackMediaAttributes.VideoStream);
             }
-            
+
             // This can be implemented if there's enough people requesting it
             CanPlay = false;
             CanSaveToDatabase = true;
diff --git a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/Tests/MtpDapTests.cs b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/Tests/MtpDapTests.cs
index f4f8b9e..0cc4540 100644
--- a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/Tests/MtpDapTests.cs
+++ b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/Tests/MtpDapTests.cs
@@ -36,7 +36,7 @@ using Mtp;
 
 using Banshee.Collection;
 using Banshee.Dap.Mtp;
-    
+
 namespace Banshee.Dap.Mtp
 {
     [TestFixture]
diff --git a/src/Dap/Banshee.Dap.Mtp/Makefile.in b/src/Dap/Banshee.Dap.Mtp/Makefile.in
index c45321a..92ef8b3 100644
--- a/src/Dap/Banshee.Dap.Mtp/Makefile.in
+++ b/src/Dap/Banshee.Dap.Mtp/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -372,6 +381,7 @@ RESOURCES = Banshee.Dap.Mtp.addin.xml
 @ENABLE_MTP_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_MTP_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_MTP_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_MTP_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -475,11 +485,12 @@ RESOURCES = Banshee.Dap.Mtp.addin.xml
 @ENABLE_MTP_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_MTP_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_MTP_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_MTP_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_MTP_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_MTP_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -497,6 +508,7 @@ RESOURCES = Banshee.Dap.Mtp.addin.xml
 @ENABLE_MTP_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_MTP_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_MTP_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_MTP_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_MTP_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -526,6 +538,7 @@ RESOURCES = Banshee.Dap.Mtp.addin.xml
 @ENABLE_MTP_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_MTP_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_MTP_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_MTP_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_MTP_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_MTP_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_MTP_TRUE at OUTPUT_FILES = \
@@ -546,14 +559,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Mtp/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap.Mtp/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Mtp/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Banshee.Dap.Mtp/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -571,25 +584,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -619,13 +648,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -657,6 +690,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -679,6 +713,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -687,18 +723,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -759,7 +805,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_MTP_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_MTP_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_MTP_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_MTP_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_MTP_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_MTP_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_MTP_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_MTP_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -776,6 +822,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_MTP_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_MTP_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs
index dc696b9..3ef1911 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapActions.cs
@@ -47,12 +47,12 @@ namespace Banshee.Dap.Gui
         {
             AddImportant (
                 new ActionEntry ("SyncDapAction", null,
-                    Catalog.GetString ("Synchronize"), null,
+                    Catalog.GetString ("Sync"), null,
                     String.Empty, OnSyncDap)
             );
 
             AddUiFromFile ("GlobalUI.xml");
-            
+
             this["SyncDapAction"].IconName = Stock.Refresh;
             ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
             Actions.SourceActions.Updated += delegate { UpdateActions (); };
@@ -84,8 +84,6 @@ namespace Banshee.Dap.Gui
             DapSource dap = Dap;
             if (dap != null) {
                 UpdateAction ("SyncDapAction", dap.Sync.Enabled && !dap.Sync.AutoSync);
-                /* Translators: {0} is the name of the digital audio player */
-                this["SyncDapAction"].Label = String.Format (Catalog.GetString ("Synchronize {0}"), dap.Name);
             }
         }
 
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapContent.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapContent.cs
index 08498aa..8a5765f 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapContent.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapContent.cs
@@ -44,7 +44,7 @@ namespace Banshee.Dap.Gui
     {
         private Label title;
         private DapSource dap;
-        
+
         // Ugh, this is to avoid the GLib.MissingIntPtrCtorException seen by some; BGO #552169
         protected DapContent (IntPtr ptr) : base (ptr)
         {
@@ -62,25 +62,25 @@ namespace Banshee.Dap.Gui
         {
             HBox split_box = new HBox ();
             VBox content_box = new VBox ();
-            
+
             content_box.BorderWidth = 5;
-            
+
             title = new Label ();
             SetTitleText (dap.Name);
             title.Xalign = 0.0f;
-            
+
             Banshee.Preferences.Gui.NotebookPage properties = new Banshee.Preferences.Gui.NotebookPage (dap.Preferences);
             properties.BorderWidth = 0;
-            
+
             content_box.PackStart (title, false, false, 0);
             content_box.PackStart (properties, false, false, 0);
-            
+
             Image image = new Image (LargeIcon);
             image.Yalign = 0.0f;
-            
+
             split_box.PackStart (image, false, true, 0);
             split_box.PackEnd (content_box, true, true, 0);
-            
+
             Add (split_box);
             ShowAll ();
         }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs
index d379274..6fd148e 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapInfoBar.cs
@@ -40,45 +40,45 @@ namespace Banshee.Dap.Gui
         private DapSource source;
         private SegmentedBar disk_bar;
         private Alignment disk_bar_align;
-        
+
         public DapInfoBar (DapSource source)
         {
             this.source = source;
             source.Updated += OnSourceUpdated;
-            
+
             BuildWidget ();
         }
-        
+
         protected override void OnDestroyed ()
         {
             base.OnDestroyed ();
             source.Updated -= OnSourceUpdated;
             source = null;
         }
-        
+
         private void BuildWidget ()
         {
             HBox box = new HBox ();
-            
+
             disk_bar_align = new Alignment (0.5f, 0.5f, 1.0f, 1.0f);
             disk_bar = new SegmentedBar ();
             disk_bar.ValueFormatter = DapValueFormatter;
-            
+
             disk_bar.AddSegmentRgb (Catalog.GetString ("Audio"), 0, 0x3465a4);
             disk_bar.AddSegmentRgb (Catalog.GetString ("Video"), 0, 0x73d216);
             disk_bar.AddSegmentRgb (Catalog.GetString ("Other"), 0, 0xf57900);
             disk_bar.AddSegment (Catalog.GetString ("Free Space"), 0, disk_bar.RemainderColor, false);
-            
+
             UpdateUsage ();
 
             disk_bar_align.Add (disk_bar);
 
             box.PackStart (disk_bar_align, true, true, 0);
             disk_bar_align.TopPadding = 6;
-            
+
             Add (box);
             box.ShowAll ();
-            
+
             SizeAllocated += delegate (object o, Gtk.SizeAllocatedArgs args) {
                 SetBackground ();
                 disk_bar.HorizontalPadding = (int)(args.Allocation.Width * 0.25);
@@ -92,13 +92,16 @@ namespace Banshee.Dap.Gui
             }
 
             long size = (long)(source.BytesCapacity * segment.Percent);
-            return size <= 0 
+            return size <= 0
                 ? Catalog.GetString ("None")
                 : new Hyena.Query.FileSizeQueryValue (size).ToUserQuery ();
         }
-        
+
         private void OnSourceUpdated (object o, EventArgs args)
         {
+            if (source.Sync.Syncing)
+                return;
+
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 try {
                     UpdateUsage ();
@@ -107,18 +110,18 @@ namespace Banshee.Dap.Gui
                 }
             });
         }
-        
+
         protected override void OnStyleSet (Style previous_style)
         {
             base.OnStyleSet (previous_style);
             SetBackground ();
         }
-        
+
         private void SetBackground ()
         {
             Cairo.Color light = CairoExtensions.GdkColorToCairoColor (Style.Background (StateType.Normal));
             Cairo.Color dark = CairoExtensions.ColorShade (light, 0.85);
-            
+
             Cairo.LinearGradient grad = new Cairo.LinearGradient (0, Allocation.Y, 0, Allocation.Y + Allocation.Height);
             grad.AddColorStop (0, dark);
             grad.AddColorStop (1, light);
@@ -129,7 +132,7 @@ namespace Banshee.Dap.Gui
         {
             long data = source.BytesUsed - source.BytesMusic - source.BytesVideo;
             double cap = (double)source.BytesCapacity;
-        
+
             disk_bar.UpdateSegment (0, source.BytesMusic / cap);
             disk_bar.UpdateSegment (1, source.BytesVideo / cap);
             disk_bar.UpdateSegment (2, data / cap);
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs
index 82ab131..d439faa 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDialog.cs
@@ -44,12 +44,12 @@ namespace Banshee.Dap
         private DapSource source;
         private Entry nameEntry;
         //private Entry ownerEntry;
-        
+
         private string name_update;
         //private string owner_update;
-        
+
         private bool edited;
-        
+
         public DapPropertiesDialog(DapSource source) : base(
             // Translators: {0} is the name assigned to a Digital Audio Player by its owner
             String.Format(Catalog.GetString("{0} Properties"), source.Name),
@@ -59,28 +59,28 @@ namespace Banshee.Dap
             ResponseType.Close)
         {
             this.source = source;
-            
+
             HBox iconbox = new HBox();
             iconbox.Spacing = 10;
             //Image icon = new Image (source.Properties.Get<string> ("Icon.Names")[0], IconSize.Dialog);
             //icon.Yalign = 0.0f;
             //icon.Pixbuf = device.GetIcon(48);
             //iconbox.PackStart(icon, false, false, 0);
-            
+
             VBox box = new VBox();
             box.Spacing = 10;
-            
+
             PropertyTable table = new PropertyTable();
             table.ColumnSpacing = 10;
             table.RowSpacing = 5;
-            
+
             if(!source.IsReadOnly && source.CanRename) {
                 nameEntry = table.AddEntry(Catalog.GetString("Device name"), source.Name);
                 nameEntry.Changed += OnEntryChanged;
             } else {
                 table.AddLabel(Catalog.GetString("Device name"), source.Name);
             }
-            
+
             /*if(device.ShowOwner) {
                 if(!device.IsReadOnly && device.CanSetOwner) {
                     ownerEntry = table.AddEntry(Catalog.GetString("Owner name"), device.Owner);
@@ -89,39 +89,39 @@ namespace Banshee.Dap
                     table.AddLabel(Catalog.GetString("Owner name"), device.Owner);
                 }
             }*/
-            
+
             if(!source.IsReadOnly) {
                 try {
                     VBox profile_description_box = new VBox();
-                    ProfileComboBoxConfigurable profile_box = new ProfileComboBoxConfigurable(ServiceManager.MediaProfileManager, 
+                    ProfileComboBoxConfigurable profile_box = new ProfileComboBoxConfigurable(ServiceManager.MediaProfileManager,
                         source.UniqueId, profile_description_box);
                     profile_box.Combo.MimeTypeFilter = source.AcceptableMimeTypes;
                     table.AddWidget(Catalog.GetString("Encode to"), profile_box);
                     table.AddWidget(null, profile_description_box);
                     profile_description_box.Show();
-                
+
                     table.AddSeparator();
                 } catch(Exception e) {
                     Console.WriteLine(e);
                 }
             }
-            
+
             table.AddWidget(Catalog.GetString("Capacity used"), UsedProgressBar);
-    
+
             box.PackStart(table, true, true, 0);
-            
+
             PropertyTable extTable = new PropertyTable();
             extTable.ColumnSpacing = 10;
             extTable.RowSpacing = 5;
-            
+
             foreach(DapSource.DapProperty property in source.DapProperties) {
                 extTable.AddLabel(property.Name, property.Value);
             }
-            
+
             Expander expander = new Expander(Catalog.GetString("Advanced details"));
             expander.Add(extTable);
             box.PackStart(expander, false, false, 0);
-            
+
             BorderWidth = 10;
             Resizable = false;
             iconbox.PackStart(box, true, true, 0);
@@ -139,7 +139,7 @@ namespace Banshee.Dap
 
             Destroy ();
         }
-        
+
         private ProgressBar UsedProgressBar {
             get {
                 ProgressBar usedBar = new ProgressBar();
@@ -152,32 +152,32 @@ namespace Banshee.Dap
                 return usedBar;
             }
         }
-        
+
         private void OnEntryChanged(object o, EventArgs args)
         {
             /*if(ownerEntry != null) {
                 owner_update = ownerEntry.Text;
             }*/
-            
+
             if(nameEntry != null) {
                 name_update = nameEntry.Text;
             }
-            
+
             edited = true;
         }
-        
+
         public bool Edited {
             get {
                 return edited;
             }
         }
-        
+
         public string UpdatedName {
             get {
                 return name_update;
             }
         }
-        
+
         public string UpdatedOwner {
             get {
                 return null; //owner_update;
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDisplay.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDisplay.cs
index 9950c23..2ae6fb2 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDisplay.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/DapPropertiesDisplay.cs
@@ -44,12 +44,12 @@ using Hyena.Gui.Theming;
 
 namespace Banshee.Dap.Gui
 {
-    
+
     public class DapPropertiesDisplay : Alignment, ISourceContents
     {
         private DapSource source;
         private Theme theme;
-        
+
         private Gdk.Pixbuf large_icon;
         public Gdk.Pixbuf LargeIcon {
             get {
@@ -64,23 +64,23 @@ namespace Banshee.Dap.Gui
         protected DapPropertiesDisplay (IntPtr ptr) : base (ptr)
         {
         }
-        
+
         public DapPropertiesDisplay (DapSource source) : base (0.5f, 0.35f, 0.0f, 0.0f)
         {
             AppPaintable = true;
             this.source = source;
         }
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
             theme = new GtkTheme (this);
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-                
+
             try {
                 DrawFrame (cr, evnt.Area);
                 return base.OnExposeEvent (evnt);
@@ -88,36 +88,36 @@ namespace Banshee.Dap.Gui
                 ((IDisposable)cr).Dispose ();
             }
         }
-        
+
         private void DrawFrame (Cairo.Context cr, Gdk.Rectangle clip)
         {
-            Gdk.Rectangle rect = new Gdk.Rectangle (Allocation.X, Allocation.Y, 
+            Gdk.Rectangle rect = new Gdk.Rectangle (Allocation.X, Allocation.Y,
                 Allocation.Width, Allocation.Height);
             theme.Context.ShowStroke = true;
             theme.DrawFrameBackground (cr, rect, true);
             theme.DrawFrameBorder (cr, rect);
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
             QueueDraw ();
         }
-        
+
         /*private void BuildPropertyTable ()
         {
             MessagePane pane = new MessagePane ();
-            pane.HeaderIcon = 
+            pane.HeaderIcon =
             pane.HeaderMarkup = String.Format ("<big><b>{0}</b></big>", GLib.Markup.EscapeText (source.Name));
-            
+
             Button properties_button = new Button (String.Format (Catalog.GetString ("{0} Properties"), source.GenericName));
             pane.Append (properties_button);
-            
+
             Add (pane);
         }*/
-        
+
 #region ISourceContents
-        
+
         public bool SetSource (ISource src)
         {
             this.source = source as DapSource;
@@ -136,7 +136,7 @@ namespace Banshee.Dap.Gui
         public Widget Widget {
             get { return this; }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/PurchasedMusicActions.cs b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/PurchasedMusicActions.cs
index 580f914..2f6a12e 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap.Gui/PurchasedMusicActions.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap.Gui/PurchasedMusicActions.cs
@@ -45,7 +45,7 @@ namespace Banshee.Dap.Gui
                 instance = new PurchasedMusicActions ();
             }
         }
-    
+
         private PurchasedMusicActions () : base ("dap-purchased-music")
         {
             AddImportant (
@@ -53,9 +53,9 @@ namespace Banshee.Dap.Gui
                     Catalog.GetString ("Import Purchased Music"), null,
                     null, OnImportPurchasedMusic)
             );
-            
+
             this["PurchasedMusicImportAction"].IconName = Stock.Save;
-            
+
             Actions.SourceActions.Updated += OnUpdateActions;
             Register ();
         }
@@ -64,7 +64,7 @@ namespace Banshee.Dap.Gui
         {
             UpdateAction ("PurchasedMusicImportAction", source is IPurchasedMusicSource);
         }
-        
+
         private void OnImportPurchasedMusic (object o, EventArgs args)
         {
             IPurchasedMusicSource source = Actions.SourceActions.ActionSource as IPurchasedMusicSource;
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
index 55b6876..9ec6b47 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
@@ -44,7 +44,7 @@ using Banshee.SmartPlaylist;
 using Banshee.Query;
 
 namespace Banshee.Dap
-{ 
+{
     public sealed class DapLibrarySync
     {
         private DapSync sync;
@@ -55,13 +55,13 @@ namespace Banshee.Dap
         private SchemaPreference<bool> enabled_pref;
         private SmartPlaylistSource sync_src, to_add, to_remove;
         private Section library_prefs_section;
-        
+
         #region Public Properties
 
         public bool Enabled {
             get { return sync.Enabled && enabled.Get (); }
         }
-        
+
         public bool SyncEntireLibrary {
             get { return sync_entire_library.Get (); }
         }
@@ -73,13 +73,13 @@ namespace Banshee.Dap
         public LibrarySource Library {
             get { return library; }
         }
-        
+
         #endregion
-        
+
         public string [] SyncPlaylistIds {
             get { return playlist_ids.Get (); }
         }
-        
+
         private IList<AbstractPlaylistSource> GetSyncPlaylists ()
         {
             List<AbstractPlaylistSource> playlists = new List<AbstractPlaylistSource> ();
@@ -94,7 +94,7 @@ namespace Banshee.Dap
         internal string SmartPlaylistId {
             get { return sync_src.DbId.ToString (); }
         }
-        
+
         internal DapLibrarySync (DapSync sync, LibrarySource library)
         {
             this.sync = sync;
@@ -119,13 +119,13 @@ namespace Banshee.Dap
         private void BuildPreferences ()
         {
             conf_ns = String.Format ("{0}.{1}", sync.ConfigurationNamespace, library.ParentConfigurationId);
-            
+
             enabled = sync.Dap.CreateSchema<bool> (conf_ns, "enabled", true,
                 String.Format (Catalog.GetString ("Sync {0}"), library.Name), "");
-            
+
             sync_entire_library = sync.Dap.CreateSchema<bool> (conf_ns, "sync_entire_library", true,
                 "Whether to sync the entire library and all playlists.", "");
-            
+
             playlist_ids = sync.Dap.CreateSchema<string[]> (conf_ns, "playlist_ids", new string [0],
                 "If sync_entire_library is false, this contains a list of playlist ids specifically to sync", "");
 
@@ -160,13 +160,13 @@ namespace Banshee.Dap
             to_remove.Save ();
             to_remove.AddCondition (library.AttributesCondition);
             to_remove.AddCondition (String.Format (
-                @"MetadataHash NOT IN (SELECT MetadataHash FROM CoreTracks, CoreSmartPlaylistEntries 
+                @"MetadataHash NOT IN (SELECT MetadataHash FROM CoreTracks, CoreSmartPlaylistEntries
                     WHERE CoreSmartPlaylistEntries.SmartPlaylistID = {0} AND
                         CoreTracks.TrackID = CoreSmartPlaylistEntries.TrackID)",
                 sync_src.DbId
             ));
         }
-        
+
         internal void CalculateSync ()
         {
             if (SyncEntireLibrary) {
@@ -195,7 +195,7 @@ namespace Banshee.Dap
             return String.Format ("Sync calculated for {1}: to add: {0} items, remove {2} items; sync_src.cacheid = {5}, to_add.cacheid = {3}, to_remove.cacheid = {4}", to_add.Count, library.Name, to_remove.Count,
                                   to_add.DatabaseTrackModel.CacheId, to_remove.DatabaseTrackModel.CacheId, sync_src.DatabaseTrackModel.CacheId);
         }
-        
+
         internal void Sync ()
         {
             if (Enabled) {
@@ -220,7 +220,7 @@ namespace Banshee.Dap
                         ServiceManager.DbConnection.Execute (
                             String.Format (
                                 @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
-                                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND MetadataHash IN 
+                                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND MetadataHash IN
                                         (SELECT MetadataHash FROM {0} WHERE {1})",
                                 from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition),
                             to.DbId, sync.Dap.DbId
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs
index ea5192b..0356540 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapService.cs
@@ -64,9 +64,9 @@ namespace Banshee.Dap
 
                 sources = new Dictionary<string, DapSource> ();
                 supported_dap_types = new List<TypeExtensionNode> ();
-                
+
                 AddinManager.AddExtensionNodeHandler ("/Banshee/Dap/DeviceClass", OnExtensionChanged);
-                
+
                 ServiceManager.HardwareManager.DeviceAdded += OnHardwareDeviceAdded;
                 ServiceManager.HardwareManager.DeviceRemoved += OnHardwareDeviceRemoved;
                 ServiceManager.HardwareManager.DeviceCommand += OnDeviceCommand;
@@ -75,29 +75,29 @@ namespace Banshee.Dap
             }
         }
 
-        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args) 
+        private void OnExtensionChanged (object o, ExtensionNodeEventArgs args)
         {
             lock (sync) {
                 TypeExtensionNode node = (TypeExtensionNode)args.ExtensionNode;
-                
+
                 if (args.Change == ExtensionChange.Add) {
                     Log.DebugFormat ("Dap support extension loaded: {0}", node.Addin.Id);
                     supported_dap_types.Add (node);
-    
+
                     // See if any existing devices are handled by this new DAP support
                     foreach (IDevice device in ServiceManager.HardwareManager.GetAllDevices ()) {
                         MapDevice (device);
                     }
                 } else if (args.Change == ExtensionChange.Remove) {
                     supported_dap_types.Remove (node);
-                    
+
                     Queue<DapSource> to_remove = new Queue<DapSource> ();
                     foreach (DapSource source in sources.Values) {
                         if (source.AddinId == node.Addin.Id) {
                             to_remove.Enqueue (source);
                         }
                     }
-                    
+
                     while (to_remove.Count > 0) {
                         UnmapDevice (to_remove.Dequeue ().Device.Uuid);
                     }
@@ -113,17 +113,17 @@ namespace Banshee.Dap
                     return;
 
                 AddinManager.RemoveExtensionNodeHandler ("/Banshee/Dap/DeviceClass", OnExtensionChanged);
-                
+
                 ServiceManager.HardwareManager.DeviceAdded -= OnHardwareDeviceAdded;
                 ServiceManager.HardwareManager.DeviceRemoved -= OnHardwareDeviceRemoved;
                 ServiceManager.HardwareManager.DeviceCommand -= OnDeviceCommand;
                 ServiceManager.SourceManager.SourceRemoved -= OnSourceRemoved;
-                
+
                 List<DapSource> dap_sources = new List<DapSource> (sources.Values);
                 foreach (DapSource source in dap_sources) {
                     UnmapDevice (source.Device.Uuid);
                 }
-                
+
                 sources.Clear ();
                 sources = null;
                 supported_dap_types.Clear ();
@@ -131,7 +131,7 @@ namespace Banshee.Dap
                 initialized = false;
             }
         }
-        
+
         private DapSource FindDeviceSource (IDevice device)
         {
             foreach (TypeExtensionNode node in supported_dap_types) {
@@ -148,10 +148,10 @@ namespace Banshee.Dap
                     Log.Exception (e);
                 }
             }
-            
+
             return null;
         }
-        
+
         private void MapDevice (IDevice device)
         {
             Scheduler.Schedule (new MapDeviceJob (this, device));
@@ -171,7 +171,7 @@ namespace Banshee.Dap
             public string Uuid {
                 get { return device.Uuid; }
             }
-            
+
             public void Run ()
             {
                 DapSource source = null;
@@ -180,19 +180,19 @@ namespace Banshee.Dap
                         if (service.sources.ContainsKey (device.Uuid)) {
                             return;
                         }
-                        
+
                         if (device is ICdromDevice || device is IDiscVolume) {
                             return;
                         }
-                        
+
                         if (device is IVolume && (device as IVolume).ShouldIgnore) {
                             return;
                         }
-                        
+
                         if (device.MediaCapabilities == null && !(device is IBlockDevice) && !(device is IVolume)) {
                             return;
                         }
-                        
+
                         source = service.FindDeviceSource (device);
                         if (source != null) {
                             Log.DebugFormat ("Found DAP support ({0}) for device {1}", source.GetType ().FullName, source.Name);
@@ -207,7 +207,7 @@ namespace Banshee.Dap
                     ThreadAssist.ProxyToMain (delegate {
                         ServiceManager.SourceManager.AddSource (source);
                         source.NotifyUser ();
-                        
+
                         // If there are any queued device commands, see if they are to be
                         // handled by this new DAP (e.g. --device-activate=file:///media/disk)
                         try {
@@ -230,7 +230,7 @@ namespace Banshee.Dap
                 }
             }
         }
-        
+
         internal void UnmapDevice (string uuid)
         {
             DapSource source = null;
@@ -261,18 +261,18 @@ namespace Banshee.Dap
                 UnmapDevice (dap_source.Device.Uuid);
             }
         }
-        
+
         private void OnHardwareDeviceAdded (object o, DeviceAddedArgs args)
         {
             MapDevice (args.Device);
         }
-        
+
         private void OnHardwareDeviceRemoved (object o, DeviceRemovedArgs args)
         {
             UnmapDevice (args.DeviceUuid);
         }
-        
-      
+
+
 #region DeviceCommand Handling
 
         private void HandleDeviceCommand (DapSource source, DeviceCommandAction action)
@@ -281,7 +281,7 @@ namespace Banshee.Dap
                 ServiceManager.SourceManager.SetActiveSource (source);
             }
         }
-        
+
         private void OnDeviceCommand (object o, DeviceCommand command)
         {
             lock (this) {
@@ -293,16 +293,16 @@ namespace Banshee.Dap
                         return;
                     }
                 }
-                
+
                 if (unhandled_device_commands == null) {
                     unhandled_device_commands = new List<DeviceCommand> ();
                 }
                 unhandled_device_commands.Add (command);
             }
         }
-        
+
 #endregion
-        
+
         string IService.ServiceName {
             get { return "DapService"; }
         }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
index e020c7c..89faf06 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
@@ -56,23 +56,23 @@ namespace Banshee.Dap
         private DapInfoBar dap_info_bar;
         private Page page;
         // private DapPropertiesDisplay dap_properties_display;
-        
+
         private IDevice device;
         internal IDevice Device {
             get { return device; }
         }
-        
+
         private string addin_id;
         internal string AddinId {
             get { return addin_id; }
             set { addin_id = value; }
         }
-        
+
         private MediaGroupSource music_group_source;
         protected MediaGroupSource MusicGroupSource {
             get { return music_group_source; }
         }
-        
+
         private MediaGroupSource video_group_source;
         protected MediaGroupSource VideoGroupSource {
             get { return video_group_source; }
@@ -82,7 +82,7 @@ namespace Banshee.Dap
         protected MediaGroupSource PodcastGroupSource {
             get { return podcast_group_source; }
         }
-        
+
         protected DapSource ()
         {
         }
@@ -97,14 +97,14 @@ namespace Banshee.Dap
         {
             PurgeTemporaryPlaylists ();
             PurgeTracks ();
-            
+
             if (dap_info_bar != null) {
                 dap_info_bar.Destroy ();
                 dap_info_bar = null;
             }
-            
+
             Properties.Remove ("Nereid.SourceContents.FooterWidget");
-            
+
             /*Properties.Remove ("Nereid.SourceContents");
             dap_properties_display.Destroy ();
             dap_properties_display = null;*/
@@ -112,14 +112,14 @@ namespace Banshee.Dap
             if (sync != null)
                 sync.Dispose ();
         }
-        
+
         private void PurgeTemporaryPlaylists ()
         {
             ServiceManager.DbConnection.Execute (new HyenaSqliteCommand (@"
                 BEGIN TRANSACTION;
                     DELETE FROM CoreSmartPlaylistEntries WHERE SmartPlaylistID IN
                         (SELECT SmartPlaylistID FROM CoreSmartPlaylists WHERE PrimarySourceID = ?);
-                    DELETE FROM CoreSmartPlaylists WHERE PrimarySourceID = ?;   
+                    DELETE FROM CoreSmartPlaylists WHERE PrimarySourceID = ?;
                 COMMIT TRANSACTION",
                 DbId, DbId
             ));
@@ -128,12 +128,12 @@ namespace Banshee.Dap
                 BEGIN TRANSACTION;
                     DELETE FROM CorePlaylistEntries WHERE PlaylistID IN
                         (SELECT PlaylistID FROM CorePlaylists WHERE PrimarySourceID = ?);
-                    DELETE FROM CorePlaylists WHERE PrimarySourceID = ?;   
+                    DELETE FROM CorePlaylists WHERE PrimarySourceID = ?;
                 COMMIT TRANSACTION",
                 DbId, DbId
             ));
         }
-        
+
         internal void RaiseUpdated ()
         {
             OnUpdated ();
@@ -166,16 +166,16 @@ namespace Banshee.Dap
         protected override void Initialize ()
         {
             PurgeTemporaryPlaylists ();
-            
+
             base.Initialize ();
-            
+
             Expanded = true;
             Properties.SetStringList ("Icon.Name", GetIconNames ());
             Properties.Set<string> ("SourcePropertiesActionLabel", Catalog.GetString ("Device Properties"));
             Properties.Set<OpenPropertiesDelegate> ("SourceProperties.GuiHandler", delegate {
                 new DapPropertiesDialog (this).RunDialog ();
             });
-            
+
             Properties.Set<bool> ("Nereid.SourceContents.HeaderVisible", false);
             Properties.Set<System.Reflection.Assembly> ("ActiveSourceUIResource.Assembly", System.Reflection.Assembly.GetExecutingAssembly ());
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
@@ -183,27 +183,26 @@ namespace Banshee.Dap
             sync = new DapSync (this);
             dap_info_bar = new DapInfoBar (this);
             Properties.Set<Gtk.Widget> ("Nereid.SourceContents.FooterWidget", dap_info_bar);
-            
+
             /*dap_properties_display = new DapPropertiesDisplay (this);
             Properties.Set<Banshee.Sources.Gui.ISourceContents> ("Nereid.SourceContents", dap_properties_display);*/
 
             if (String.IsNullOrEmpty (GenericName)) {
                 GenericName = Catalog.GetString ("Media Player");
             }
-            
+
             if (String.IsNullOrEmpty (Name)) {
                 Name = device.Name;
             }
 
             AddDapProperty (Catalog.GetString ("Product"), device.Product);
             AddDapProperty (Catalog.GetString ("Vendor"), device.Vendor);
-            
+
             if (acceptable_mimetypes == null) {
-                acceptable_mimetypes = HasMediaCapabilities 
-                    ? MediaCapabilities.PlaybackMimeTypes 
-                    : new string [] { "taglib/mp3" };
+                acceptable_mimetypes = HasMediaCapabilities ? MediaCapabilities.PlaybackMimeTypes : null;
+                acceptable_mimetypes = acceptable_mimetypes ?? new string [] { "taglib/mp3" };
             }
-            
+
             AddChildSource (music_group_source = new MusicGroupSource (this));
 
             if (SupportsVideo) {
@@ -226,7 +225,7 @@ namespace Banshee.Dap
             page = new Page ();
             Section main_section = new Section ();
             main_section.Order = -1;
-            
+
             space_for_data = CreateSchema<long> ("space_for_data", 0, "How much space, in bytes, to reserve for data on the device.", "");
             main_section.Add (space_for_data);
             page.Add (main_section);
@@ -235,12 +234,12 @@ namespace Banshee.Dap
                 page.Add (section);
             }
         }
-        
+
         // Force to zero so that count doesn't show up
         public override int Count {
             get { return 0; }
         }
-        
+
         public override bool HasProperties {
             get { return true; }
         }
@@ -262,14 +261,14 @@ namespace Banshee.Dap
         }
 
 #endregion
-        
-#region Track Management/Syncing   
- 
+
+#region Track Management/Syncing
+
         public void LoadDeviceContents ()
         {
             ThreadPool.QueueUserWorkItem (ThreadedLoadDeviceContents);
         }
-        
+
         private void ThreadedLoadDeviceContents (object state)
         {
             try {
@@ -325,13 +324,13 @@ namespace Banshee.Dap
                 }
             }
         }
-        
+
         protected abstract void AddTrackToDevice (DatabaseTrackInfo track, SafeUri fromUri);
 
         protected bool TrackNeedsTranscoding (TrackInfo track)
         {
             foreach (string mimetype in AcceptableMimeTypes) {
-                if (ServiceManager.MediaProfileManager.GetExtensionForMimeType (track.MimeType) == 
+                if (ServiceManager.MediaProfileManager.GetExtensionForMimeType (track.MimeType) ==
                     ServiceManager.MediaProfileManager.GetExtensionForMimeType (mimetype)) {
                     return false;
                 }
@@ -383,26 +382,26 @@ namespace Banshee.Dap
                 throw new ApplicationException (Catalog.GetString (
                     "File format conversion support is not available"));
             }
-            
+
             transcoder.Enqueue (track, PreferredConfiguration, OnTrackTranscoded, OnTrackTranscodeCancelled, OnTrackTranscodeError);
         }
-        
+
         private void OnTrackTranscoded (TrackInfo track, SafeUri outputUri)
         {
             AddTrackJob.Status = String.Format ("{0} - {1}", track.ArtistName, track.TrackTitle);
-            
+
             try {
                 AttemptToAddTrackToDevice ((DatabaseTrackInfo)track, outputUri);
             } catch (Exception e) {
                 Log.Exception (e);
             }
-            
+
             IncrementAddedTracks ();
         }
-        
+
         private void OnTrackTranscodeCancelled ()
         {
-            IncrementAddedTracks (); 
+            IncrementAddedTracks ();
         }
 
         private void OnTrackTranscodeError (TrackInfo track)
@@ -410,7 +409,7 @@ namespace Banshee.Dap
             ErrorSource.AddMessage (Catalog.GetString ("Error converting file"), track.Uri.ToString ());
             IncrementAddedTracks ();
         }
-        
+
 #endregion
 
 #region Device Properties
@@ -419,20 +418,20 @@ namespace Banshee.Dap
         {
             string vendor = device.Vendor;
             string product = device.Product;
-            
+
             vendor = vendor != null ? vendor.Trim () : null;
             product = product != null ? product.Trim () : null;
 
             if (!String.IsNullOrEmpty (vendor) && !String.IsNullOrEmpty (product)) {
-                return new string [] { 
-                    String.Format ("multimedia-player-{0}-{1}", vendor, product).Replace (' ', '-').ToLower (), 
+                return new string [] {
+                    String.Format ("multimedia-player-{0}-{1}", vendor, product).Replace (' ', '-').ToLower (),
                     FallbackIcon
                 };
             } else {
                 return new string [] { FallbackIcon };
             }
         }
-        
+
         public static string FallbackIcon {
             get { return "multimedia-player"; }
         }
@@ -459,17 +458,17 @@ namespace Banshee.Dap
                 if (preferred_config != null) {
                     return preferred_config;
                 }
-            
+
                 MediaProfileManager manager = ServiceManager.MediaProfileManager;
                 if (manager == null) {
                     return null;
                 }
-        
+
                 preferred_config = manager.GetActiveProfileConfiguration (UniqueId, acceptable_mimetypes);
                 return preferred_config;
             }
         }
-        
+
         internal protected virtual bool CanHandleDeviceCommand (DeviceCommand command)
         {
             return false;
@@ -480,24 +479,24 @@ namespace Banshee.Dap
             get { return acceptable_mimetypes; }
             protected set { acceptable_mimetypes = value; }
         }
-       
+
         public long BytesVideo {
             get { return VideoGroupSource == null ? 0 : VideoGroupSource.BytesUsed; }
         }
-        
+
         public long BytesMusic {
             get { return MusicGroupSource == null ? 0 : MusicGroupSource.BytesUsed; }
         }
-                    
+
         public long BytesData {
             get { return BytesUsed - BytesVideo - BytesMusic; }
         }
-                    
+
         public long BytesReserved {
             get { return space_for_data.Get (); }
             set { space_for_data.Set (value); }
         }
-                    
+
         public override long BytesAvailable {
             get { return BytesCapacity - BytesUsed - Math.Max (0, BytesReserved - BytesData); }
         }
@@ -517,9 +516,9 @@ namespace Banshee.Dap
         public override bool PlaylistsReadOnly {
             get { return Sync.Enabled || IsReadOnly; }
         }
-            
+
         private Banshee.Configuration.SchemaEntry<long> space_for_data;
 #endregion
-        
+
     }
 }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
index 2293e79..64e7322 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
@@ -48,6 +48,15 @@ namespace Banshee.Dap
 {
     public sealed class DapSync : IDisposable
     {
+        // Get these strings in now, so we can use them after a string freeze
+        // Translators: {0} is the name of a library, eg 'Music' or 'Podcasts'
+        internal string reserved1 = Catalog.GetString ("{0}:");
+        internal string reserved2 = Catalog.GetString ("Manage manually");
+        internal string reserved3 = Catalog.GetString ("Sync entire library");
+        // Translators: {0} is the name of a playlist
+        internal string reserved4 = Catalog.GetString ("Sync from '{0}'");
+        internal string reserved5 = Catalog.GetString ("Sync when first plugged in and when the libraries change");
+
         private DapSource dap;
         private string conf_ns;
         private List<DapLibrarySync> library_syncs = new List<DapLibrarySync> ();
@@ -63,9 +72,9 @@ namespace Banshee.Dap
         internal string ConfigurationNamespace {
             get { return conf_ns; }
         }
-        
+
         #region Public Properites
-        
+
         public DapSource Dap {
             get { return dap; }
         }
@@ -73,11 +82,11 @@ namespace Banshee.Dap
         public IEnumerable<DapLibrarySync> LibrarySyncs {
             get { return library_syncs; }
         }
-        
+
         public bool Enabled {
             get { return !manually_manage.Get (); }
         }
-        
+
         public bool AutoSync {
             get { return Enabled && auto_sync.Get (); }
         }
@@ -85,9 +94,9 @@ namespace Banshee.Dap
         public IEnumerable<Section> PreferenceSections {
             get { return pref_sections; }
         }
-        
+
         #endregion
-        
+
         public DapSync (DapSource dapSource)
         {
             dap = dapSource;
@@ -116,7 +125,7 @@ namespace Banshee.Dap
                 Catalog.GetString ("Manually manage this device"),
                 Catalog.GetString ("Manually managing your device means you can drag and drop items onto the device, and manually remove them.")
             );
-            
+
             auto_sync = dap.CreateSchema<bool> (conf_ns, "auto_sync", false,
                 Catalog.GetString ("Automatically sync the device when plugged in or when the libraries change"),
                 Catalog.GetString ("Begin synchronizing the device as soon as the device is plugged in or the libraries change.")
@@ -129,10 +138,10 @@ namespace Banshee.Dap
             manually_manage_pref.ShowDescription = true;
             manually_manage_pref.ShowLabel = false;
             manually_manage_pref.ValueChanged += OnManuallyManageChanged;
-            
+
             auto_sync_pref = dap_prefs_section.Add (auto_sync);
             auto_sync_pref.ValueChanged += OnAutoSyncChanged;
-            
+
             //manually_manage_pref.Changed += OnEnabledChanged;
             //auto_sync_pref.Changed += delegate { OnUpdated (); };
             //OnEnabledChanged (null);
@@ -152,7 +161,7 @@ namespace Banshee.Dap
                 library_syncs.Add (library_sync);
                 pref_sections.Add (library_sync.PrefsSection);
                 library_sync.PrefsSection.Order = ++i;
-                
+
                 source.TracksAdded += OnLibraryChanged;
                 source.TracksDeleted += OnLibraryChanged;
             }
@@ -175,7 +184,7 @@ namespace Banshee.Dap
                 lib_sync.PrefsSection.Sensitive = sync_enabled;
             }
         }
-        
+
         private void OnAutoSyncChanged (Root preference)
         {
             OnUpdated ();
@@ -198,7 +207,7 @@ namespace Banshee.Dap
             if (!Enabled) {
                 return;
             }
-            
+
             foreach (DapLibrarySync lib_sync in library_syncs) {
                 if (lib_sync.Library == sender) {
                     if (AutoSync) {
@@ -218,11 +227,15 @@ namespace Banshee.Dap
                 sources.Sort (delegate (Source a, Source b) {
                     return a.Order.CompareTo (b.Order);
                 });
-    
+
                 if (!dap.SupportsVideo) {
                     sources.Remove (ServiceManager.SourceManager.VideoLibrary);
                 }
-                
+
+                if (!dap.SupportsPodcasts) {
+                    sources.RemoveAll (s => s.UniqueId == "PodcastSource-PodcastLibrary");
+                }
+
                 foreach (Source source in sources) {
                     if (source is LibrarySource) {
                         yield return source as LibrarySource;
@@ -230,19 +243,19 @@ namespace Banshee.Dap
                 }
             }
         }
-        
+
         public int ItemCount {
             get { return 0; }
         }
-        
+
         public long FileSize {
             get { return 0; }
         }
-        
+
         public TimeSpan Duration {
             get { return TimeSpan.Zero; }
         }
-        
+
         public void CalculateSync ()
         {
             foreach (DapLibrarySync library_sync in library_syncs) {
@@ -294,7 +307,7 @@ namespace Banshee.Dap
                     }
                 }
             }
-            
+
             if (sync_playlists) {
                 dap.RemovePlaylists ();
             }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/MediaGroupSource.cs b/src/Dap/Banshee.Dap/Banshee.Dap/MediaGroupSource.cs
index 324fa48..593ea92 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/MediaGroupSource.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/MediaGroupSource.cs
@@ -44,17 +44,17 @@ namespace Banshee.Dap
     public abstract class MediaGroupSource : SmartPlaylistSource
     {
         private DapSource parent;
-        
+
         public MediaGroupSource (DapSource parent, string name) : base (name, parent)
         {
             this.parent = parent;
-            
-            Properties.Set<Gtk.Widget> ("Nereid.SourceContents.FooterWidget", 
+
+            Properties.Set<Gtk.Widget> ("Nereid.SourceContents.FooterWidget",
                 parent.Properties.Get<Gtk.Widget> ("Nereid.SourceContents.FooterWidget"));
-            
+
             if (this is IPurchasedMusicSource) {
                 PurchasedMusicActions.Create ();
-                
+
                 Properties.Set<Assembly> ("ActiveSourceUIResource.Assembly", Assembly.GetExecutingAssembly ());
                 Properties.SetString ("ActiveSourceUIResource", "PurchasedMusicSourceUI.xml");
             }
@@ -65,18 +65,18 @@ namespace Banshee.Dap
             base.AfterInitialized ();
             Reload ();
         }
-        
+
         protected override void OnUpdated ()
         {
             base.OnUpdated ();
             if (parent != null) {
                 parent.RaiseUpdated ();
             }
-            
+
             if (AutoHide) {
                 bool contains_me = parent.ContainsChildSource (this);
                 int count = Count;
-                
+
                 if (count == 0 && contains_me) {
                     parent.RemoveChildSource (this);
                 } else if (count > 0 && !contains_me) {
@@ -89,29 +89,29 @@ namespace Banshee.Dap
         {
             return (source is DatabaseSource) && source.Parent != Parent && source != Parent;
         }*/
-        
+
         private bool auto_hide;
         public virtual bool AutoHide {
             get { return auto_hide; }
             set { auto_hide = value; }
         }
-        
+
         public override string ConditionSql {
             get { return base.ConditionSql; }
-            protected set { 
+            protected set {
                 base.ConditionSql = value;
                 Save ();
             }
         }
-        
+
         public override bool CanRename {
             get { return false; }
         }
-        
+
         public override bool CanUnmap {
             get { return false; }
         }
-        
+
         public override bool HasProperties {
             get { return false; }
         }
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs b/src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs
index 2cb1cb8..18581f4 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/RemovableSource.cs
@@ -54,6 +54,7 @@ namespace Banshee.Dap
 
             Order = 410;
             Properties.SetString ("UnmapSourceActionIconName", "media-eject");
+            Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Disconnect"));
             Properties.SetString ("GtkActionPath", "/RemovableSourceContextMenu");
             AfterInitialized ();
 
@@ -68,7 +69,6 @@ namespace Banshee.Dap
             set {
                 base.Name = value;
                 StorageName = value;
-                Properties.SetString ("UnmapSourceActionLabel", String.Format (Catalog.GetString ("Eject {0}"), value));
             }
         }
 
@@ -87,7 +87,11 @@ namespace Banshee.Dap
         public virtual bool CanImport {
             get { return true; }
         }
-        
+
+        string IImportSource.ImportLabel {
+            get { return null; }
+        }
+
         int IImportSource.SortOrder {
             get { return 20; }
         }
@@ -100,22 +104,22 @@ namespace Banshee.Dap
             if (track != null && track.PrimarySourceId == this.DbId) {
                 ServiceManager.PlayerEngine.Close ();
             }
-            
-            SetStatus (String.Format (Catalog.GetString ("Ejecting {0}..."), GenericName), false);
-        
+
+            SetStatus (String.Format (Catalog.GetString ("Disconnecting {0}..."), GenericName), false);
+
             ThreadPool.QueueUserWorkItem (delegate {
                 try {
                     Eject ();
                 } catch (Exception e) {
                     ThreadAssist.ProxyToMain (delegate {
-                        SetStatus (String.Format (Catalog.GetString ("Could not eject {0}: {1}"),
+                        SetStatus (String.Format (Catalog.GetString ("Could not disconnect {0}: {1}"),
                             GenericName, e.Message), true);
                     });
-                    
+
                     Log.Exception (e);
                 }
             });
-            
+
             return true;
         }
 
@@ -142,7 +146,7 @@ namespace Banshee.Dap
         }
 
         public abstract bool IsReadOnly { get; }
-        
+
         public abstract long BytesUsed { get; }
         public abstract long BytesCapacity { get; }
         public virtual long BytesAvailable {
diff --git a/src/Dap/Banshee.Dap/Makefile.in b/src/Dap/Banshee.Dap/Makefile.in
index 16b9fdf..5bf138a 100644
--- a/src/Dap/Banshee.Dap/Makefile.in
+++ b/src/Dap/Banshee.Dap/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -391,6 +400,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -494,11 +504,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -516,6 +527,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -545,6 +557,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -564,14 +577,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Banshee.Dap/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Banshee.Dap/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Banshee.Dap/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -589,25 +602,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -637,13 +666,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -675,6 +708,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -695,6 +729,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -703,18 +739,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -775,7 +821,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -792,6 +838,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Dap/Makefile.in b/src/Dap/Makefile.in
index 2450a26..cf751e7 100644
--- a/src/Dap/Makefile.in
+++ b/src/Dap/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -361,14 +378,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Dap/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Dap/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dap/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Dap/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -386,6 +403,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -417,7 +435,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -451,16 +469,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -468,14 +486,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -487,7 +505,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -496,29 +514,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -539,29 +562,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -591,6 +629,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -610,6 +649,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -618,18 +659,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -650,8 +701,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -672,6 +723,7 @@ run:
 	@pushd $(top_builddir); \
 	make run; \
 	popd;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs
index 22da746..24b6972 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDiscModel.cs
@@ -46,45 +46,45 @@ namespace Banshee.AudioCd
     {
         // 44.1 kHz sample rate * 16 bit channel resolution * 2 channels (stereo)
         private const long PCM_FACTOR = 176400;
-    
+
         private IDiscVolume volume;
-        
+
         public event EventHandler MetadataQueryStarted;
         public event EventHandler MetadataQueryFinished;
         public event EventHandler EnabledCountChanged;
-        
+
         private bool metadata_query_success;
         private DateTime metadata_query_start_time;
-        
+
         public bool MetadataQuerySuccess {
             get { return metadata_query_success; }
         }
-        
+
         private TimeSpan duration;
         public TimeSpan Duration {
             get { return duration; }
         }
-        
+
         private long file_size;
         public long FileSize {
             get { return file_size; }
         }
-        
+
         public AudioCdDiscModel (IDiscVolume volume)
         {
             this.volume = volume;
             disc_title = Catalog.GetString ("Audio CD");
         }
-        
+
         public void NotifyUpdated ()
         {
             OnReloaded ();
         }
-        
+
         public void LoadModelFromDisc ()
         {
             Clear ();
-        
+
             LocalDisc mb_disc = LocalDisc.GetFromDevice (volume.DeviceNode);
             if (mb_disc == null) {
                 throw new ApplicationException ("Could not read contents of the disc. Platform may not be supported.");
@@ -102,47 +102,47 @@ namespace Banshee.AudioCd
                 track.TrackTitle = String.Format (Catalog.GetString ("Track {0}"), track.TrackNumber);
                 track.FileSize = PCM_FACTOR * (uint)track.Duration.TotalSeconds;
                 Add (track);
-                
+
                 duration += track.Duration;
                 file_size += track.FileSize;
             }
-            
+
             EnabledCount = Count;
-            
+
             Reload ();
-            
+
             ThreadPool.QueueUserWorkItem (LoadDiscMetadata, mb_disc);
         }
-        
+
         private void LoadDiscMetadata (object state)
         {
             try {
                 LocalDisc mb_disc = (LocalDisc)state;
-                
+
                 OnMetadataQueryStarted (mb_disc);
-                
+
                 Release release = Release.Query (mb_disc).PerfectMatch ();
-    
+
                 var tracks = release.GetTracks ();
                 if (release == null || tracks.Count != Count) {
                     OnMetadataQueryFinished (false);
                     return;
                 }
-                            
+
                 disc_title = release.GetTitle ();
-                
+
                 int disc_number = 1;
                 int i = 0;
-                
+
                 foreach (Disc disc in release.GetDiscs ()) {
                     i++;
                     if (disc.Id == mb_disc.Id) {
                         disc_number = i;
                     }
                 }
-                
+
                 DateTime release_date = DateTime.MaxValue;
-     
+
                 foreach (Event release_event in release.GetEvents ()) {
                     if (release_event.Date != null) {
                         try {
@@ -152,7 +152,7 @@ namespace Banshee.AudioCd
                                 date_str.Length > 4 ? date_str : date_str + "-01",
                                 ApplicationContext.InternalCultureInfo
                             );
-    
+
                             if (date < release_date) {
                                 release_date = date;
                             }
@@ -160,46 +160,46 @@ namespace Banshee.AudioCd
                         }
                     }
                 }
-                
+
                 DatabaseArtistInfo artist = new DatabaseArtistInfo ();
                 var mb_artist = release.GetArtist ();
                 artist.Name = mb_artist.GetName ();
                 artist.NameSort = mb_artist.GetSortName ();
                 artist.MusicBrainzId = mb_artist.Id;
                 bool is_compilation = false;
-                
+
                 DatabaseAlbumInfo album = new DatabaseAlbumInfo ();
                 album.Title = disc_title;
                 album.ArtistName = artist.Name;
                 album.MusicBrainzId = release.Id;
                 album.ReleaseDate = release_date == DateTime.MaxValue ? DateTime.MinValue : release_date;
-                
+
                 i = 0;
                 foreach (Track track in tracks) {
                     AudioCdTrackInfo model_track = (AudioCdTrackInfo)this[i++];
                     var mb_track_artist = track.GetArtist ();
-                    
+
                     model_track.MusicBrainzId = track.Id;
                     model_track.TrackTitle = track.GetTitle ();
                     model_track.ArtistName = mb_track_artist.GetName ();
                     model_track.AlbumTitle = disc_title;
                     model_track.DiscNumber = disc_number;
                     model_track.Album = album;
-    
+
                     model_track.Artist = new DatabaseArtistInfo ();
                     model_track.Artist.Name = model_track.ArtistName;
                     model_track.Artist.NameSort = mb_track_artist.GetSortName ();
                     model_track.Artist.MusicBrainzId = mb_track_artist.Id;
-                    
+
                     if (release_date != DateTime.MinValue) {
                         model_track.Year = release_date.Year;
                     }
-    
+
                     if (!is_compilation && mb_track_artist.Id != artist.MusicBrainzId) {
                         is_compilation = true;
                     }
                 }
-    
+
                 if (is_compilation) {
                     album.IsCompilation = true;
                     for (i = 0; i < tracks.Count; i++) {
@@ -209,44 +209,44 @@ namespace Banshee.AudioCd
                         model_track.AlbumArtistSort = artist.NameSort;
                     }
                 }
-                
+
                 OnMetadataQueryFinished (true);
             } catch (Exception ex) {
                 Log.DebugException (ex);
                 OnMetadataQueryFinished (false);
             }
         }
-        
+
         private void OnMetadataQueryStarted (LocalDisc mb_disc)
         {
             metadata_query_success = false;
             metadata_query_start_time = DateTime.Now;
             Log.InformationFormat ("Querying MusicBrainz for Disc Release ({0})", mb_disc.Id);
-        
-            ThreadAssist.ProxyToMain (delegate { 
+
+            ThreadAssist.ProxyToMain (delegate {
                 EventHandler handler = MetadataQueryStarted;
                 if (handler != null) {
                     handler (this, EventArgs.Empty);
                 }
             });
         }
-        
+
         private void OnMetadataQueryFinished (bool success)
         {
             metadata_query_success = success;
-            Log.InformationFormat ("Query finished (success: {0}, {1} seconds)", 
+            Log.InformationFormat ("Query finished (success: {0}, {1} seconds)",
                 success, (DateTime.Now - metadata_query_start_time).TotalSeconds);
-            
+
             ThreadAssist.ProxyToMain (delegate {
                 Reload ();
-                
+
                 EventHandler handler = MetadataQueryFinished;
                 if (handler != null) {
                     handler (this, EventArgs.Empty);
                 }
             });
         }
-        
+
         private void OnEnabledCountChanged ()
         {
             EventHandler handler = EnabledCountChanged;
@@ -254,45 +254,45 @@ namespace Banshee.AudioCd
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         private ICdromDevice Drive {
             get { return Volume == null ? null : (Volume.Parent as ICdromDevice); }
         }
-        
+
         public bool LockDoor ()
         {
             ICdromDevice drive = Drive;
             return drive != null ? drive.LockDoor () : false;
         }
-        
+
         public bool UnlockDoor ()
         {
             ICdromDevice drive = Drive;
             return drive != null ? drive.UnlockDoor () : false;
         }
-        
+
         public bool IsDoorLocked {
-            get { 
+            get {
                 ICdromDevice drive = Drive;
                 return drive != null ? drive.IsDoorLocked : false;
             }
         }
-        
+
         public IDiscVolume Volume {
             get { return volume; }
         }
-        
+
         private string disc_title;
         public string Title {
             get { return disc_title; }
         }
-        
+
         private int enabled_count;
         public int EnabledCount {
             get { return enabled_count; }
-            internal set { 
-                enabled_count = value; 
-                OnEnabledCountChanged (); 
+            internal set {
+                enabled_count = value;
+                OnEnabledCountChanged ();
             }
         }
     }
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs
index 8390531..6cc8dd9 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdDuplicator.cs
@@ -37,25 +37,25 @@ namespace Banshee.AudioCd
     {
         private static bool duplicator_extension_queried = false;
         private static TypeExtensionNode duplicator_extension_node = null;
-        
+
         public static bool Supported {
-            get { 
+            get {
                 if (duplicator_extension_queried) {
                     return duplicator_extension_node != null;
                 }
-                
+
                 duplicator_extension_queried = true;
-                
+
                 foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
                     "/Banshee/Platform/DiscDuplicator")) {
                     duplicator_extension_node = node;
                     break;
                 }
-                
+
                 return duplicator_extension_node != null;
             }
         }
-        
+
         public static void Duplicate (AudioCdDiscModel model)
         {
             if (Supported && model != null && model.Volume != null) {
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
index 370a4ab..b7dde94 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
@@ -46,45 +46,45 @@ namespace Banshee.AudioCd
     {
         private static bool ripper_extension_queried = false;
         private static TypeExtensionNode ripper_extension_node = null;
-        
+
         public static bool Supported {
-            get { 
+            get {
                 if (ripper_extension_queried) {
                     return ripper_extension_node != null;
                 }
-                
+
                 ripper_extension_queried = true;
-                
+
                 foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes (
                     "/Banshee/MediaEngine/AudioCdRipper")) {
                     ripper_extension_node = node;
                     break;
                 }
-                
+
                 return ripper_extension_node != null;
             }
         }
 
         public event EventHandler Finished;
-        
+
         // State that does real work
         private IAudioCdRipper ripper;
         private AudioCdSource source;
         private UserJob user_job;
-        
+
         // State to process the rip operation
         private Queue<AudioCdTrackInfo> queue = new Queue<AudioCdTrackInfo> ();
-        
+
         private TimeSpan ripped_duration;
         private TimeSpan total_duration;
         private int track_index;
-        
+
         // State to compute/display the rip speed (i.e. 24x)
         private TimeSpan last_speed_poll_duration;
         private DateTime last_speed_poll_time;
         private double last_speed_poll_factor;
         private string status;
-        
+
         public AudioCdRipper (AudioCdSource source)
         {
             if (ripper_extension_node != null) {
@@ -95,12 +95,12 @@ namespace Banshee.AudioCd
             } else {
                 throw new ApplicationException ("No AudioCdRipper extension is installed");
             }
-            
+
             this.source = source;
         }
-        
+
         public void Start ()
-        {   
+        {
             ResetState ();
 
             foreach (AudioCdTrackInfo track in source.DiscModel) {
@@ -109,14 +109,14 @@ namespace Banshee.AudioCd
                     queue.Enqueue (track);
                 }
             }
-            
+
             if (queue.Count == 0) {
                 return;
             }
 
             source.LockAllTracks ();
-                                                
-            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"), 
+
+            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"),
                 Catalog.GetString ("Initializing Drive"), "media-import-audio-cd");
             user_job.CancelMessage = String.Format (Catalog.GetString (
                 "<i>{0}</i> is still being imported into the music library. Would you like to stop it?"
@@ -127,37 +127,37 @@ namespace Banshee.AudioCd
             user_job.CancelRequested += OnCancelRequested;
             user_job.Finished += OnFinished;
             user_job.Register ();
-            
+
             if (source != null && source.DiscModel != null) {
                 if (!source.DiscModel.LockDoor ()) {
                     Hyena.Log.Warning ("Could not lock CD-ROM door", false);
                 }
             }
-            
+
             ripper.Begin (source.DiscModel.Volume.DeviceNode, AudioCdService.ErrorCorrection.Get ());
-            
+
             RipNextTrack ();
         }
-        
+
         public void Dispose ()
         {
             ResetState ();
-            
+
             if (source != null && source.DiscModel != null) {
                 source.DiscModel.UnlockDoor ();
             }
-                            
+
             if (ripper != null) {
                 ripper.Finish ();
                 ripper = null;
             }
-            
+
             if (user_job != null) {
                 user_job.Finish ();
                 user_job = null;
             }
         }
-        
+
         private void ResetState ()
         {
             track_index = 0;
@@ -169,7 +169,7 @@ namespace Banshee.AudioCd
             status = null;
             queue.Clear ();
         }
-        
+
         private void RipNextTrack ()
         {
             if (queue.Count == 0) {
@@ -177,14 +177,14 @@ namespace Banshee.AudioCd
                 Dispose ();
                 return;
             }
-            
+
             AudioCdTrackInfo track = queue.Dequeue ();
 
-            user_job.Title = String.Format (Catalog.GetString ("Importing {0} of {1}"), 
+            user_job.Title = String.Format (Catalog.GetString ("Importing {0} of {1}"),
                 ++track_index, source.DiscModel.EnabledCount);
             status = String.Format("{0} - {1}", track.ArtistName, track.TrackTitle);
             user_job.Status = status;
-            
+
             SafeUri uri = new SafeUri (FileNamePattern.BuildFull (ServiceManager.SourceManager.MusicLibrary.BaseDirectory, track, null));
             bool tagging_supported;
             ripper.RipTrack (track.IndexOnDisc, track, uri, out tagging_supported);
@@ -197,50 +197,50 @@ namespace Banshee.AudioCd
             if (user_job == null || ripper == null) {
                 return;
             }
-        
+
             AudioCdTrackInfo track = (AudioCdTrackInfo)args.Track;
-        
+
             ripped_duration += track.Duration;
             track.PrimarySource = ServiceManager.SourceManager.MusicLibrary;
             track.Uri = args.Uri;
-            
+
             track.FileSize = Banshee.IO.File.GetSize (track.Uri);
             track.FileModifiedStamp = Banshee.IO.File.GetModifiedTime (track.Uri);
             track.LastSyncedStamp = DateTime.Now;
-            
+
             track.Save ();
 
             source.UnlockTrack (track);
             RipNextTrack ();
         }
-        
+
         private void OnProgress (object o, AudioCdRipperProgressArgs args)
         {
             if (user_job == null) {
                 return;
             }
-        
+
             TimeSpan total_ripped_duration = ripped_duration + args.EncodedTime;
             user_job.Progress = total_ripped_duration.TotalMilliseconds / total_duration.TotalMilliseconds;
-            
+
             TimeSpan poll_diff = DateTime.Now - last_speed_poll_time;
             double factor = 0;
-            
+
             if (poll_diff.TotalMilliseconds >= 1000) {
-                factor = ((total_ripped_duration - last_speed_poll_duration).TotalMilliseconds 
+                factor = ((total_ripped_duration - last_speed_poll_duration).TotalMilliseconds
                     * (poll_diff.TotalMilliseconds / 1000.0)) / 1000.0;
-                
+
                 last_speed_poll_duration = total_ripped_duration;
                 last_speed_poll_time = DateTime.Now;
                 last_speed_poll_factor = factor > 1 ? factor : 0;
             }
-            
+
             // Make sure the speed factor is between 1 and 200 to allow it to ramp and settle
-            user_job.Status = last_speed_poll_factor > 1 && last_speed_poll_factor <= 200 
-                ? String.Format ("{0} ({1:0.0}x)", status, last_speed_poll_factor) 
+            user_job.Status = last_speed_poll_factor > 1 && last_speed_poll_factor <= 200
+                ? String.Format ("{0} ({1:0.0}x)", status, last_speed_poll_factor)
                 : status;
         }
-        
+
         private void OnError (object o, AudioCdRipperErrorArgs args)
         {
             Dispose ();
@@ -256,14 +256,14 @@ namespace Banshee.AudioCd
                 handler (this, EventArgs.Empty);
             }
         }
-                                
-#region User Job Event Handlers        
-        
+
+#region User Job Event Handlers
+
         private void OnCancelRequested (object o, EventArgs args)
         {
             Dispose ();
         }
-        
+
         private void OnFinished (object o, EventArgs args)
         {
             if (user_job != null) {
@@ -271,10 +271,10 @@ namespace Banshee.AudioCd
                 user_job.Finished -= OnFinished;
                 user_job = null;
             }
-            
+
             source.UnlockAllTracks ();
         }
-        
+
 #endregion
 
     }
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
index 3ba371c..d8eb5cc 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdService.cs
@@ -47,51 +47,51 @@ namespace Banshee.AudioCd
         private SourcePage pref_page;
         private Section pref_section;
         private uint global_interface_id;
-        
+
         public AudioCdService ()
         {
         }
-        
+
         public void Initialize ()
         {
             lock (this) {
                 InstallPreferences ();
-            
+
                 sources = new Dictionary<string, AudioCdSource> ();
-                
+
                 foreach (ICdromDevice device in ServiceManager.HardwareManager.GetAllCdromDevices ()) {
                     MapCdromDevice (device);
                 }
-                
+
                 ServiceManager.HardwareManager.DeviceAdded += OnHardwareDeviceAdded;
                 ServiceManager.HardwareManager.DeviceRemoved += OnHardwareDeviceRemoved;
                 ServiceManager.HardwareManager.DeviceCommand += OnDeviceCommand;
-                
+
                 SetupActions ();
             }
         }
-        
+
         public void Dispose ()
         {
             lock (this) {
                 UninstallPreferences ();
-            
+
                 ServiceManager.HardwareManager.DeviceAdded -= OnHardwareDeviceAdded;
                 ServiceManager.HardwareManager.DeviceRemoved -= OnHardwareDeviceRemoved;
                 ServiceManager.HardwareManager.DeviceCommand -= OnDeviceCommand;
-                
+
                 foreach (AudioCdSource source in sources.Values) {
                     source.Dispose ();
                     ServiceManager.SourceManager.RemoveSource (source);
                 }
-                
+
                 sources.Clear ();
                 sources = null;
-                
+
                 DisposeActions ();
             }
         }
-        
+
         private void MapCdromDevice (ICdromDevice device)
         {
             lock (this) {
@@ -102,7 +102,7 @@ namespace Banshee.AudioCd
                 }
             }
         }
-        
+
         private void MapDiscVolume (IDiscVolume volume)
         {
             lock (this) {
@@ -129,12 +129,12 @@ namespace Banshee.AudioCd
                     } catch (Exception e) {
                         Log.Exception (e);
                     }
-                    
+
                     Log.DebugFormat ("Mapping audio CD ({0})", volume.Uuid);
                 }
             }
         }
-        
+
         internal void UnmapDiscVolume (string uuid)
         {
             lock (this) {
@@ -147,7 +147,7 @@ namespace Banshee.AudioCd
                 }
             }
         }
-        
+
         private void OnHardwareDeviceAdded (object o, DeviceAddedArgs args)
         {
             lock (this) {
@@ -158,14 +158,14 @@ namespace Banshee.AudioCd
                 }
             }
         }
-        
+
         private void OnHardwareDeviceRemoved (object o, DeviceRemovedArgs args)
         {
             lock (this) {
                 UnmapDiscVolume (args.DeviceUuid);
             }
         }
-        
+
 #region DeviceCommand Handling
 
         private bool DeviceCommandMatchesSource (AudioCdSource source, DeviceCommand command)
@@ -173,14 +173,14 @@ namespace Banshee.AudioCd
             if (command.DeviceId.StartsWith ("cdda:")) {
                 try {
                     Uri uri = new Uri (command.DeviceId);
-                    string match_device_node = String.Format ("{0}{1}", uri.Host, 
+                    string match_device_node = String.Format ("{0}{1}", uri.Host,
                         uri.AbsolutePath).TrimEnd ('/', '\\');
                     string device_node = source.DiscModel.Volume.DeviceNode;
                     return device_node.EndsWith (match_device_node);
                 } catch {
                 }
             }
-            
+
             return false;
         }
 
@@ -197,7 +197,7 @@ namespace Banshee.AudioCd
                 }
             }
         }
-        
+
         private void OnDeviceCommand (object o, DeviceCommand command)
         {
             lock (this) {
@@ -209,96 +209,96 @@ namespace Banshee.AudioCd
                         return;
                     }
                 }
-                
+
                 if (unhandled_device_commands == null) {
                     unhandled_device_commands = new List<DeviceCommand> ();
                 }
                 unhandled_device_commands.Add (command);
             }
         }
-        
+
 #endregion
 
-#region Preferences        
-        
+#region Preferences
+
         private void InstallPreferences ()
         {
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null) {
                 return;
             }
-            
+
             service.InstallWidgetAdapters += OnPreferencesServiceInstallWidgetAdapters;
-            
+
             pref_page = new Banshee.Preferences.SourcePage ("audio-cd", Catalog.GetString ("Audio CDs"), "media-cdrom", 400);
-            
+
             pref_section = pref_page.Add (new Section ("audio-cd", Catalog.GetString ("Audio CD Importing"), 20));
             pref_section.ShowLabel = false;
 
             pref_section.Add (new VoidPreference ("import-profile",  Catalog.GetString ("_Import format")));
             pref_section.Add (new VoidPreference ("import-profile-desc"));
 
-            pref_section.Add (new SchemaPreference<bool> (AutoRip, 
+            pref_section.Add (new SchemaPreference<bool> (AutoRip,
                 Catalog.GetString ("_Automatically import audio CDs when inserted"),
                 Catalog.GetString ("When an audio CD is inserted, automatically begin importing it " +
                     "if metadata can be found and it is not already in the library.")));
 
-            pref_section.Add (new SchemaPreference<bool> (EjectAfterRipped, 
+            pref_section.Add (new SchemaPreference<bool> (EjectAfterRipped,
                 Catalog.GetString ("_Eject when done importing"),
                 Catalog.GetString ("When an audio CD has been imported, automatically eject it.")));
-            
-            pref_section.Add (new SchemaPreference<bool> (ErrorCorrection, 
+
+            pref_section.Add (new SchemaPreference<bool> (ErrorCorrection,
                 Catalog.GetString ("Use error correction when importing"),
                 Catalog.GetString ("Error correction tries to work around problem areas on a disc, such " +
                     "as surface scratches, but will slow down importing substantially.")));
         }
-        
+
         private void UninstallPreferences ()
         {
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null || pref_page == null) {
                 return;
             }
-            
+
             service.InstallWidgetAdapters -= OnPreferencesServiceInstallWidgetAdapters;
-            
+
             pref_page.Dispose ();
             pref_page = null;
             pref_section = null;
         }
-        
+
         private void OnPreferencesServiceInstallWidgetAdapters (object o, EventArgs args)
         {
             if (pref_section == null) {
                 return;
             }
-            
+
             Gtk.HBox description_box = new Gtk.HBox ();
-            Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable chooser 
-                = new Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable (ServiceManager.MediaProfileManager, 
+            Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable chooser
+                = new Banshee.MediaProfiles.Gui.ProfileComboBoxConfigurable (ServiceManager.MediaProfileManager,
                     "cd-importing", description_box);
-            
+
             pref_section["import-profile"].DisplayWidget = chooser;
             pref_section["import-profile"].MnemonicWidget = chooser.Combo;
             pref_section["import-profile-desc"].DisplayWidget = description_box;
         }
-        
+
         public static readonly SchemaEntry<bool> ErrorCorrection = new SchemaEntry<bool> (
-            "import", "audio_cd_error_correction", 
+            "import", "audio_cd_error_correction",
             false,
             "Enable error correction",
             "When importing an audio CD, enable error correction (paranoia mode)"
         );
 
         public static readonly SchemaEntry<bool> AutoRip = new SchemaEntry<bool> (
-            "import", "auto_rip_cds", 
+            "import", "auto_rip_cds",
             false,
             "Enable audio CD auto ripping",
             "When an audio CD is inserted, automatically begin ripping it."
         );
 
         public static readonly SchemaEntry<bool> EjectAfterRipped = new SchemaEntry<bool> (
-            "import", "eject_after_ripped", 
+            "import", "eject_after_ripped",
             false,
             "Eject audio CD after ripped",
             "After an audio CD has been ripped, automatically eject it."
@@ -314,14 +314,14 @@ namespace Banshee.AudioCd
             if (uia_service == null) {
                 return;
             }
-            
+
             uia_service.GlobalActions.AddImportant (new Gtk.ActionEntry [] {
                 new Gtk.ActionEntry ("RipDiscAction", null,
                     Catalog.GetString ("Import CD"), null,
                     Catalog.GetString ("Import this audio CD to the library"),
                     OnImportDisc)
             });
-            
+
             uia_service.GlobalActions.AddImportant (
                 new Gtk.ActionEntry ("DuplicateDiscAction", null,
                     Catalog.GetString ("Duplicate CD"), null,
@@ -331,14 +331,14 @@ namespace Banshee.AudioCd
 
             global_interface_id = uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
         }
-        
+
         private void DisposeActions ()
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             uia_service.GlobalActions.Remove ("RipDiscAction");
             uia_service.GlobalActions.Remove ("DuplicateDiscAction");
             uia_service.UIManager.RemoveUi (global_interface_id);
@@ -348,19 +348,19 @@ namespace Banshee.AudioCd
         {
             ImportOrDuplicateDisc (true);
         }
-        
+
         private void OnDuplicateDisc (object o, EventArgs args)
         {
             ImportOrDuplicateDisc (false);
         }
-        
+
         private void ImportOrDuplicateDisc (bool import)
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             AudioCdSource source = uia_service.SourceActions.ActionSource as AudioCdSource;
             if (source != null) {
                 if (import) {
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
index fdbab2c..ab14347 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
@@ -44,21 +44,21 @@ using Banshee.Gui;
 
 namespace Banshee.AudioCd
 {
-    public class AudioCdSource : Source, ITrackModelSource, IUnmapableSource, 
+    public class AudioCdSource : Source, ITrackModelSource, IUnmapableSource,
         IImportSource, IDurationAggregator, IFileSizeAggregator, IDisposable
     {
         private AudioCdService service;
         private AudioCdDiscModel disc_model;
         private SourceMessage query_message;
 
-        public AudioCdSource (AudioCdService service, AudioCdDiscModel discModel) 
+        public AudioCdSource (AudioCdService service, AudioCdDiscModel discModel)
             : base (Catalog.GetString ("Audio CD"), discModel.Title, 400)
         {
             this.service = service;
             this.disc_model = discModel;
 
             TypeUniqueId = "";
-            
+
             Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
                 <column-controller>
                   <column>
@@ -67,7 +67,7 @@ namespace Banshee.AudioCd
                   <add-all-defaults />
                 </column-controller>
             "));
-            
+
             disc_model.MetadataQueryStarted += OnMetadataQueryStarted;
             disc_model.MetadataQueryFinished += OnMetadataQueryFinished;
             disc_model.EnabledCountChanged += OnEnabledCountChanged;
@@ -75,29 +75,29 @@ namespace Banshee.AudioCd
 
             SetupGui ();
         }
-        
+
         public TimeSpan Duration {
             get { return disc_model.Duration; }
         }
-        
+
         public long FileSize {
             get { return disc_model.FileSize; }
         }
-        
+
         public bool DiscIsPlaying {
             get {
                 AudioCdTrackInfo playing_track = ServiceManager.PlayerEngine.CurrentTrack as AudioCdTrackInfo;
                 return playing_track != null && playing_track.Model == disc_model;
             }
         }
-        
+
         public void StopPlayingDisc ()
         {
             if (DiscIsPlaying) {
                 ServiceManager.PlayerEngine.Close (true);
             }
         }
-        
+
         public void Dispose ()
         {
             ClearMessages ();
@@ -107,39 +107,39 @@ namespace Banshee.AudioCd
             service = null;
             disc_model = null;
         }
-        
+
         public AudioCdDiscModel DiscModel {
             get { return disc_model; }
         }
-        
+
         private void OnEnabledCountChanged (object o, EventArgs args)
         {
             UpdateActions ();
         }
-        
+
         private void OnMetadataQueryStarted (object o, EventArgs args)
         {
             if (query_message != null) {
                 DestroyQueryMessage ();
             }
-            
+
             query_message = new SourceMessage (this);
             query_message.FreezeNotify ();
             query_message.CanClose = false;
             query_message.IsSpinning = true;
             query_message.Text = Catalog.GetString ("Searching for CD metadata...");
             query_message.ThawNotify ();
-            
+
             PushMessage (query_message);
         }
-        
+
         private void OnMetadataQueryFinished (object o, EventArgs args)
         {
             if (disc_model.Title != Name) {
                 Name = disc_model.Title;
                 OnUpdated ();
             }
-        
+
             if (disc_model.MetadataQuerySuccess) {
                 DestroyQueryMessage ();
                 if (DiscIsPlaying) {
@@ -156,7 +156,7 @@ namespace Banshee.AudioCd
             if (query_message == null) {
                 return;
             }
-            
+
             query_message.FreezeNotify ();
             query_message.IsSpinning = false;
             query_message.SetIconName ("dialog-error");
@@ -164,7 +164,7 @@ namespace Banshee.AudioCd
             query_message.CanClose = true;
             query_message.ThawNotify ();
         }
-        
+
         private void DestroyQueryMessage ()
         {
             if (query_message != null) {
@@ -178,10 +178,10 @@ namespace Banshee.AudioCd
             // Make sure the album isn't already in the Library
             TrackInfo track = disc_model[0];
             int count = ServiceManager.DbConnection.Query<int> (
-                @"SELECT Count(*) FROM CoreTracks, CoreArtists, CoreAlbums WHERE 
+                @"SELECT Count(*) FROM CoreTracks, CoreArtists, CoreAlbums WHERE
                     CoreTracks.PrimarySourceID = ? AND
-                    CoreTracks.ArtistID = CoreArtists.ArtistID AND 
-                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND 
+                    CoreTracks.ArtistID = CoreArtists.ArtistID AND
+                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND
                     CoreArtists.Name = ? AND CoreAlbums.Title = ? AND (CoreTracks.Disc = ? OR CoreTracks.Disc = 0)",
                     ServiceManager.SourceManager.MusicLibrary.DbId,
                     track.ArtistName, track.AlbumTitle, track.DiscNumber
@@ -199,7 +199,7 @@ namespace Banshee.AudioCd
         internal void ImportDisc ()
         {
             AudioCdRipper ripper = null;
-            
+
             try {
                 if (AudioCdRipper.Supported) {
                     ripper = new AudioCdRipper (this);
@@ -210,7 +210,7 @@ namespace Banshee.AudioCd
                 if (ripper != null) {
                     ripper.Dispose ();
                 }
-                
+
                 Log.Error (Catalog.GetString ("Could not import CD"), e.Message, true);
                 Log.Exception (e);
             }
@@ -232,27 +232,27 @@ namespace Banshee.AudioCd
                 Hyena.Log.Exception (e);
             }
         }
-        
+
         internal void LockAllTracks ()
         {
             StopPlayingDisc ();
-        
+
             foreach (AudioCdTrackInfo track in disc_model) {
                 track.CanPlay = false;
             }
-            
+
             disc_model.NotifyUpdated ();
         }
-        
+
         internal void UnlockAllTracks ()
         {
             foreach (AudioCdTrackInfo track in disc_model) {
                 track.CanPlay = true;
             }
-            
+
             disc_model.NotifyUpdated ();
         }
-        
+
         internal void UnlockTrack (AudioCdTrackInfo track)
         {
             track.CanPlay = true;
@@ -276,9 +276,9 @@ namespace Banshee.AudioCd
         public override bool HasViewableTrackProperties {
             get { return true; }
         }
-        
+
 #endregion
-        
+
 #region ITrackModelSource Implementation
 
         public TrackListModel TrackModel {
@@ -333,7 +333,7 @@ namespace Banshee.AudioCd
         public bool ShowBrowser {
             get { return false; }
         }
-        
+
         public bool HasDependencies {
             get { return false; }
         }
@@ -349,13 +349,13 @@ namespace Banshee.AudioCd
         public bool Unmap ()
         {
             StopPlayingDisc ();
-            
+
             foreach (TrackInfo track in disc_model) {
                 track.CanPlay = false;
             }
-            
+
             OnUpdated ();
-            
+
             SourceMessage eject_message = new SourceMessage (this);
             eject_message.FreezeNotify ();
             eject_message.IsSpinning = true;
@@ -363,12 +363,12 @@ namespace Banshee.AudioCd
             eject_message.Text = Catalog.GetString ("Ejecting audio CD...");
             eject_message.ThawNotify ();
             PushMessage (eject_message);
-        
+
             ThreadPool.QueueUserWorkItem (delegate {
                 try {
                     disc_model.Volume.Unmount ();
                     disc_model.Volume.Eject ();
-                    
+
                     ThreadAssist.ProxyToMain (delegate {
                         service.UnmapDiscVolume (disc_model.Volume.Uuid);
                         Dispose ();
@@ -380,17 +380,17 @@ namespace Banshee.AudioCd
                         eject_message.SetIconName ("dialog-error");
                         eject_message.Text = String.Format (Catalog.GetString ("Could not eject audio CD: {0}"), e.Message);
                         PushMessage (eject_message);
-                        
+
                         foreach (TrackInfo track in disc_model) {
                             track.CanPlay = true;
                         }
                         OnUpdated ();
                     });
-                    
+
                     Log.Exception (e);
                 }
             });
-            
+
             return true;
         }
 
@@ -409,31 +409,31 @@ namespace Banshee.AudioCd
         private bool actions_loaded = false;
 
         private void SetupGui ()
-        {                                       
+        {
             Properties.SetStringList ("Icon.Name", "media-cdrom", "gnome-dev-cdrom-audio", "source-cd-audio");
             Properties.SetString ("SourcePreferencesActionLabel", Catalog.GetString ("Audio CD Preferences"));
             Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Eject Disc"));
             Properties.SetString ("UnmapSourceActionIconName", "media-eject");
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.SetString ("GtkActionPath", "/AudioCdContextMenu");
-            
+
             actions_loaded = true;
-            
+
             UpdateActions ();
         }
-        
+
         private void UpdateActions ()
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             Gtk.Action rip_action = uia_service.GlobalActions["RipDiscAction"];
             if (rip_action != null) {
                 string title = disc_model.Title;
                 int max_title_length = 20;
-                title = title.Length > max_title_length 
+                title = title.Length > max_title_length
                     ? String.Format ("{0}\u2026", title.Substring (0, max_title_length).Trim ())
                     : title;
                 rip_action.Label = String.Format (Catalog.GetString ("Import \u201f{0}\u201d"), title);
@@ -441,23 +441,23 @@ namespace Banshee.AudioCd
                 rip_action.IconName = "media-import-audio-cd";
                 rip_action.Sensitive = AudioCdRipper.Supported && disc_model.EnabledCount > 0;
             }
-            
+
             Gtk.Action duplicate_action = uia_service.GlobalActions["DuplicateDiscAction"];
             if (duplicate_action != null) {
                 duplicate_action.IconName = "media-cdrom";
                 duplicate_action.Visible = AudioCdDuplicator.Supported;
             }
         }
-        
+
         protected override void OnUpdated ()
         {
             if (actions_loaded) {
                 UpdateActions ();
             }
-            
+
             base.OnUpdated ();
         }
-        
+
 #endregion
 
 #region IImportSource
@@ -466,19 +466,23 @@ namespace Banshee.AudioCd
         {
             ImportDisc ();
         }
-        
+
         string [] IImportSource.IconNames {
             get { return Properties.GetStringList ("Icon.Name"); }
         }
-        
+
         bool IImportSource.CanImport {
             get { return true; }
         }
-        
+
         int IImportSource.SortOrder {
             get { return -10; }
         }
-        
+
+        string IImportSource.ImportLabel {
+            get { return null; }
+        }
+
 #endregion
 
     }
diff --git a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
index 447bfd7..67a8631 100644
--- a/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
+++ b/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
@@ -40,38 +40,38 @@ namespace Banshee.AudioCd
         {
             this.model = model;
             this.index_on_disc = index;
-            
-            Uri = new SafeUri (String.Format ("cdda://{0}#{1}", index_on_disc + 1, deviceNode)); 
+
+            Uri = new SafeUri (String.Format ("cdda://{0}#{1}", index_on_disc + 1, deviceNode));
         }
-        
+
         public override bool TrackEqual (TrackInfo track)
         {
             AudioCdTrackInfo cd_track = track as AudioCdTrackInfo;
             return cd_track == null ? false : (cd_track.Model == Model && cd_track.IndexOnDisc == IndexOnDisc);
         }
-        
+
         private AudioCdDiscModel model;
         public AudioCdDiscModel Model {
             get { return model; }
         }
-        
+
         private int index_on_disc;
         public int IndexOnDisc {
             get { return index_on_disc; }
         }
-        
+
         private DatabaseAlbumInfo album_info;
         public new DatabaseAlbumInfo Album {
             get { return album_info; }
             set { album_info = value; }
         }
-        
+
         public DatabaseArtistInfo artist_info;
         public new DatabaseArtistInfo Artist {
             get { return artist_info; }
             set { artist_info = value; }
         }
-        
+
         public override string AlbumMusicBrainzId {
             get { return Album == null ? null : Album.MusicBrainzId; }
         }
@@ -79,10 +79,10 @@ namespace Banshee.AudioCd
         public override string ArtistMusicBrainzId {
             get { return Artist == null ? null : Artist.MusicBrainzId; }
         }
-        
+
         public override DateTime ReleaseDate {
             get { return Album == null ? base.ReleaseDate : Album.ReleaseDate; }
-            set { 
+            set {
                 if (Album == null) {
                     base.ReleaseDate = value;
                 } else {
@@ -94,11 +94,11 @@ namespace Banshee.AudioCd
         private bool rip_enabled = true;
         public bool RipEnabled {
             get { return rip_enabled; }
-            set { 
+            set {
                 if (rip_enabled == value) {
                     return;
                 }
-                
+
                 rip_enabled = value;
                 model.EnabledCount += rip_enabled ? 1 : -1;
             }
diff --git a/src/Extensions/Banshee.AudioCd/Makefile.in b/src/Extensions/Banshee.AudioCd/Makefile.in
index 3b8358e..26639b6 100644
--- a/src/Extensions/Banshee.AudioCd/Makefile.in
+++ b/src/Extensions/Banshee.AudioCd/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -379,6 +388,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -482,11 +492,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -504,6 +515,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -533,6 +545,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -552,14 +565,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.AudioCd/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.AudioCd/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.AudioCd/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.AudioCd/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -577,25 +590,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -625,13 +654,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -663,6 +696,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -683,6 +717,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -691,18 +727,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -763,7 +809,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -780,6 +826,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.BooScript/Banshee.BooScript/BooScriptService.cs b/src/Extensions/Banshee.BooScript/Banshee.BooScript/BooScriptService.cs
index 528e593..407a171 100644
--- a/src/Extensions/Banshee.BooScript/Banshee.BooScript/BooScriptService.cs
+++ b/src/Extensions/Banshee.BooScript/Banshee.BooScript/BooScriptService.cs
@@ -1,4 +1,4 @@
-// 
+//
 // BooScriptService.cs
 //
 // Author:
@@ -44,18 +44,18 @@ namespace Banshee.BooScript
     public class BooScriptService : IExtensionService
     {
         private static string scripts_directory = Path.Combine (Paths.ApplicationData, "boo-scripts");
-        
+
         private bool initialized;
-        
+
         void IExtensionService.Initialize ()
         {
             lock (this) {
                 if (initialized) {
                     return;
                 }
-                
+
                 Directory.CreateDirectory (scripts_directory);
-                
+
                 if (ApplicationContext.CommandLine.Contains ("run-scripts")) {
                     foreach (string file in ApplicationContext.CommandLine.Files) {
                         if (Path.GetExtension (file) == ".boo") {
@@ -63,64 +63,64 @@ namespace Banshee.BooScript
                         }
                     }
                 }
-            
+
                 foreach (string file in Directory.GetFiles (scripts_directory, "*.boo")) {
                     RunBooScript (file);
                 }
-                
+
                 initialized = true;
             }
         }
-        
+
         public void Dispose ()
         {
         }
-        
+
 #region Boo Scripting Engine
 
         private void RunBooScript (string file)
         {
             uint timer_id = Log.DebugTimerStart ();
-        
+
             BooCompiler compiler = new BooCompiler ();
             compiler.Parameters.Ducky = true;
             compiler.Parameters.Pipeline = new CompileToMemory ();
             compiler.Parameters.Input.Add (new FileInput (file));
-            
+
             foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies ()) {
                 compiler.Parameters.References.Add (assembly);
             }
-            
+
             CompilerContext context = compiler.Run ();
-            
+
             if (context.GeneratedAssembly == null) {
                 foreach (CompilerError error in context.Errors) {
-                    Log.Warning (String.Format ("BooScript: compiler error: {0} ({1})", 
+                    Log.Warning (String.Format ("BooScript: compiler error: {0} ({1})",
                         error.ToString (), file), false);
                 }
-                
+
                 return;
             }
-            
+
             try {
                 Type script_module = context.GeneratedAssembly.GetTypes ()[0];
-                
+
                 if (script_module == null) {
                     Log.Warning (String.Format ("BooScript: could not find module in script ({0})", file), false);
                     return;
                 }
-                
+
                 MethodInfo main_entry = script_module.Assembly.EntryPoint;
                 main_entry.Invoke (null, new object[main_entry.GetParameters ().Length]);
-                        
+
                 Log.DebugTimerPrint (timer_id, "BooScript: compiled and invoked: {0}");
             } catch (Exception e) {
                 Log.Exception ("BooScript: scripted failed", e);
             }
         }
 
-#endregion                
-        
+#endregion
+
         string IService.ServiceName {
             get { return "BooScriptService"; }
         }
diff --git a/src/Extensions/Banshee.BooScript/Makefile.in b/src/Extensions/Banshee.BooScript/Makefile.in
index 395e679..dc4d9fb 100644
--- a/src/Extensions/Banshee.BooScript/Makefile.in
+++ b/src/Extensions/Banshee.BooScript/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -373,6 +382,7 @@ RESOURCES = \
 @HAVE_BOO_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @HAVE_BOO_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @HAVE_BOO_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at HAVE_BOO_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @HAVE_BOO_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @HAVE_BOO_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @HAVE_BOO_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -476,11 +486,12 @@ RESOURCES = \
 @HAVE_BOO_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @HAVE_BOO_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at HAVE_BOO_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at HAVE_BOO_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at HAVE_BOO_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_BOO_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @HAVE_BOO_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -498,6 +509,7 @@ RESOURCES = \
 @HAVE_BOO_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at HAVE_BOO_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @HAVE_BOO_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @HAVE_BOO_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @HAVE_BOO_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -527,6 +539,7 @@ RESOURCES = \
 @HAVE_BOO_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @HAVE_BOO_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@HAVE_BOO_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@HAVE_BOO_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @HAVE_BOO_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @HAVE_BOO_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @HAVE_BOO_TRUE at OUTPUT_FILES = \
@@ -547,14 +560,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.BooScript/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.BooScript/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.BooScript/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.BooScript/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -572,25 +585,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -620,13 +649,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -658,6 +691,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -680,6 +714,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -688,18 +724,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -760,7 +806,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_BOO_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @HAVE_BOO_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @HAVE_BOO_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at HAVE_BOO_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at HAVE_BOO_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @HAVE_BOO_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @HAVE_BOO_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @HAVE_BOO_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -777,6 +823,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @HAVE_BOO_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @HAVE_BOO_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs b/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs
index 21a0605..ae4d696 100644
--- a/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs
+++ b/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks/BookmarksService.cs
@@ -19,17 +19,17 @@ namespace Banshee.Bookmarks
     public class BookmarksService : IExtensionService, IDisposable
     {
         private BookmarkUI ui;
-        
+
         public BookmarksService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             Bookmark.Initialize();
             ui = BookmarkUI.Instance;
         }
-        
+
         public void Dispose ()
         {
             if (ui != null)
@@ -55,11 +55,11 @@ namespace Banshee.Bookmarks
         private Dictionary<Bookmark, MenuItem> select_items = new Dictionary<Bookmark, MenuItem>();
         private Dictionary<Bookmark, MenuItem> remove_items = new Dictionary<Bookmark, MenuItem>();
         private Dictionary<MenuItem, Bookmark> bookmark_map = new Dictionary<MenuItem, Bookmark>();
-        
+
         private InterfaceActionService action_service;
         private ActionGroup actions;
         private uint ui_manager_id;
-        
+
         private static BookmarkUI instance = null;
         public static BookmarkUI Instance {
             get {
@@ -76,7 +76,7 @@ namespace Banshee.Bookmarks
         private BookmarkUI()
         {
             action_service = ServiceManager.Get<InterfaceActionService> ("InterfaceActionService");
-            
+
             actions = new ActionGroup("Bookmarks");
 
             actions.Add(new ActionEntry [] {
@@ -135,7 +135,7 @@ namespace Banshee.Bookmarks
 
             bookmark_item.ShowAll();
         }
-        
+
         public void AddBookmark(Bookmark bookmark)
         {
             if (select_items.ContainsKey(bookmark))
@@ -269,12 +269,12 @@ namespace Banshee.Bookmarks
                 Remove();
             }
         }
-        
+
         private void HandleStateChanged (PlayerEventArgs args)
         {
             if (((PlayerEventStateChangeArgs)args).Current == PlayerState.Playing) {
                 ServiceManager.PlayerEngine.DisconnectEvent (HandleStateChanged);
-                
+
                 if (!ServiceManager.PlayerEngine.CurrentTrack.IsLive) {
                     // Sleep in 5ms increments for at most 250ms waiting for CanSeek to be true
                     int count = 0;
@@ -283,7 +283,7 @@ namespace Banshee.Bookmarks
                         count++;
                     }
                 }
-                
+
                 if (ServiceManager.PlayerEngine.CanSeek) {
                     ServiceManager.PlayerEngine.Position = position;
                 }
diff --git a/src/Extensions/Banshee.Bookmarks/Makefile.in b/src/Extensions/Banshee.Bookmarks/Makefile.in
index 43e6aed..ce089ee 100644
--- a/src/Extensions/Banshee.Bookmarks/Makefile.in
+++ b/src/Extensions/Banshee.Bookmarks/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -371,6 +380,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -474,11 +484,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -496,6 +507,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -525,6 +537,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -544,14 +557,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Bookmarks/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Bookmarks/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Bookmarks/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Bookmarks/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -569,25 +582,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -617,13 +646,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -655,6 +688,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -675,6 +709,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -683,18 +719,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -755,7 +801,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -772,6 +818,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmDetectJob.cs b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmDetectJob.cs
index 5563ce9..08621fd 100644
--- a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmDetectJob.cs
+++ b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmDetectJob.cs
@@ -57,10 +57,10 @@ namespace Banshee.Bpm
         private ManualResetEvent result_ready_event = new ManualResetEvent (false);
         private SafeUri result_uri;
         private int result_bpm;
-        
+
         private static HyenaSqliteCommand update_query = new HyenaSqliteCommand (
             "UPDATE CoreTracks SET BPM = ?, DateUpdatedStamp = ? WHERE TrackID = ?");
-        
+
         public BpmDetectJob () : base (Catalog.GetString ("Detecting BPM"))
         {
             IconNames = new string [] {"audio-x-generic"};
@@ -84,7 +84,7 @@ namespace Banshee.Bpm
 
             Register ();
         }
-        
+
         protected override void Init ()
         {
             detector = GetDetector ();
diff --git a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
index 818fce3..4260d22 100644
--- a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
+++ b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
@@ -53,7 +53,7 @@ namespace Banshee.Bpm
         private EditorEditableUndoAdapter<Entry> undo_adapter = new EditorEditableUndoAdapter<Entry> ();
 
         public event EventHandler Changed;
-        
+
         public BpmEntry ()
         {
             detector = BpmDetectJob.GetDetector ();
@@ -112,19 +112,19 @@ namespace Banshee.Bpm
 
             ShowAll ();
         }
-        
+
         public void DisconnectUndo ()
         {
             undo_adapter.DisconnectUndo ();
         }
-        
+
         public void ConnectUndo (EditorTrackInfo track)
         {
             this.track = track;
             tap_adapter.Reset ();
             undo_adapter.ConnectUndo (bpm_entry, track);
         }
-        
+
         public int Bpm {
             get { return bpm_entry.ValueAsInt; }
             set { bpm_entry.Value = value; }
diff --git a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs
index 1e0f8f3..05f678f 100644
--- a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs
+++ b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmService.cs
@@ -51,11 +51,11 @@ namespace Banshee.Bpm
         private BpmDetectJob job;
         private bool disposed;
         private object sync = new object ();
-        
+
         public BpmService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             Banshee.MediaEngine.IBpmDetector detector = BpmDetectJob.GetDetector ();
@@ -69,20 +69,20 @@ namespace Banshee.Bpm
                 ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             }
         }
-        
+
         private void OnSourceAdded (SourceAddedArgs args)
         {
             if (ServiceStartup ()) {
                 ServiceManager.SourceManager.SourceAdded -= OnSourceAdded;
             }
         }
-        
+
         private bool ServiceStartup ()
         {
             if (ServiceManager.SourceManager.MusicLibrary == null) {
                 return false;
             }
-            
+
             ServiceManager.SourceManager.MusicLibrary.TracksAdded += OnTracksAdded;
             InstallPreferences ();
 
@@ -90,10 +90,10 @@ namespace Banshee.Bpm
                 Detect ();
                 return false;
             });
-            
+
             return true;
         }
-        
+
         public void Dispose ()
         {
             if (disposed) {
@@ -102,10 +102,10 @@ namespace Banshee.Bpm
 
             ServiceManager.SourceManager.MusicLibrary.TracksAdded -= OnTracksAdded;
             UninstallPreferences ();
-        
+
             disposed = true;
         }
-        
+
         public void Detect ()
         {
             if (!Enabled) {
@@ -122,40 +122,40 @@ namespace Banshee.Bpm
 
             job.Finished += delegate { job = null; };
         }
-        
+
         private void OnTracksAdded (Source sender, TrackEventArgs args)
         {
             Detect ();
         }
-        
+
         string IService.ServiceName {
             get { return "BpmService"; }
         }
 
-#region Preferences        
+#region Preferences
 
         private PreferenceBase enabled_pref;
-        
+
         private void InstallPreferences ()
         {
             PreferenceService service = ServiceManager.Get<PreferenceService> ();
             if (service == null) {
                 return;
             }
-            
+
             enabled_pref = ServiceManager.SourceManager.MusicLibrary.PreferencesPage["misc"].Add (
-                new SchemaPreference<bool> (EnabledSchema, 
+                new SchemaPreference<bool> (EnabledSchema,
                     Catalog.GetString ("_Automatically detect BPM for all songs"),
                     Catalog.GetString ("Detect BPM for all songs that don't already have a value set"),
                     delegate { Enabled = EnabledSchema.Get (); })
             );
         }
-        
+
         private void UninstallPreferences ()
         {
             ServiceManager.SourceManager.MusicLibrary.PreferencesPage["misc"].Remove (enabled_pref);
         }
-        
+
 #endregion
 
         public bool Enabled {
@@ -171,7 +171,7 @@ namespace Banshee.Bpm
                 }
             }
         }
-        
+
         private static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
             "plugins.bpm", "auto_enabled",
             false,
diff --git a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmTapAdapter.cs b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmTapAdapter.cs
index 24ae1b2..cd83afe 100644
--- a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmTapAdapter.cs
+++ b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmTapAdapter.cs
@@ -87,7 +87,7 @@ namespace Banshee.Bpm
 
             if (last_tap != 0) {
                 int period = now - last_tap;
-                
+
                 Console.WriteLine ("{0} ms since last tap; eq {1} BPM", period, 60000/period);
                 tap_periods[tap_index] = period;
                 tap_index = (tap_index + 1) % (NUM_PERIODS - 1);
diff --git a/src/Extensions/Banshee.Bpm/Makefile.in b/src/Extensions/Banshee.Bpm/Makefile.in
index b67b987..5baad44 100644
--- a/src/Extensions/Banshee.Bpm/Makefile.in
+++ b/src/Extensions/Banshee.Bpm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -374,6 +383,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -477,11 +487,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -499,6 +510,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -528,6 +540,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -547,14 +560,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Bpm/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Bpm/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Bpm/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Bpm/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -572,25 +585,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -620,13 +649,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -658,6 +691,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -678,6 +712,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -686,18 +722,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -758,7 +804,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -775,6 +821,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs b/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs
index 47171b0..6fa1b6c 100644
--- a/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs
+++ b/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs
@@ -54,7 +54,7 @@ namespace Banshee.CoverArt
     {
         private DateTime last_scan = DateTime.MinValue;
         private TimeSpan retry_every = TimeSpan.FromDays (7);
-        
+
         public CoverArtJob (DateTime lastScan) : base (Catalog.GetString ("Downloading Cover Art"))
         {
             last_scan = lastScan;
@@ -71,7 +71,7 @@ namespace Banshee.CoverArt
                     WHERE
                         CoreTracks.PrimarySourceID = ? AND
                         CoreTracks.DateUpdatedStamp > ? AND
-                        CoreTracks.AlbumID = CoreAlbums.AlbumID AND 
+                        CoreTracks.AlbumID = CoreAlbums.AlbumID AND
                         CoreAlbums.ArtistID = CoreArtists.ArtistID AND
                         CoreTracks.AlbumID NOT IN (
                             SELECT AlbumID FROM CoverArtDownloads WHERE
@@ -80,12 +80,12 @@ namespace Banshee.CoverArt
             );
 
             SelectCommand = new HyenaSqliteCommand (@"
-                SELECT DISTINCT CoreAlbums.AlbumID, CoreAlbums.Title, CoreArtists.Name, CoreTracks.Uri 
+                SELECT DISTINCT CoreAlbums.AlbumID, CoreAlbums.Title, CoreArtists.Name, CoreTracks.Uri
                     FROM CoreTracks, CoreArtists, CoreAlbums
                     WHERE
                         CoreTracks.PrimarySourceID = ? AND
                         CoreTracks.DateUpdatedStamp > ? AND
-                        CoreTracks.AlbumID = CoreAlbums.AlbumID AND 
+                        CoreTracks.AlbumID = CoreAlbums.AlbumID AND
                         CoreAlbums.ArtistID = CoreArtists.ArtistID AND
                         CoreTracks.AlbumID NOT IN (
                             SELECT AlbumID FROM CoverArtDownloads WHERE
@@ -101,7 +101,7 @@ namespace Banshee.CoverArt
             CanCancel = true;
             DelayShow = true;
         }
-        
+
         public void Start ()
         {
             Register ();
diff --git a/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs b/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs
index 1e57654..e487721 100644
--- a/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs
+++ b/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs
@@ -53,13 +53,13 @@ namespace Banshee.CoverArt
         private ActionGroup actions;
         private bool disposed;
         private uint ui_manager_id;
-        
+
         private CoverArtJob job;
-        
+
         public CoverArtService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             if (!ServiceManager.DbConnection.TableExists ("CoverArtDownloads")) {
@@ -72,35 +72,35 @@ namespace Banshee.CoverArt
             }
 
             action_service = ServiceManager.Get<InterfaceActionService> ();
-            
+
             if (!ServiceStartup ()) {
                 ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             }
         }
-        
+
         private void OnSourceAdded (SourceAddedArgs args)
         {
             if (ServiceStartup ()) {
                 ServiceManager.SourceManager.SourceAdded -= OnSourceAdded;
             }
         }
-        
+
         private bool ServiceStartup ()
         {
             if (action_service == null || ServiceManager.SourceManager.MusicLibrary == null) {
                 return false;
             }
-            
+
             Initialize ();
-            
+
             return true;
         }
-        
+
         private void Initialize ()
-        {            
+        {
             Banshee.Base.ThreadAssist.AssertInMainThread ();
             actions = new ActionGroup ("CoverArt");
-            
+
             ActionEntry[] action_list = new ActionEntry [] {
                 new ActionEntry ("CoverArtAction", null,
                     Catalog.GetString ("_Cover Art"), null,
@@ -109,16 +109,16 @@ namespace Banshee.CoverArt
                     Catalog.GetString ("_Download Cover Art"), null,
                     Catalog.GetString ("Download cover art for all tracks"), OnFetchCoverArt)
             };
-            
+
             actions.Add (action_list);
-            
+
             action_service.UIManager.InsertActionGroup (actions, 0);
             ui_manager_id = action_service.UIManager.AddUiFromResource ("CoverArtMenu.xml");
-            
+
             ServiceManager.SourceManager.MusicLibrary.TracksAdded += OnTracksAdded;
             ServiceManager.SourceManager.MusicLibrary.TracksChanged += OnTracksChanged;
         }
-        
+
         public void Dispose ()
         {
             if (disposed) {
@@ -130,36 +130,36 @@ namespace Banshee.CoverArt
                 if (fetch_action != null) {
                     action_service.GlobalActions.Remove (fetch_action);
                 }
-                
+
                 action_service.RemoveActionGroup ("CoverArt");
                 action_service.UIManager.RemoveUi (ui_manager_id);
-                
+
                 actions = null;
                 action_service = null;
-                
+
                 ServiceManager.SourceManager.MusicLibrary.TracksAdded -= OnTracksAdded;
                 ServiceManager.SourceManager.MusicLibrary.TracksChanged -= OnTracksChanged;
-            
+
                 disposed = true;
             });
         }
-        
+
         public void FetchCoverArt ()
         {
             bool force = false;
             if (!String.IsNullOrEmpty (Environment.GetEnvironmentVariable ("BANSHEE_FORCE_COVER_ART_FETCH"))) {
                 Log.Debug ("Forcing cover art download session");
-                force = true;                
+                force = true;
             }
-            
+
             FetchCoverArt (force);
         }
-        
+
         public void FetchCoverArt (bool force)
         {
             if (job == null && ServiceManager.Get<Network> ().Connected) {
                 DateTime last_scan = DateTime.MinValue;
-                
+
                 if (!force) {
                     try {
                         last_scan = DatabaseConfigurationClient.Client.Get<DateTime> ("last_cover_art_scan",
@@ -180,17 +180,17 @@ namespace Banshee.CoverArt
                 job.Start ();
             }
         }
-        
+
         private void OnFetchCoverArt (object o, EventArgs args)
         {
             FetchCoverArt (true);
         }
-        
+
         private void OnTracksAdded (Source sender, TrackEventArgs args)
         {
             FetchCoverArt ();
         }
-        
+
         private void OnTracksChanged (Source sender, TrackEventArgs args)
         {
             if (args.ChangedFields == null) {
@@ -205,11 +205,11 @@ namespace Banshee.CoverArt
                 }
             }
         }
-    
+
         string IService.ServiceName {
             get { return "CoverArtService"; }
         }
-        
+
         public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
             "plugins.cover_art", "enabled",
             true,
diff --git a/src/Extensions/Banshee.CoverArt/Makefile.in b/src/Extensions/Banshee.CoverArt/Makefile.in
index 513ad16..68024a5 100644
--- a/src/Extensions/Banshee.CoverArt/Makefile.in
+++ b/src/Extensions/Banshee.CoverArt/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -374,6 +383,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -477,11 +487,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -499,6 +510,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -528,6 +540,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -547,14 +560,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.CoverArt/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.CoverArt/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.CoverArt/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.CoverArt/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -572,25 +585,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -620,13 +649,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -658,6 +691,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -678,6 +712,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -686,18 +722,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -758,7 +804,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -775,6 +821,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs
index 39dfefb..ee26644 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapContainerSource.cs
@@ -44,7 +44,7 @@ namespace Banshee.Daap
             Properties.SetStringList ("Icon.Name", "applications-internet", "network-server");
             TypeUniqueId = "daap-container";
         }
-        
+
         public override bool? AutoExpand {
             get { return ExpandedSchema.Get (); }
         }
@@ -57,7 +57,7 @@ namespace Banshee.Daap
         public override bool CanActivate {
             get { return false; }
         }
-        
+
         public override bool CanRename {
             get { return false; }
         }
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs
index 8182326..06f1f9e 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapErrorView.cs
@@ -5,24 +5,24 @@
  *  Written by Aaron Bockover <aaron at abock.org>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -41,14 +41,14 @@ namespace Banshee.Daap
         InvalidAuthentication,
         UserDisconnect
     }
-    
+
     public class DaapErrorView : Hyena.Widgets.RoundedFrame, Banshee.Sources.Gui.ISourceContents
     {
         private MessagePane pane;
         private bool info_link_clicked;
         private DaapSource source;
         private DaapErrorType failure;
-        
+
         public Banshee.Sources.ISource Source {
             get { return source; }
         }
@@ -56,29 +56,29 @@ namespace Banshee.Daap
         public Widget Widget {
             get { return this; }
         }
-        
+
         public DaapErrorView (DaapSource source, DaapErrorType failure) : base()
         {
             //AppPaintable = true;
             //BorderWidth = 10;
-            
+
             this.source = source;
             this.failure = failure;
-            
+
             pane = new MessagePane();
             pane.HeaderIcon = IconThemeUtils.LoadIcon(48, "face-surprise", Stock.DialogError);
             pane.ArrowIcon = IconThemeUtils.LoadIcon(24, "go-next", Stock.GoForward);
-            pane.HeaderMarkup = String.Format("<big><b>{0}</b></big>", 
-                GLib.Markup.EscapeText((failure == DaapErrorType.UserDisconnect 
+            pane.HeaderMarkup = String.Format("<big><b>{0}</b></big>",
+                GLib.Markup.EscapeText((failure == DaapErrorType.UserDisconnect
                     ? Catalog.GetString("Disconnected from music share")
                     : Catalog.GetString("Unable to connect to music share"))));
-                
+
             AddPaneItems();
             pane.Show();
-            
+
             Add(pane);
         }
-        
+
         private void AddPaneItems()
         {
             if(info_link_clicked) {
@@ -86,22 +86,22 @@ namespace Banshee.Daap
                 link.Xalign = 0.0f;
                 link.Markup = String.Format("<u>{0}</u>", GLib.Markup.EscapeText(Catalog.GetString(
                     "Back")));
-                    
+
                 link.Clicked += delegate(object o, EventArgs args) {
                     info_link_clicked = false;
                     pane.Clear();
                     AddPaneItems();
                 };
-                
+
                 link.Show();
-                pane.Append(link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true, 
+                pane.Append(link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true,
                     IconThemeUtils.LoadIcon(24, "go-previous", Stock.GoBack));
-                
+
                 pane.Append(Catalog.GetString(
                     "iTunes\u00ae 7 introduced new compatibility issues and currently only " +
-                    "works with other iTunes\u00ae 7 clients.\n\n" + 
-                    "No third-party clients can connect to iTunes\u00ae music shares anymore. " + 
-                    "This is an intentional limitation by Apple in iTunes\u00ae 7 and we apologize for " + 
+                    "works with other iTunes\u00ae 7 clients.\n\n" +
+                    "No third-party clients can connect to iTunes\u00ae music shares anymore. " +
+                    "This is an intentional limitation by Apple in iTunes\u00ae 7 and we apologize for " +
                     "the unfortunate inconvenience."
                 ));
             } else {
@@ -111,16 +111,16 @@ namespace Banshee.Daap
                         "Common reasons for connection failures:")));
                     header_label.Xalign = 0.0f;
                     header_label.Show();
-                    
+
                     pane.Append(header_label, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, false);
-                    
+
                     pane.Append(Catalog.GetString("The provided login credentials are invalid"));
                     pane.Append(Catalog.GetString("The login process was canceled"));
                     pane.Append(Catalog.GetString("Too many users are connected to this share"));
                 } else {
                     pane.Append(Catalog.GetString("You are no longer connected to this music share"));
                 }
-                
+
                 if(failure == DaapErrorType.UserDisconnect || failure == DaapErrorType.InvalidAuthentication) {
                     Button button = new Button(Catalog.GetString("Try connecting again"));
                     button.Clicked += delegate { source.Activate(); };
@@ -132,18 +132,18 @@ namespace Banshee.Daap
                     pane.Append(bbox, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, false);
                     return;
                 }
-                
+
                 LinkLabel link = new LinkLabel();
                 link.Xalign = 0.0f;
                 link.Markup = String.Format("<u>{0}</u>", GLib.Markup.EscapeText(Catalog.GetString(
                     "The music share is hosted by iTunes\u00ae 7")));
-                    
+
                 link.Clicked += delegate(object o, EventArgs args) {
                     info_link_clicked = true;
                     pane.Clear();
                     AddPaneItems();
                 };
-                
+
                 link.Show();
                 pane.Append(link, Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill, 0, true);
             }
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs
index 87c75da..87e7fd6 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapLoginDialog.cs
@@ -1,4 +1,4 @@
-// 
+//
 // DaapLoginDialog.cs
 //
 // Author:
@@ -42,7 +42,7 @@ namespace Banshee.Daap
         private Entry username_entry;
         private Entry password_entry;
         private Gtk.AccelGroup accel_group;
-        
+
         public DaapLoginDialog(string shareName, bool showUsername) :  base(
             Catalog.GetString("Login to Music Share"),
             null,
@@ -57,7 +57,7 @@ namespace Banshee.Daap
             AddAccelGroup(accel_group);
             BuildWindow();
         }
-        
+
         private void BuildWindow()
         {
             BorderWidth = 5;
@@ -67,66 +67,66 @@ namespace Banshee.Daap
             HBox box = new HBox();
             box.BorderWidth = 5;
             box.Spacing = 15;
-            
+
             Image image = new Image(Stock.Network, IconSize.Dialog);
             image.Yalign = 0.2f;
             box.PackStart(image, false, false, 0);
-            
+
             VBox content_box = new VBox();
             content_box.Spacing = 12;
-            
+
             Label header = new Label();
             header.Markup = "<big><b>" + GLib.Markup.EscapeText(Catalog.GetString(
                 "Authentication Required")) + "</b></big>";
             header.Justify = Justification.Left;
             header.SetAlignment(0.0f, 0.5f);
-            
+
             Label message = new Label(Catalog.GetString(String.Format(
                 "Please provide login information to access {0}.", share_name)));
             message.Wrap = true;
             message.Justify = Justification.Left;
             message.SetAlignment(0.0f, 0.5f);
-            
+
             content_box.PackStart(header, false, false, 0);
             content_box.PackStart(message, false, false, 0);
-            
+
             username_entry = new Entry();
             password_entry = new Entry();
             password_entry.Visibility = false;
-            
+
             uint yoff = show_username ? (uint)0 : (uint)1;
-            
+
             Table table = new Table(2, 2, false);
             table.RowSpacing = 5;
             table.ColumnSpacing = 10;
-            
+
             if(show_username) {
                 table.Attach(new Label(Catalog.GetString("Username:")), 0, 1, 0, 1,
                     AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
-                
+
                 table.Attach(username_entry, 1, 2, 0, 1,
                     AttachOptions.Expand | AttachOptions.Fill,
                     AttachOptions.Shrink, 0, 0);
             }
-            
+
             table.Attach(new Label(Catalog.GetString("Password:")), 0, 1, 1 - yoff, 2 - yoff,
                 AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
-            
+
             table.Attach(password_entry, 1, 2, 1 - yoff, 2 - yoff,
                 AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Shrink, 0, 0);
-            
+
             content_box.PackStart(table, false, false, 0);
-            
+
             box.PackStart(content_box, true, true, 0);
 
             /* Translators: this is a verb used as a button label, not a noun */
             AddButton(Catalog.GetString("Login"), ResponseType.Ok, true);
-            
+
             box.ShowAll();
             VBox.Add(box);
         }
-        
+
         private void AddButton(string stock_id, Gtk.ResponseType response, bool is_default)
         {
             Gtk.Button button = new Gtk.Button(stock_id);
@@ -140,13 +140,13 @@ namespace Banshee.Daap
                 button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return, 0, Gtk.AccelFlags.Visible);
             }
         }
-        
+
         public string Username {
             get {
                 return username_entry.Text == String.Empty ? null : username_entry.Text;
             }
         }
-        
+
         public string Password {
             get {
                 return password_entry.Text;
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
index 8888341..be183fa 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
@@ -1,4 +1,4 @@
-// 
+//
 // DaapPlaylistSource.cs
 //
 // Author:
@@ -47,20 +47,20 @@ namespace Banshee.Daap
     public class DaapPlaylistSource : PlaylistSource
     {
         private HyenaSqliteCommand insert_track_command = new HyenaSqliteCommand (@"
-            INSERT INTO CorePlaylistEntries (PlaylistID, TrackID) 
+            INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
                 SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID IN (?)"
         );
-        
+
         private DaapSource parent;
         public DAAP.Database Database {
             get { return parent.Database; }
         }
-        
+
         public DaapPlaylistSource (DAAP.Playlist playlist, DaapSource parent) : base (playlist.Name, parent)
         {
             this.parent = parent;
             Save ();
-            
+
             int count = 0;
             if (playlist.Tracks.Count > 0) {
                 //IList<DAAP.Track> tracks = playlist.Tracks;
@@ -78,24 +78,24 @@ namespace Banshee.Daap
                 }
             }
             SavedCount = count;
-            
+
             ThreadAssist.ProxyToMain (delegate {
                 OnUpdated ();
             });
         }
-        
+
         public override bool CanDeleteTracks {
             get { return false; }
         }
-        
+
         public override bool CanAddTracks {
             get { return false; }
         }
-        
+
         public override bool CanRename {
             get { return false; }
         }
-        
+
         public override bool CanUnmap {
             get { return false; }
         }
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapProxyWebServer.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapProxyWebServer.cs
index 550ab4c..6b49587 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapProxyWebServer.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapProxyWebServer.cs
@@ -3,28 +3,30 @@
  *  DaapProxyWebServer.cs
  *
  *  Copyright (C) 2005-2006 Novell, Inc.
+ *  Copyright (C) 2009 Neil Loknath
  *  Written by Aaron Bockover <aaron at aaronbock.net>
  *             James Wilcox <snorp at snorp.net>
+ *             Neil Loknath <neil.loknath at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -37,144 +39,47 @@ using System.Net.Sockets;
 using System.Threading;
 using System.Collections;
 
+using Banshee.Web;
+
 using DAAP = Daap;
 
 namespace Banshee.Daap
 {
-    internal class DaapProxyWebServer
+    internal class DaapProxyWebServer : BaseHttpServer
     {
-        private const int ChunkLength = 8192;
-
-        private ushort port;
-        private Socket server;
-        private bool running;
-        private ArrayList clients = new ArrayList();
         private ArrayList databases = new ArrayList();
-      
-        public DaapProxyWebServer() 
-        {
-        }
 
-        public void Start() 
+        public DaapProxyWebServer() : base (new IPEndPoint(IPAddress.Any, 8089), "DAAP Proxy")
         {
-            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
-            try {
-                server.Bind(new IPEndPoint(IPAddress.Any, 8089));
-            } catch (System.Net.Sockets.SocketException) {
-                server.Bind(new IPEndPoint(IPAddress.Any, 0));
-            }
-            port = (ushort)(server.LocalEndPoint as IPEndPoint).Port;
-            server.Listen(10);
-
-            running = true;
-            Thread thread = new Thread(ServerLoop);
-            thread.Name = "DAAP Proxy";
-            thread.IsBackground = true;
-            thread.Start();
         }
 
-        public void Stop() 
+        protected override bool BindServerSocket ()
         {
-            running = false;
-            
-            if(server != null) {
-                server.Close();
-                server = null;
+            if (!base.BindServerSocket ()) {
+                EndPoint = new IPEndPoint(IPAddress.Any, 0);
+                try {
+                    server.Bind (EndPoint);
+                } catch (System.Net.Sockets.SocketException e) {
+                    Hyena.Log.Exception (e);
+                    return false;
+                }
             }
 
-            foreach(Socket client in (ArrayList)clients.Clone()) {
-                client.Close();
-            }
+            return true;
         }
-        
+
         public void RegisterDatabase(DAAP.Database database)
         {
             databases.Add(database);
         }
-        
+
         public void UnregisterDatabase(DAAP.Database database)
         {
             databases.Remove(database);
         }
-        
-        private void ServerLoop()
-        {
-            while(true) {
-                try {
-                    if(!running) {
-                        break;
-                    }
-                    
-                    Socket client = server.Accept();
-                    clients.Add(client);
-                    ThreadPool.QueueUserWorkItem(HandleConnection, client);
-                } catch(SocketException) {
-                    break;
-                }
-            }
-        }
-        
-        private void HandleConnection(object o) 
-        {
-            Socket client = (Socket)o;
-
-            try {
-                while(HandleRequest(client));
-            } catch(IOException) {
-            } catch(Exception e) {
-                Hyena.Log.Exception (e);
-            } finally {
-                clients.Remove(client);
-                client.Close();
-            }
-        }
-        
-        private bool HandleRequest(Socket client) 
-        {
-            if(!client.Connected) {
-                return false;
-            }
-            
-            bool keep_connection = true;
-            
-            using(StreamReader reader = new StreamReader(new NetworkStream(client, false))) {
-                string request = reader.ReadLine();
-                
-                if(request == null) {
-                    return false;
-                }
-                
-                string line = null;
-                
-                do {
-                    line = reader.ReadLine();
-                    if(line.ToLower() == "connection: close") {
-                        keep_connection = false;
-                    }
-                } while(line != String.Empty && line != null);
-                
-                string [] split_request = request.Split();
-                
-                if(split_request.Length < 3) {
-                    WriteResponse(client, HttpStatusCode.BadRequest, "Bad Request");
-                    return keep_connection;
-                } else {
-                    try {
-                        HandleValidRequest(client, split_request);
-                    } catch(IOException) {
-                        keep_connection = false;
-                    } catch(Exception e) {
-                        keep_connection = false;
-                        Console.Error.WriteLine("Trouble handling request {0}: {1}", split_request[1], e);
-                    }
-                }
-            }
 
-            return keep_connection;
-        }
-
-        private void HandleValidRequest(Socket client, string [] split_request)
-        {        
+        protected override void HandleValidRequest(Socket client, string [] split_request, string [] body_request)
+        {
             if(split_request[1].StartsWith("/")) {
                split_request[1] = split_request[1].Substring(1);
             }
@@ -185,9 +90,9 @@ namespace Banshee.Daap
 
             if(nodes.Length == 1 && nodes[0] == String.Empty) {
                body = GetHtmlHeader("Available Databases");
-               
+
                if(databases.Count == 0) {
-                   body += "<blockquote><p><em>No databases found. Connect to a " + 
+                   body += "<blockquote><p><em>No databases found. Connect to a " +
                        "share in Banshee.</em></p></blockquote>";
                } else {
                    body += "<ul>";
@@ -204,30 +109,30 @@ namespace Banshee.Daap
                     id = Convert.ToInt32(nodes[0]);
                 } catch {
                 }
-                
+
                 foreach(DAAP.Database database in (ArrayList)databases.Clone()) {
                     if(database.GetHashCode() != id) {
                         continue;
                     }
-                    
+
                     body = GetHtmlHeader("Tracks in " + Escape (database.Name));
-                    
+
                     if(database.TrackCount == 0) {
                         body += "<blockquote><p><em>No songs in this database.</em></p></blockquote>";
                     } else {
                         body += "<p>Showing all " + database.TrackCount + " songs:</p><ul>";
                         foreach(DAAP.Track song in database.Tracks) {
                             body += String.Format("<li><a href=\"/{0}/{1}\">{2} - {3}</a> ({4}:{5})</li>",
-                                database.GetHashCode(), song.Id, Escape (song.Artist), Escape (song.Title), 
+                                database.GetHashCode(), song.Id, Escape (song.Artist), Escape (song.Title),
                                 song.Duration.Minutes, song.Duration.Seconds.ToString("00"));
                         }
                         body += "</ul>";
                     }
-                    
+
                     db_found = true;
                     break;
                 }
-                
+
                 if(!db_found) {
                     code = HttpStatusCode.BadRequest;
                     body = GetHtmlHeader("Invalid Request");
@@ -237,36 +142,43 @@ namespace Banshee.Daap
                 bool db_found = false;
                 int db_id = 0;
                 int song_id = 0;
-                
+
                 try {
                     db_id = Convert.ToInt32(nodes[0]);
                     song_id = Convert.ToInt32(nodes[1]);
                 } catch {
                 }
-                
+
                 foreach(DAAP.Database database in (ArrayList)databases.Clone()) {
                     if(database.GetHashCode() != db_id) {
                         continue;
                     }
-                    
+
                     try {
                         DAAP.Track song = database.LookupTrackById(song_id);
                         if(song != null) {
-                            StreamTrack(client, database, song);
+                            long offset = -1;
+                            foreach (string line in body_request) {
+                                if (line.ToLower ().Contains ("range:")) {
+                                    offset = ParseRangeRequest (line);
+                                }
+                            }
+
+                            StreamTrack(client, database, song, offset);
                             return;
                         }
                     } catch (Exception e) {
                         Hyena.Log.Exception (e);
                     }
-                        
+
                     code = HttpStatusCode.BadRequest;
                     body = GetHtmlHeader("Invalid Request");
                     body += String.Format("<p>No song with id `{0}'</p>", song_id);
-                    
+
                     db_found = true;
                     break;
                 }
-                
+
                 if(!db_found) {
                     code = HttpStatusCode.BadRequest;
                     body = GetHtmlHeader("Invalid Request");
@@ -281,109 +193,41 @@ namespace Banshee.Daap
 
             WriteResponse(client, code, body + GetHtmlFooter());
         }
-        
-        private void StreamTrack(Socket client, DAAP.Database database, DAAP.Track song)
-        {
-            long length;
-            Stream stream = database.StreamTrack(song, out length);
-            WriteResponseStream(client, stream, length, song.FileName);
-            stream.Close();
-            client.Close();
-        }
 
-        private void WriteResponse(Socket client, HttpStatusCode code, string body) 
+        protected void StreamTrack(Socket client, DAAP.Database database, DAAP.Track song)
         {
-            WriteResponse(client, code, Encoding.UTF8.GetBytes(body));
-        }
-        
-        private void WriteResponse(Socket client, HttpStatusCode code, byte [] body) 
-        {
-            if(!client.Connected) {
-                return;
-            }
-            
-            string headers = String.Empty;
-            headers += String.Format("HTTP/1.1 {0} {1}\r\n", (int)code, code.ToString());
-            headers += String.Format("Content-Length: {0}\r\n", body.Length);
-            headers += "Content-Type: text/html\r\n";
-            headers += "Connection: close\r\n";
-            headers += "\r\n";
-            
-            using(BinaryWriter writer = new BinaryWriter(new NetworkStream(client, false))) {
-                writer.Write(Encoding.UTF8.GetBytes(headers));
-                writer.Write(body);
-            }
-            
-            client.Close();
+            StreamTrack (client, database, song, -1);
         }
 
-        private void WriteResponseStream(Socket client, Stream response, long length, string filename)
+        protected virtual void StreamTrack(Socket client, DAAP.Database database, DAAP.Track song, long offset)
         {
-            using(BinaryWriter writer = new BinaryWriter(new NetworkStream(client, false))) {
-                string headers = "HTTP/1.1 200 OK\r\n";
-
-                if(length > 0) {
-                    headers += String.Format("Content-Length: {0}\r\n", length);
-                }
-                
-                if(filename != null) {
-                    headers += String.Format("Content-Disposition: attachment; filename=\"{0}\"\r\n",
-                        filename.Replace("\"", "\\\""));
-                }
-                
-                headers += "Connection: close\r\n";
-                headers += "\r\n";
-                
-                writer.Write(Encoding.UTF8.GetBytes(headers));
-
-                using(BinaryReader reader = new BinaryReader(response)) {
-                    while(true) {
-                        byte [] buffer = reader.ReadBytes(ChunkLength);
-                        if(buffer == null) {
-                            break;
-                        }
-                        
-                        writer.Write(buffer);
-                        
-                        if(buffer.Length < ChunkLength) {
-                            break;
-                        }
-                    }
-                }
-            }
+            long length;
+            Stream stream = database.StreamTrack(song, offset, out length);
+            WriteResponseStream(client, stream, length, song.FileName, offset < 0 ? 0 : offset);
+            stream.Close();
+            client.Close();
         }
 
-        private static string Escape (string input)
-        {
-            return String.IsNullOrEmpty (input) ? "" : System.Web.HttpUtility.HtmlEncode (input);
-        }
-        
         private static string GetHtmlHeader(string title)
         {
-            return String.Format("<html><head><title>{0} - Banshee DAAP Browser</title></head><body><h1>{0}</h1>", 
+            return String.Format("<html><head><title>{0} - Banshee DAAP Browser</title></head><body><h1>{0}</h1>",
                 title);
         }
-        
+
         private static string GetHtmlFooter()
         {
-            return String.Format("<hr /><address>Generated on {0} by " + 
-                "Banshee DAAP Plugin (<a href=\"http://banshee-project.org\">http://banshee-project.org</a>)",
+            return String.Format("<hr /><address>Generated on {0} by " +
+                "Banshee DAAP Extension (<a href=\"http://banshee-project.org\">http://banshee-project.org</a>)",
                 DateTime.Now.ToString());
         }
 
-        public ushort Port {
-            get { 
-                return port;
-            }
-        }
-
         private static IPAddress local_address = IPAddress.Parse("127.0.0.1");
         public IPAddress IPAddress {
             get {
                 return local_address;
             }
         }
-        
+
         public string HttpBaseAddress {
             get {
                 return String.Format("http://{0}:{1}/", IPAddress, Port);
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs
index 1bdd59c..058daa9 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs
@@ -43,18 +43,18 @@ namespace Banshee.Daap
         private ServiceLocator locator;
         private DateTime locator_started;
         private static DaapProxyWebServer proxy_server;
-        
+
         private DaapContainerSource container;
         private Dictionary<string, DaapSource> source_map;
-        
+
         internal static DaapProxyWebServer ProxyServer {
             get { return proxy_server; }
         }
-        
+
         void IExtensionService.Initialize ()
         {
         }
-        
+
         public void Dispose ()
         {
             if (locator != null) {
@@ -63,12 +63,12 @@ namespace Banshee.Daap
                 locator.Removed -= OnServiceRemoved;
                 locator = null;
             }
-            
+
             if (proxy_server != null) {
                 proxy_server.Stop ();
                 proxy_server = null;
             }
-            
+
             // Dispose any remaining child sources
             if (source_map != null) {
                 foreach (KeyValuePair <string, DaapSource> kv in source_map) {
@@ -77,26 +77,26 @@ namespace Banshee.Daap
                         kv.Value.Dispose ();
                     }
                 }
-            
+
                 source_map.Clear ();
             }
-            
+
             if (container != null) {
                 ServiceManager.SourceManager.RemoveSource (container, true);
                 container = null;
             }
         }
-        
+
         private void OnServiceFound (object o, ServiceArgs args)
         {
             ThreadAssist.ProxyToMain (delegate {
                 DaapSource source = new DaapSource (args.Service);
                 string key = String.Format ("{0}:{1}", args.Service.Name, args.Service.Port);
-                
+
                 if (source_map.Count == 0) {
                     ServiceManager.SourceManager.AddSource (container);
                 }
-                
+
                 if (source_map.ContainsKey (key)) {
                     // Received new connection info for service
                     container.RemoveChildSource (source_map [key]);
@@ -105,26 +105,26 @@ namespace Banshee.Daap
                     // New service information
                     source_map.Add (key, source);
                 }
-                
+
                 container.AddChildSource (source);
-                
+
                 // Don't flash shares we find on startup (well, within 5s of startup)
                 if ((DateTime.Now - locator_started).TotalSeconds > 5) {
                     source.NotifyUser ();
                 }
             });
         }
-        
+
         private void OnServiceRemoved (object o, ServiceArgs args)
         {
             ThreadAssist.ProxyToMain (delegate {
                 string key = String.Format ("{0}:{1}", args.Service.Name, args.Service.Port);
                 DaapSource source = source_map [key];
-                
+
                 source.Disconnect (true);
                 container.RemoveChildSource (source);
                 source_map.Remove (key);
-                
+
                 if (source_map.Count == 0) {
                     ServiceManager.SourceManager.RemoveSource (container);
                 }
@@ -142,7 +142,7 @@ namespace Banshee.Daap
             // plugin is enabled, just no child sources yet.
             source_map = new Dictionary<string, DaapSource> ();
             container = new DaapContainerSource ();
-            
+
             try {
                 // Now start looking for services.
                 // We do this after creating the source because if we do it before
@@ -154,7 +154,7 @@ namespace Banshee.Daap
                 locator.ShowLocalServices = true;
                 locator_started = DateTime.Now;
                 locator.Start ();
-                
+
                 proxy_server = new DaapProxyWebServer ();
                 proxy_server.Start ();
             } catch (Exception e) {
@@ -162,7 +162,7 @@ namespace Banshee.Daap
             }
             return false;
         }
-        
+
         string IService.ServiceName {
             get { return "DaapService"; }
         }
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
index 0830a23..6f848e4 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
@@ -50,29 +50,29 @@ namespace Banshee.Daap
         private DAAP.Client client;
         private DAAP.Database database;
         private bool connected = false;
-        
+
         public DAAP.Database Database {
             get { return database; }
         }
 
         private bool is_activating;
-        
-        public DaapSource (DAAP.Service service) : base (Catalog.GetString ("Music Share"), service.Name, 
+
+        public DaapSource (DAAP.Service service) : base (Catalog.GetString ("Music Share"), service.Name,
                                                     (service.Address.ToString () + service.Port).Replace (":", "").Replace (".", ""), 300)
         {
             this.service = service;
             Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Disconnect"));
             Properties.SetString ("UnmapSourceActionIconName", "gtk-disconnect");
-            
+
             SupportsPlaylists = false;
             SavedCount = 0;
             UpdateIcon ();
-            
+
             AfterInitialized ();
         }
-        
-        
-        
+
+
+
         private void UpdateIcon ()
         {
             if (service != null && !service.IsProtected) {
@@ -81,7 +81,7 @@ namespace Banshee.Daap
                 Properties.SetStringList ("Icon.Name", "system-lock-screen", "computer", "network-server");
             }
         }
-        
+
         public override void CopyTrackTo (DatabaseTrackInfo track, SafeUri uri, BatchUserJob job)
         {
             if (track.PrimarySource == this && track.Uri.Scheme.StartsWith ("http")) {
@@ -91,25 +91,25 @@ namespace Banshee.Daap
             }
         }
 
-        
+
         public override void Activate ()
         {
             if (client != null || is_activating) {
                 return;
             }
-            
+
             ClearErrorView ();
-            
+
             is_activating = true;
             base.Activate ();
-            
+
             SetStatus (String.Format (Catalog.GetString ("Connecting to {0}"), service.Name), false);
-            
+
             ThreadAssist.Spawn (delegate {
                 try {
                     client = new DAAP.Client (service);
                     client.Updated += OnClientUpdated;
-                    
+
                     if (client.AuthenticationMethod == DAAP.AuthenticationMethod.None) {
                         client.Login ();
                     } else {
@@ -121,11 +121,11 @@ namespace Banshee.Daap
                     });
                     Hyena.Log.Exception (e);
                 }
-               
+
                 is_activating = false;
             });
         }
-        
+
         private void ShowErrorView (DaapErrorType error_type)
         {
             PurgeTracks ();
@@ -136,12 +136,12 @@ namespace Banshee.Daap
             Properties.Set<Banshee.Sources.Gui.ISourceContents> ("Nereid.SourceContents", error_view);
             HideStatus ();
         }
-        
+
         private void ClearErrorView ()
         {
             Properties.Remove ("Nereid.SourceContents");
         }
-        
+
         internal bool Disconnect (bool logout)
         {
             // Stop currently playing track if its from us.
@@ -153,23 +153,23 @@ namespace Banshee.Daap
                     }
                 }
             } catch {}
-            
+
             connected = false;
-            
+
             // Remove tracks associated with this source, since we don't want
             // them after we unmap - we'll refetch.
             PurgeTracks ();
-            
+
             if (client != null) {
                 if (logout) {
                     client.Logout ();
                 }
-                
+
                 client.Dispose ();
                 client = null;
                 database = null;
             }
-            
+
             if (database != null) {
                 try {
                     DaapService.ProxyServer.UnregisterDatabase (database);
@@ -178,30 +178,30 @@ namespace Banshee.Daap
                 database.TrackRemoved -= OnDatabaseTrackRemoved;
                 database = null;
             }
-            
+
             List<Source> children = new List<Source> (Children);
             foreach (Source child in children) {
                 if (child is Banshee.Sources.IUnmapableSource) {
                     (child as Banshee.Sources.IUnmapableSource).Unmap ();
                 }
             }
-            
+
             ClearChildSources ();
-            
+
             return true;
         }
-        
+
         public override void Dispose ()
         {
             Disconnect (true);
             base.Dispose ();
         }
-        
+
         private void PromptLogin ()
         {
             SetStatus (Catalog.GetString ("Logging in to {0}."), false);
-            
-            DaapLoginDialog dialog = new DaapLoginDialog (client.Name, 
+
+            DaapLoginDialog dialog = new DaapLoginDialog (client.Name,
             client.AuthenticationMethod == DAAP.AuthenticationMethod.UserAndPassword);
             if (dialog.Run () == (int) Gtk.ResponseType.Ok) {
                 AuthenticatedLogin (dialog.Username, dialog.Password);
@@ -211,7 +211,7 @@ namespace Banshee.Daap
 
             dialog.Destroy ();
         }
-        
+
         private void AuthenticatedLogin (string username, string password)
         {
             ThreadAssist.Spawn (delegate {
@@ -224,7 +224,7 @@ namespace Banshee.Daap
                 }
             });
         }
-        
+
         private void OnClientUpdated (object o, EventArgs args)
         {
             try {
@@ -233,16 +233,16 @@ namespace Banshee.Daap
                     DaapService.ProxyServer.RegisterDatabase (database);
                     database.TrackAdded += OnDatabaseTrackAdded;
                     database.TrackRemoved += OnDatabaseTrackRemoved;
-                    
+
                     SetStatus (String.Format (Catalog.GetPluralString (
                         "Loading {0} track", "Loading {0} tracks", database.TrackCount),
                         database.TrackCount), false
                     );
-                    
+
                     // Notify (eg reload the source before sync is done) at most 5 times
                     int notify_every = Math.Max (250, (database.Tracks.Count / 4));
                     notify_every -= notify_every % 250;
-                    
+
                     int count = 0;
                     DaapTrackInfo daap_track = null;
 
@@ -250,7 +250,7 @@ namespace Banshee.Daap
                     conn.BeginTransaction ();
                     foreach (DAAP.Track track in database.Tracks) {
                         daap_track = new DaapTrackInfo (track, this);
-                        
+
                         // Only notify once in a while because otherwise the source Reloading slows things way down
                         if (++count % notify_every == 0) {
                             conn.CommitTransaction ();
@@ -261,21 +261,21 @@ namespace Banshee.Daap
                         }
                     }
                     conn.CommitTransaction ();
-                    
+
                     // Save the last track once more to trigger the NotifyTrackAdded
                     if (daap_track != null) {
                         daap_track.Save ();
                     }
-                    
+
                     SetStatus (Catalog.GetString ("Loading playlists"), false);
                     AddPlaylistSources ();
                     connected = true;
                     Reload ();
                     HideStatus ();
                 }
-                
+
                 Name = client.Name;
-                
+
                 UpdateIcon ();
                 OnUpdated ();
             } catch (Exception e) {
@@ -286,7 +286,7 @@ namespace Banshee.Daap
                 });
             }
         }
-        
+
         private void AddPlaylistSources ()
         {
             foreach (DAAP.Playlist pl in database.Playlists) {
@@ -300,18 +300,18 @@ namespace Banshee.Daap
                 });
             }
         }
-        
+
         public void OnDatabaseTrackAdded (object o, DAAP.TrackArgs args)
         {
             DaapTrackInfo track = new DaapTrackInfo (args.Track, this);
             track.Save ();
         }
-        
+
         public void OnDatabaseTrackRemoved (object o, DAAP.TrackArgs args)
         {
             //RemoveTrack (
         }
-        
+
         public override bool CanRemoveTracks {
             get { return false; }
         }
@@ -329,31 +329,35 @@ namespace Banshee.Daap
             // Disconnect and clear out our tracks and such.
             Disconnect (true);
             ShowErrorView (DaapErrorType.UserDisconnect);
-            
+
             return true;
         }
-        
+
         public bool CanUnmap {
             get { return connected; }
         }
-        
+
         public bool ConfirmBeforeUnmap {
             get { return false; }
         }
-        
+
         public void Import ()
         {
             ServiceManager.SourceManager.MusicLibrary.MergeSourceInput (this, SourceMergeType.All);
         }
-        
+
         public bool CanImport {
             get { return connected; }
         }
-        
+
         int IImportSource.SortOrder {
             get { return 30; }
         }
-        
+
+        string IImportSource.ImportLabel {
+            get { return null; }
+        }
+
         public string [] IconNames {
             get { return Properties.GetStringList ("Icon.Name"); }
         }
diff --git a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs
index 694952d..97a8561 100644
--- a/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs
+++ b/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs
@@ -43,10 +43,10 @@ namespace Banshee.Daap
             TrackTitle = track.Title;
             AlbumTitle = track.Album;
             ArtistName = track.Artist;
-            
+
             DateAdded = track.DateAdded;
             DateUpdated = track.DateModified;
-            
+
             Genre = track.Genre;
             FileSize = track.Size;
             TrackCount = track.TrackCount;
@@ -58,11 +58,11 @@ namespace Banshee.Daap
             ExternalId = track.Id;
 
             PrimarySource = source;
-            
+
             Uri = new SafeUri (String.Format (
                 "{0}{1}/{2}", DaapService.ProxyServer.HttpBaseAddress, source.Database.GetHashCode (), track.Id
             ));
-            
+
             //this.IsLive = false;
             //this.CanSaveToDatabase = false;
         }
diff --git a/src/Extensions/Banshee.Daap/Daap/BrokenMD5.cs b/src/Extensions/Banshee.Daap/Daap/BrokenMD5.cs
index 4de823c..098a0bc 100644
--- a/src/Extensions/Banshee.Daap/Daap/BrokenMD5.cs
+++ b/src/Extensions/Banshee.Daap/Daap/BrokenMD5.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,10 +34,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -63,7 +63,7 @@ namespace Daap {
         private int _ProcessingBufferCount; // Counts how much data we have stored that still needs processed.
         private int _version;
 	
-        public BrokenMD5 ( int version ) 
+        public BrokenMD5 ( int version )
         {
             _H = new uint[4];
             buff = new uint[16];
@@ -73,12 +73,12 @@ namespace Daap {
             Initialize();
         }
 
-        ~BrokenMD5 () 
+        ~BrokenMD5 ()
         {
             Dispose (false);
         }
 
-        protected override void Dispose (bool disposing) 
+        protected override void Dispose (bool disposing)
         {
             if (_ProcessingBuffer != null) {
                 Array.Clear (_ProcessingBuffer, 0, _ProcessingBuffer.Length);
@@ -94,7 +94,7 @@ namespace Daap {
             }
         }
 
-        protected override void HashCore (byte[] rgb, int start, int size) 
+        protected override void HashCore (byte[] rgb, int start, int size)
         {
             int i;
             State = 1;
@@ -125,7 +125,7 @@ namespace Daap {
             }
         }
 	
-        protected override byte[] HashFinal () 
+        protected override byte[] HashFinal ()
         {
             byte[] hash = new byte[16];
             int i, j;
@@ -141,7 +141,7 @@ namespace Daap {
             return hash;
         }
 
-        public override void Initialize () 
+        public override void Initialize ()
         {
             count = 0;
             _ProcessingBufferCount = 0;
@@ -152,7 +152,7 @@ namespace Daap {
             _H[3] = 0x10325476;
         }
 
-        private void ProcessBlock (byte[] inputBuffer, int inputOffset) 
+        private void ProcessBlock (byte[] inputBuffer, int inputOffset)
         {
             uint a, b, c, d;
             int i;
@@ -242,7 +242,7 @@ namespace Daap {
 
 
             // ---- Round 2 --------
-  
+
             a += (((b ^ c) & d) ^ c) + (uint) K [16] + buff [1];
             a = (a << 5) | (a >> 27);
             a += b;
@@ -318,7 +318,7 @@ namespace Daap {
 
 
             // ---- Round 3 --------
-  
+
             a += (b ^ c ^ d) + (uint) K [32] + buff [5];
             a = (a << 4) | (a >> 28);
             a += b;
@@ -385,7 +385,7 @@ namespace Daap {
 
 
             // ---- Round 4 --------
-  
+
             a += (((~d) | b) ^ c) + (uint) K [48] + buff [0];
             a = (a << 6) | (a >> 26);
             a += b;
@@ -456,7 +456,7 @@ namespace Daap {
             _H [3] += d;
         }
 		
-        private void ProcessFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount) 
+        private void ProcessFinalBlock (byte[] inputBuffer, int inputOffset, int inputCount)
         {
             ulong total = count + (ulong)inputCount;
             int paddingSize = (int)(56 - total % BLOCK_SIZE_BYTES);
@@ -499,7 +499,7 @@ namespace Daap {
 
         private readonly static uint[] K = {
             0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
-            0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 
+            0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
             0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
             0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
             0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
diff --git a/src/Extensions/Banshee.Daap/Daap/Client.cs b/src/Extensions/Banshee.Daap/Daap/Client.cs
index ecb3ee1..6324c48 100644
--- a/src/Extensions/Banshee.Daap/Daap/Client.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Client.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -32,7 +32,7 @@ namespace Daap {
 
     public class Client : IDisposable {
         private const int UpdateSleepInterval = 2 * 60 * 1000; // 2 minutes
-        
+
         private IPAddress address;
         private UInt16 port;
         private ContentCodeBag bag;
@@ -99,7 +99,7 @@ namespace Daap {
 
         public void Dispose () {
             updateRunning = false;
-            
+
             if (fetcher != null) {
                 fetcher.Dispose ();
                 fetcher = null;
@@ -128,7 +128,7 @@ namespace Daap {
 
                 FetchDatabases ();
                 Refresh ();
-                
+
                 if (serverInfo.SupportsUpdate) {
                     updateRunning = true;
                     Thread thread = new Thread (UpdateLoop);
@@ -154,7 +154,7 @@ namespace Daap {
             } catch (WebException) {
                 // some servers don't implement this, etc.
             }
-            
+
             fetcher.SessionId = 0;
         }
 
@@ -192,16 +192,16 @@ namespace Daap {
                     newrev = GetCurrentRevision ();
                 else
                     newrev = WaitForRevision (revision);
-            
+
                 if (newrev == revision)
                     return;
             }
-                
+
             // Console.WriteLine ("Got new revision: " + newrev);
             foreach (Database db in databases) {
                 db.Refresh (newrev);
             }
-            
+
             revision = newrev;
             if (Updated != null)
                 Updated (this, new EventArgs ());
@@ -212,19 +212,19 @@ namespace Daap {
                 try {
                     if (!updateRunning)
                         break;
-                    
+
                     Refresh ();
                 } catch (WebException) {
                     if (!updateRunning)
                         break;
-                    
+
                     // chill out for a while, maybe the server went down
                     // temporarily or something.
                     Thread.Sleep (UpdateSleepInterval);
                 } catch (Exception e) {
                     if (!updateRunning)
                         break;
-                    
+
                     Console.Error.WriteLine ("Exception in update loop: " + e);
                     Thread.Sleep (UpdateSleepInterval);
                 }
diff --git a/src/Extensions/Banshee.Daap/Daap/ContentCodeBag.cs b/src/Extensions/Banshee.Daap/Daap/ContentCodeBag.cs
index c7fd80a..83d5fa8 100644
--- a/src/Extensions/Banshee.Daap/Daap/ContentCodeBag.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ContentCodeBag.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -49,7 +49,7 @@ namespace Daap {
     internal class ContentCodeBag {
 
         private const int ChunkLength = 8192;
-        
+
         private static ContentCodeBag defaultBag;
         private Dictionary <int, ContentCode> codes = new Dictionary <int, ContentCode> ();
 
@@ -59,7 +59,7 @@ namespace Daap {
 
                     // this is crappy
                     // Alex: Agreed. :)
-                    
+
                     string name = "content-codes";
                     using (BinaryReader reader = new BinaryReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(name))) {
                         MemoryStream buf = new MemoryStream();
@@ -116,7 +116,7 @@ namespace Daap {
 
         internal ContentNode ToNode () {
             List <ContentNode> nodes = new List <ContentNode> ();
-            
+
             foreach (int number in codes.Keys) {
                 ContentCode code = (ContentCode) codes[number];
 
@@ -154,9 +154,9 @@ namespace Daap {
                 if (dictNode.Name != "dmap.dictionary") {
                     continue;
                 }
-                
+
                 ContentCode code = new ContentCode ();
-                
+
                 foreach (ContentNode item in (dictNode.Value as ContentNode[])) {
                     switch (item.Name) {
                     case "dmap.contentcodesnumber":
@@ -173,7 +173,7 @@ namespace Daap {
 
                 bag.codes[code.Number] = code;
             }
-            
+
             return bag;
         }
     }
diff --git a/src/Extensions/Banshee.Daap/Daap/ContentFetcher.cs b/src/Extensions/Banshee.Daap/Daap/ContentFetcher.cs
index b6c4392..16cf880 100644
--- a/src/Extensions/Banshee.Daap/Daap/ContentFetcher.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ContentFetcher.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -46,7 +46,7 @@ namespace Daap {
             get { return creds.Password; }
             set { creds.Password = value; }
         }
-        
+
         public int SessionId {
             get { return sessionId; }
             set { sessionId = value; }
@@ -139,7 +139,7 @@ namespace Daap {
             }
 
             request.ServicePoint.ConnectionLimit = 3;
-            
+
             if (extraHeaders != null)
                 request.Headers = extraHeaders;
 
@@ -156,10 +156,10 @@ namespace Daap {
 
             if (requestId >= 0)
                 request.Headers.Set ("Client-DAAP-Request-ID", requestId.ToString ());
-                                 
+
             request.Credentials = creds;
             request.PreAuthenticate = true;
-            
+
             try {
                 lock (requests) {
                     requests.Add (request);
@@ -195,7 +195,7 @@ namespace Daap {
                 get { return password; }
                 set { password = value; }
             }
-            
+
             public NetworkCredential GetCredential (Uri uri, string type) {
                 return new NetworkCredential (username == null ? "none" : username, password);
             }
diff --git a/src/Extensions/Banshee.Daap/Daap/ContentParser.cs b/src/Extensions/Banshee.Daap/Daap/ContentParser.cs
index 69f15f0..01ef987 100644
--- a/src/Extensions/Banshee.Daap/Daap/ContentParser.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ContentParser.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -36,7 +36,7 @@ namespace Daap {
 
         public ContentNode () {
         }
-        
+
         public ContentNode (string name, params object[] values) {
             this.Name = name;
 
@@ -58,7 +58,7 @@ namespace Daap {
         public void Dump () {
             Dump (0);
         }
-        
+
         private void Dump (int level) {
             Console.WriteLine ("{0}Name: {1}", String.Empty.PadRight (level * 4), Name);
 
@@ -118,7 +118,7 @@ namespace Daap {
             }
 
             int length = IPAddress.NetworkToHostOrder (BitConverter.ToInt32 (buffer, offset + 4));
-            
+
             if (code.Equals (ContentCode.Zero)) {
                 string s = System.Text.ASCIIEncoding.ASCII.GetString (buffer);
                 throw new ContentException (String.Format ("Failed to find content code for '{0}'. Data length is {1}; content is {2}",
@@ -175,7 +175,7 @@ namespace Daap {
                 return node;
             }
         }
-        
+
         public static ContentNode Parse (ContentCodeBag bag, byte[] buffer, string root) {
             int offset = 0;
             return Parse (bag, buffer, root, ref offset);
diff --git a/src/Extensions/Banshee.Daap/Daap/ContentWriter.cs b/src/Extensions/Banshee.Daap/Daap/ContentWriter.cs
index 6733edb..277a945 100644
--- a/src/Extensions/Banshee.Daap/Daap/ContentWriter.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ContentWriter.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -91,7 +91,7 @@ namespace Daap {
                 break;
             }
         }
-        
+
         public static byte[] Write (ContentCodeBag bag, ContentNode node) {
             MemoryStream stream = new MemoryStream ();
             BinaryWriter writer = new BinaryWriter (stream);
diff --git a/src/Extensions/Banshee.Daap/Daap/Database.cs b/src/Extensions/Banshee.Daap/Daap/Database.cs
index b508291..0c4dd11 100644
--- a/src/Extensions/Banshee.Daap/Daap/Database.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Database.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,12 +34,12 @@ namespace Daap {
         public Track Track {
             get { return track; }
         }
-        
+
         public TrackArgs (Track track) {
             this.track = track;
         }
     }
-        
+
     public delegate void PlaylistHandler (object o, PlaylistArgs args);
 
     public class PlaylistArgs : EventArgs {
@@ -48,7 +48,7 @@ namespace Daap {
         public Playlist Playlist {
             get { return pl; }
         }
-        
+
         public PlaylistArgs (Playlist pl) {
             this.pl = pl;
         }
@@ -99,13 +99,13 @@ namespace Daap {
                 basePlaylist.Name = value;
             }
         }
-        
+
         public IList<Track> Tracks {
             get {
                 return new ReadOnlyCollection<Track> (tracks);
             }
         }
-        
+
         public int TrackCount {
             get { return tracks.Count; }
         }
@@ -191,7 +191,7 @@ namespace Daap {
 
             if (deletedIds.Length > 0) {
                 deletedNodes = new List <ContentNode> ();
-                
+
                 foreach (int id in deletedIds) {
                     deletedNodes.Add (new ContentNode ("dmap.itemid", id));
                 }
@@ -207,7 +207,7 @@ namespace Daap {
             if (deletedNodes != null) {
                 children.Add (new ContentNode ("dmap.deletedidlisting", deletedNodes));
             }
-            
+
             return new ContentNode ("daap.databasesongs", children);
         }
 
@@ -215,7 +215,7 @@ namespace Daap {
             List <ContentNode> nodes = new List <ContentNode> ();
 
             nodes.Add (basePlaylist.ToNode (true));
-            
+
             foreach (Playlist pl in playlists) {
                 nodes.Add (pl.ToNode (false));
             }
@@ -269,7 +269,7 @@ namespace Daap {
             } catch (WebException) {
                 return;
             }
-            
+
             ContentNode playlistsNode = ContentParser.Parse (client.Bag, playlistsData);
 
             if (IsUpdateResponse (playlistsNode))
@@ -277,7 +277,7 @@ namespace Daap {
 
             // handle playlist additions/changes
             List <int> plids = new List <int> ();
-            
+
             foreach (ContentNode playlistNode in (ContentNode[]) playlistsNode.GetChild ("dmap.listing").Value) {
                 Playlist pl = Playlist.FromNode (playlistNode);
 
@@ -406,18 +406,18 @@ namespace Daap {
         {
             return StreamTrack (track, -1, out length);
         }
-        
+
         public Stream StreamTrack (Track track, long offset, out long length)
         {
             return StreamTrack (track.Id, track.Format, offset, out length);
         }
-        
+
         public Stream StreamTrack (int track_id, string track_format, out long length)
         {
             return StreamTrack (track_id, track_format, -1, out length);
         }
-        
-        public Stream StreamTrack (int track_id, string track_format, long offset, out long length) 
+
+        public Stream StreamTrack (int track_id, string track_format, long offset, out long length)
         {
             HttpWebResponse response = FetchTrack (track_id, track_format, offset);
             length = response.ContentLength;
@@ -432,12 +432,12 @@ namespace Daap {
                 using (BinaryReader reader = new BinaryReader (StreamTrack (track_id, track_format, out len))) {
                     int count = 0;
                     byte [] buf = new byte[ChunkLength];
-                    
+
                     do {
                         count = reader.Read (buf, 0, ChunkLength);
                         pos += count;
                         writer.Write (buf, 0, count);
-                        
+
                         // Roughly every 40KB yield an updated percent-done double
                         if (i++ % 5 == 0) {
                             yield return (double)pos / (double)len;
@@ -452,7 +452,7 @@ namespace Daap {
         public void AddTrack (Track track) {
             if (track.Id == 0)
                 track.SetId (nextTrackId++);
-            
+
             tracks.Add (track);
             basePlaylist.AddTrack (track);
 
diff --git a/src/Extensions/Banshee.Daap/Daap/Hasher.cs b/src/Extensions/Banshee.Daap/Daap/Hasher.cs
index 31544ba..069fe43 100644
--- a/src/Extensions/Banshee.Daap/Daap/Hasher.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Hasher.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -44,7 +44,7 @@ using System;
 using System.Text;
 
 namespace Daap {
-    
+
     internal class Hasher
     {
         private static byte [] _hasht42 = null;
diff --git a/src/Extensions/Banshee.Daap/Daap/Playlist.cs b/src/Extensions/Banshee.Daap/Daap/Playlist.cs
index 4a37d1f..54491ef 100644
--- a/src/Extensions/Banshee.Daap/Daap/Playlist.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Playlist.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -29,7 +29,7 @@ namespace Daap {
     public class Playlist {
 
         private static int nextid = 1;
-        
+
         private int id;
         private string name = String.Empty;
         private List<Track> tracks = new List<Track> ();
@@ -48,7 +48,7 @@ namespace Daap {
             }
             set { tracks[index] = value; }
         }
-        
+
         public IList<Track> Tracks {
             get { return new ReadOnlyCollection<Track> (tracks); }
         }
@@ -94,7 +94,7 @@ namespace Daap {
         public void AddTrack (Track track) {
             AddTrack (track, tracks.Count + 1);
         }
-        
+
         internal void AddTrack (Track track, int id) {
             tracks.Add (track);
             containerIds.Add (id);
@@ -107,7 +107,7 @@ namespace Daap {
             Track track = (Track) tracks[index];
             tracks.RemoveAt (index);
             containerIds.RemoveAt (index);
-            
+
             if (TrackRemoved != null)
                 TrackRemoved (this, index, track);
         }
@@ -115,7 +115,7 @@ namespace Daap {
         public bool RemoveTrack (Track track) {
             int index;
             bool ret = false;
-            
+
             while ((index = IndexOf (track)) >= 0) {
                 ret = true;
                 RemoveAt (index);
@@ -158,8 +158,8 @@ namespace Daap {
 
             if (deletedNodes != null)
                 children.Add (new ContentNode ("dmap.deletedidlisting", deletedNodes));
-            
-            
+
+
             return new ContentNode ("daap.playlistsongs", children);
         }
 
@@ -173,7 +173,7 @@ namespace Daap {
             nodes.Add (new ContentNode ("dmap.itemcount", tracks.Count));
             if (basePlaylist)
                 nodes.Add (new ContentNode ("daap.baseplaylist", (byte) 1));
-            
+
             return new ContentNode ("dmap.listingitem", nodes);
         }
 
diff --git a/src/Extensions/Banshee.Daap/Daap/ServerInfo.cs b/src/Extensions/Banshee.Daap/Daap/ServerInfo.cs
index f33816f..4571c7d 100644
--- a/src/Extensions/Banshee.Daap/Daap/ServerInfo.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ServerInfo.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -28,13 +28,13 @@ namespace Daap {
         UserAndPassword,
         Password,
     }
-            
+
     internal class ServerInfo {
 
         private string name;
         private AuthenticationMethod authMethod;
         private bool supportsUpdate;
-        
+
         public string Name {
             get { return name; }
             set { name = value; }
diff --git a/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs b/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs
index 9d16562..ccb0107 100644
--- a/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs
+++ b/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -33,11 +33,11 @@ namespace Daap {
     public class ServiceArgs : EventArgs {
 
         private Service service;
-        
+
         public Service Service {
             get { return service; }
         }
-        
+
         public ServiceArgs (Service service) {
             this.service = service;
         }
@@ -77,21 +77,21 @@ namespace Daap {
             return String.Format("{0}:{1} ({2})", Address, Port, Name);
         }
     }
-    
+
     public class ServiceLocator {
-        
+
         private ServiceBrowser browser;
         private Dictionary <string, Service> services = new Dictionary <string, Service> ();
         private bool showLocals = false;
-        
+
         public event ServiceHandler Found;
         public event ServiceHandler Removed;
-        
+
         public bool ShowLocalServices {
             get { return showLocals; }
             set { showLocals = value; }
         }
-        
+
         public Service [] Services {
             get {
                 Service [] ret = new Service [services.Count];
@@ -99,22 +99,22 @@ namespace Daap {
                 return ret;
             }
         }
-        
+
         public ServiceLocator ()
         {
         }
-        
+
         public void Start () {
             if (browser != null) {
                 Stop ();
             }
-        
+
             browser = new ServiceBrowser ();
             browser.ServiceAdded += OnServiceAdded;
             browser.ServiceRemoved += OnServiceRemoved;
             browser.Browse ("_daap._tcp", null);
         }
-        
+
         public void Stop () {
             if (browser != null) {
                 browser.Dispose ();
@@ -122,18 +122,18 @@ namespace Daap {
             }
             services.Clear ();
         }
-        
+
         private void OnServiceAdded (object o, ServiceBrowseEventArgs args) {
             args.Service.Resolved += OnServiceResolved;
             Log.DebugFormat ("Found DAAP share {0}, trying to resolve...", args.Service.Name);
             args.Service.Resolve ();
         }
-        
+
         private void OnServiceResolved (object o, ServiceResolvedEventArgs args) {
             string name = args.Service.Name;
 
             Log.DebugFormat ("Managed to resolve DAAP share {0}.", args.Service.Name);
-                        
+
             bool password_required = false;
 
             // iTunes tacks this on to indicate a passsword protected share.  Ugh.
@@ -141,9 +141,9 @@ namespace Daap {
                 name = name.Substring (0, name.Length - 3);
                 password_required = true;
             }
-            
+
             IResolvableService service = (IResolvableService) args.Service;
-            
+
             foreach(TxtRecordItem item in service.TxtRecord) {
                 if(item.Key.ToLower () == "password") {
                     password_required = item.ValueString.ToLower () == "true";
@@ -151,11 +151,11 @@ namespace Daap {
                     name = item.ValueString;
                 }
             }
-            
+
             IPAddress address = args.Service.HostEntry.AddressList[0];
-            
+
             Log.DebugFormat ("OnServiceResolved provided {0}", address);
-            
+
             // XXX: Workaround a Mono bug where we can't resolve IPv6 addresses properly
             if (services.ContainsKey (name) && address.AddressFamily == AddressFamily.InterNetworkV6) {
                 // Only skip this service if it resolves to a IPv6 address, and we already have info
@@ -166,29 +166,29 @@ namespace Daap {
                 // This is the first address we've resolved, however, it's an IPv6 address.
                 // Try and resolve the hostname in hope that it'll end up as an IPv4 address - it doesn't
                 // really matter if it still ends up with an IPv6 address, we're not risking anything.
-                
+
                 foreach (IPAddress addr in Dns.GetHostEntry (args.Service.HostEntry.HostName).AddressList) {
                     if (addr.AddressFamily == AddressFamily.InterNetwork) {
                         address = addr;
                     }
                 }
             }
-            
+
             Log.DebugFormat ("Using address {0}", address);
-            
-            Daap.Service svc = new Daap.Service (address, (ushort)service.Port, 
+
+            Daap.Service svc = new Daap.Service (address, (ushort)service.Port,
                 name, password_required);
-            
+
             if (services.ContainsKey (name)) {
                 services[name] = svc;
             } else {
                 services.Add (name, svc);
             }
-            
+
             if (Found != null)
-                Found (this, new ServiceArgs (svc)); 
+                Found (this, new ServiceArgs (svc));
         }
-        
+
         private void OnServiceRemoved (object o, ServiceBrowseEventArgs args) {
             if (services.ContainsKey (args.Service.Name)) {
                 Service svc = (Service) services[args.Service.Name];
diff --git a/src/Extensions/Banshee.Daap/Daap/Track.cs b/src/Extensions/Banshee.Daap/Daap/Track.cs
index d772eb1..13621d1 100644
--- a/src/Extensions/Banshee.Daap/Daap/Track.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Track.cs
@@ -1,17 +1,17 @@
 /*
  * daap-sharp
  * Copyright (C) 2005  James Willcox <snorp at snorp.net>
- * 
+ *
  * 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
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -41,7 +41,7 @@ namespace Daap {
         private short bitrate;
 
         public event EventHandler Updated;
-        
+
         public string Artist {
             get { return artist; }
             set {
@@ -49,7 +49,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public string Album {
             get { return album; }
             set {
@@ -57,7 +57,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public string Title {
             get { return title; }
             set {
@@ -65,7 +65,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public int Year {
             get { return year; }
             set {
@@ -73,7 +73,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public string Format {
             get { return format; }
             set {
@@ -81,7 +81,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public TimeSpan Duration {
             get { return duration; }
             set {
@@ -89,11 +89,11 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public int Id {
             get { return id; }
         }
-        
+
         public int Size {
             get { return size; }
             set {
@@ -101,7 +101,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public string Genre {
             get { return genre; }
             set {
@@ -109,7 +109,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public int TrackNumber {
             get { return trackNumber; }
             set {
@@ -117,7 +117,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public int TrackCount {
             get { return trackCount; }
             set {
@@ -125,7 +125,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public string FileName {
             get { return fileName; }
             set {
@@ -133,7 +133,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public DateTime DateAdded {
             get { return dateAdded; }
             set {
@@ -141,7 +141,7 @@ namespace Daap {
                 EmitUpdated ();
             }
         }
-        
+
         public DateTime DateModified {
             get { return dateModified; }
             set {
@@ -187,10 +187,10 @@ namespace Daap {
         internal ContentNode ToNode (string[] fields) {
 
             ArrayList nodes = new ArrayList ();
-            
+
             foreach (string field in fields) {
                 object val = null;
-                
+
                 switch (field) {
                 case "dmap.itemid":
                     val = id;
@@ -294,7 +294,7 @@ namespace Daap {
                 default:
                     break;
                 }
-                
+
                 if (val != null) {
                     // iTunes wants this to go first, sigh
                     if (field == "dmap.itemkind")
@@ -303,13 +303,13 @@ namespace Daap {
                         nodes.Add (new ContentNode (field, val));
                 }
             }
-            
+
             return new ContentNode ("dmap.listingitem", nodes);
         }
 
         internal static Track FromNode (ContentNode node) {
             Track track = new Track ();
-            
+
             foreach (ContentNode field in (ContentNode[]) node.Value) {
                 switch (field.Name) {
                 case "dmap.itemid":
@@ -371,7 +371,7 @@ namespace Daap {
         internal static void FromPlaylistNode (Database db, ContentNode node, out Track track, out int containerId) {
             track = null;
             containerId = 0;
-            
+
             foreach (ContentNode field in (ContentNode[]) node.Value) {
                 switch (field.Name) {
                 case "dmap.itemid":
diff --git a/src/Extensions/Banshee.Daap/Daap/User.cs b/src/Extensions/Banshee.Daap/Daap/User.cs
index c48e8aa..1145c6d 100644
--- a/src/Extensions/Banshee.Daap/Daap/User.cs
+++ b/src/Extensions/Banshee.Daap/Daap/User.cs
@@ -12,7 +12,7 @@ namespace Daap {
         public User User {
             get { return user; }
         }
-        
+
         public UserArgs (User user) {
             this.user = user;
         }
diff --git a/src/Extensions/Banshee.Daap/Daap/Utility.cs b/src/Extensions/Banshee.Daap/Daap/Utility.cs
index 0be647c..af1115e 100644
--- a/src/Extensions/Banshee.Daap/Daap/Utility.cs
+++ b/src/Extensions/Banshee.Daap/Daap/Utility.cs
@@ -6,7 +6,7 @@ namespace Daap {
     internal class Utility {
 
         private static DateTime epoch = new DateTime (1970, 1, 1).ToLocalTime ();
-        
+
         public static DateTime ToDateTime (int time) {
             return epoch.AddSeconds (time);
         }
diff --git a/src/Extensions/Banshee.Daap/Makefile.in b/src/Extensions/Banshee.Daap/Makefile.in
index f277996..1abb84b 100644
--- a/src/Extensions/Banshee.Daap/Makefile.in
+++ b/src/Extensions/Banshee.Daap/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -396,6 +405,7 @@ RESOURCES = \
 @DAAP_ENABLED_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @DAAP_ENABLED_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @DAAP_ENABLED_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at DAAP_ENABLED_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @DAAP_ENABLED_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @DAAP_ENABLED_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @DAAP_ENABLED_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -499,11 +509,12 @@ RESOURCES = \
 @DAAP_ENABLED_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at DAAP_ENABLED_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at DAAP_ENABLED_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at DAAP_ENABLED_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @DAAP_ENABLED_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @DAAP_ENABLED_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -521,6 +532,7 @@ RESOURCES = \
 @DAAP_ENABLED_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at DAAP_ENABLED_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @DAAP_ENABLED_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @DAAP_ENABLED_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @DAAP_ENABLED_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -550,6 +562,7 @@ RESOURCES = \
 @DAAP_ENABLED_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @DAAP_ENABLED_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @DAAP_ENABLED_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at DAAP_ENABLED_TRUE@@ENABLE_ATK_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @DAAP_ENABLED_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @DAAP_ENABLED_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @DAAP_ENABLED_TRUE at OUTPUT_FILES = \
@@ -570,14 +583,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Daap/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Daap/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Daap/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Daap/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -595,25 +608,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -643,13 +672,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -681,6 +714,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -703,6 +737,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -711,18 +747,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -783,7 +829,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @DAAP_ENABLED_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @DAAP_ENABLED_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @DAAP_ENABLED_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at DAAP_ENABLED_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at DAAP_ENABLED_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @DAAP_ENABLED_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @DAAP_ENABLED_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @DAAP_ENABLED_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -800,6 +846,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @DAAP_ENABLED_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @DAAP_ENABLED_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
index e81e6f7..c1f1748 100644
--- a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
+++ b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
@@ -53,19 +53,19 @@ namespace Banshee.FileSystemQueue
         private bool actions_loaded = false;
         private bool play_enqueued = false;
         private string path_to_play;
-        
-        public FileSystemQueueSource () : base (Catalog.GetString ("File System Queue"), 
+
+        public FileSystemQueueSource () : base (Catalog.GetString ("File System Queue"),
             Catalog.GetString ("File System Queue"), "file-system-queue", 30)
         {
             TypeUniqueId = "file-system-queue";
             Properties.SetStringList ("Icon.Name", "system-file-manager");
             Properties.Set<bool> ("AutoAddSource", false);
             IsLocal = true;
-            
+
             ServiceManager.Get<DBusCommandService> ().ArgumentPushed += OnCommandLineArgument;
-            
+
             AfterInitialized ();
-            
+
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             uia_service.GlobalActions.AddImportant (
                 new ActionEntry ("ClearFileSystemQueueAction", Stock.Clear,
@@ -73,29 +73,29 @@ namespace Banshee.FileSystemQueue
                     Catalog.GetString ("Remove all tracks from the file system queue"),
                     OnClearFileSystemQueue)
             );
-            
+
             uia_service.GlobalActions.Add (new ToggleActionEntry [] {
                 new ToggleActionEntry ("ClearFileSystemQueueOnQuitAction", null,
-                    Catalog.GetString ("Clear on Quit"), null, 
-                    Catalog.GetString ("Clear the file system queue when quitting"), 
+                    Catalog.GetString ("Clear on Quit"), null,
+                    Catalog.GetString ("Clear the file system queue when quitting"),
                     OnClearFileSystemQueueOnQuit, ClearOnQuitSchema.Get ())
             });
-            
+
             uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
-            
+
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.SetString ("GtkActionPath", "/FileSystemQueueContextMenu");
-            
+
             actions_loaded = true;
-            
+
             UpdateActions ();
             ServiceManager.SourceManager.ActiveSourceChanged += delegate { Banshee.Base.ThreadAssist.ProxyToMain (UpdateActions); };
             TrackModel.Reloaded += OnTrackModelReloaded;
-            
+
             Reload ();
 
             play_enqueued = ApplicationContext.CommandLine.Contains ("play-enqueued");
-            
+
             foreach (string path in ApplicationContext.CommandLine.Files) {
                 // If it looks like a URI with a protocol, leave it as is
                 if (System.Text.RegularExpressions.Regex.IsMatch (path, "^\\w+\\:\\/")) {
@@ -107,7 +107,7 @@ namespace Banshee.FileSystemQueue
                 }
             }
         }
-        
+
         public void Enqueue (string path)
         {
             try {
@@ -127,7 +127,7 @@ namespace Banshee.FileSystemQueue
                             if (args.Error != null || path_to_play != null) {
                                 return;
                             }
-                            
+
                             path_to_play = args.Path;
                             if (args.Track == null) {
                                 // Play immediately if the track is already in the source,
@@ -150,7 +150,7 @@ namespace Banshee.FileSystemQueue
                         }
                     };
                 }
-            
+
                 if (PlaylistFileUtil.PathHasPlaylistExtension (path)) {
                     Banshee.Kernel.Scheduler.Schedule (new DelegateJob (delegate {
                         // If it's in /tmp it probably came from Firefox - just play it
@@ -165,22 +165,22 @@ namespace Banshee.FileSystemQueue
                 }
             }
         }
-        
+
         private void PlayEnqueued ()
-        {   
+        {
             if (!play_enqueued || path_to_play == null) {
                 return;
             }
-            
+
             SafeUri uri = null;
-            
+
             ServiceManager.PlaybackController.NextSource = this;
-            
+
             try {
                 uri = new SafeUri (path_to_play);
             } catch {
             }
-            
+
             if (uri == null) {
                 return;
             }
@@ -202,7 +202,7 @@ namespace Banshee.FileSystemQueue
         public override bool CanDeleteTracks {
             get { return false; }
         }
-        
+
         public override void Dispose ()
         {
             ServiceManager.Get<DBusCommandService> ().ArgumentPushed -= OnCommandLineArgument;
@@ -211,7 +211,7 @@ namespace Banshee.FileSystemQueue
             }
             base.Dispose ();
         }
-        
+
         private void OnCommandLineArgument (string argument, object value, bool isFile)
         {
             if (!isFile) {
@@ -221,9 +221,9 @@ namespace Banshee.FileSystemQueue
                 }
                 return;
             }
-            
+
             Log.DebugFormat ("FSQ Enqueue: {0}", argument);
-            
+
             try {
                 if (Banshee.IO.Directory.Exists (argument) || Banshee.IO.File.Exists (new SafeUri (argument))) {
                     Enqueue (argument);
@@ -231,16 +231,16 @@ namespace Banshee.FileSystemQueue
             } catch {
             }
         }
-        
+
         protected override void OnUpdated ()
         {
             base.OnUpdated ();
-            
+
             if (actions_loaded) {
                 UpdateActions ();
             }
         }
-        
+
         private void OnTrackModelReloaded (object sender, EventArgs args)
         {
             if (Count > 0 && !visible) {
@@ -250,12 +250,12 @@ namespace Banshee.FileSystemQueue
                 ServiceManager.SourceManager.RemoveSource (this);
                 visible = false;
             }
-            
+
             if (Count > 0) {
                 PlayEnqueued ();
             }
         }
-        
+
         private void OnClearFileSystemQueue (object o, EventArgs args)
         {
             // Delete any child playlists
@@ -270,28 +270,28 @@ namespace Banshee.FileSystemQueue
             RemoveTrackRange ((DatabaseTrackListModel)TrackModel, new Hyena.Collections.RangeCollection.Range (0, Count));
             Reload ();
         }
-        
+
         private void OnClearFileSystemQueueOnQuit (object o, EventArgs args)
         {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             ToggleAction action = (ToggleAction)uia_service.GlobalActions["ClearFileSystemQueueOnQuitAction"];
             ClearOnQuitSchema.Set (action.Active);
         }
-        
+
         private void UpdateActions ()
-        {   
+        {
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             uia_service.GlobalActions.UpdateAction ("ClearFileSystemQueueAction", true, Count > 0);
         }
-        
+
         public static readonly SchemaEntry<bool> ClearOnQuitSchema = new SchemaEntry<bool> (
             "plugins.file_system_queue", "clear_on_quit",
             false,
diff --git a/src/Extensions/Banshee.FileSystemQueue/Makefile.in b/src/Extensions/Banshee.FileSystemQueue/Makefile.in
index 1ad8749..53ebe5b 100644
--- a/src/Extensions/Banshee.FileSystemQueue/Makefile.in
+++ b/src/Extensions/Banshee.FileSystemQueue/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -372,6 +381,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -475,11 +485,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -497,6 +508,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -526,6 +538,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -545,14 +558,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.FileSystemQueue/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.FileSystemQueue/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.FileSystemQueue/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.FileSystemQueue/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -570,25 +583,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -618,13 +647,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -656,6 +689,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -676,6 +710,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -684,18 +720,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -756,7 +802,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -773,6 +819,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive.addin.xml b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive.addin.xml
new file mode 100644
index 0000000..9aafdaf
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive.addin.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Addin 
+    id="Banshee.InternetArchive"
+    version="1.0"
+    compatVersion="1.0"
+    copyright="© 2009 Novell Inc. Licensed under the MIT X11 license."
+    name="Internet Archive"
+    category="User Interface"
+    description="Browse and search the Internet Archive's vast media collection."
+    author="Gabriel Burt"
+    url="http://banshee-project.org/"
+    defaultEnabled="false">
+
+  <Dependencies>
+    <Addin id="Banshee.Services" version="1.0"/>
+    <Addin id="Banshee.ThickClient" version="1.0"/>
+  </Dependencies>
+
+  <Extension path="/Banshee/SourceManager/Source">
+    <Source class="Banshee.InternetArchive.HomeSource"/>
+  </Extension>
+</Addin>
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs
new file mode 100644
index 0000000..d2ad85b
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Actions.cs
@@ -0,0 +1,86 @@
+//
+// Actions.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+using Gtk;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class Actions : Banshee.Gui.BansheeActionGroup
+    {
+        public Actions (HomeSource source) : base ("InternetArchive")
+        {
+            Add (
+                new ActionEntry ("IaResultPopup", null, null, null, null, (o, a) => {
+                    ShowContextMenu ("/IaResultPopup");
+                }),
+                new ActionEntry ("ViewItemDetails", null, Catalog.GetString ("View Item Details"), null, null, (o, a) => {
+                    var item = source.SearchSource.FocusedItem;
+                    if (item != null && item.Id != null) {
+                        string id = item.Id;
+                        var src = new DetailsSource (id, item.Title, item.MediaType);
+                        source.AddChildSource (src);
+                        Banshee.ServiceStack.ServiceManager.SourceManager.SetActiveSource (src);
+                    }
+                }),
+                new ActionEntry ("OpenItemWebsite", Stock.JumpTo, Catalog.GetString ("Open Webpage"), null, null, (o, a) => {
+                    string uri = null;
+                    var src = ActiveSource as DetailsSource;
+                    if (src != null) {
+                        uri = src.Item.Details.WebpageUrl;
+                    } else {
+                        var item = source.SearchSource.FocusedItem;
+                        if (item != null) {
+                            uri = item.WebpageUrl;
+                        }
+                    }
+
+                    if (uri != null) {
+                        Banshee.Web.Browser.Open (uri);
+                    }
+                })
+            );
+
+            AddImportant (
+                new ActionEntry ("VisitInternetArchive", Stock.JumpTo, Catalog.GetString ("Visit Archive.org"), null, null, (o, a) => {
+                    Banshee.Web.Browser.Open ("http://archive.org");
+                })
+            );
+
+            AddUiFromFile ("GlobalUI.xml");
+
+            Register ();
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs
new file mode 100644
index 0000000..a7b27ea
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsSource.cs
@@ -0,0 +1,241 @@
+//
+// DetailsSource.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Collections;
+using Hyena.Data.Sqlite;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class DetailsSource : Banshee.Sources.Source, ITrackModelSource, IDurationAggregator, IFileSizeAggregator, IUnmapableSource
+    {
+        private Item item;
+        private MemoryTrackListModel track_model;
+        private DetailsView gui;
+
+        public Item Item {
+            get { return item; }
+        }
+
+        public DetailsSource (string id, string title, string mediaType) : this (Item.LoadOrCreate (id, title, mediaType)) {}
+
+        public DetailsSource (Item item) : base (item.Title, item.Title, 195, "internet-archive-" + item.Id)
+        {
+            this.item = item;
+            track_model = new MemoryTrackListModel ();
+            track_model.Reloaded += delegate { OnUpdated (); };
+
+            Properties.SetString ("ActiveSourceUIResource", "DetailsSourceActiveUI.xml");
+            Properties.SetString ("GtkActionPath", "/IaDetailsSourcePopup");
+            Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Close Item"));
+
+            SetIcon ();
+
+            gui = new DetailsView (this, item);
+            Properties.Set<Gtk.Widget> ("Nereid.SourceContents", gui);
+
+            if (item.Details == null) {
+                SetStatus (Catalog.GetString ("Getting item details from the Internet Archive"), false, true, null);
+                Load ();
+            } else {
+                gui.UpdateDetails ();
+            }
+        }
+
+        private void SetIcon ()
+        {
+            if (item.MediaType == null)
+                return;
+
+            var media_type = IA.MediaType.Options.FirstOrDefault (mt =>
+                item.MediaType.Contains (mt.Id) || mt.Children.Any (c => item.MediaType.Contains (c.Id))
+            );
+
+            if (media_type == null)
+                return;
+
+            if (media_type.Id == "audio") {
+                Properties.SetStringList ("Icon.Name", "audio-x-generic", "audio");
+            } else if (media_type.Id == "movies") {
+                Properties.SetStringList ("Icon.Name", "video-x-generic", "video");
+            } else if (media_type.Id == "texts") {
+                Properties.SetStringList ("Icon.Name", "x-office-document", "document");
+            } else if (media_type.Id == "education") {
+                Properties.SetStringList ("Icon.Name", "video-x-generic", "video");
+            }
+        }
+
+        private void Load ()
+        {
+            ThreadAssist.SpawnFromMain (ThreadedLoad);
+        }
+
+        private void ThreadedLoad ()
+        {
+            try {
+                item.LoadDetails ();
+                ThreadAssist.ProxyToMain (delegate {
+                    ClearMessages ();
+                    if (item.Details != null) {
+                        gui.UpdateDetails ();
+                    }
+                });
+            } catch (Exception e) {
+                Hyena.Log.Exception ("Error loading IA item details", e);
+
+                ThreadAssist.ProxyToMain (delegate {
+                    var web_e = e as System.Net.WebException;
+                    if (web_e != null && web_e.Status == System.Net.WebExceptionStatus.Timeout) {
+                        SetStatus (Catalog.GetString ("Timed out getting item details from the Internet Archive"), true);
+                        CurrentMessage.AddAction (new MessageAction (Catalog.GetString ("Try Again"), (o, a) => Load ()));
+                    } else {
+                        SetStatus (Catalog.GetString ("Error getting item details from the Internet Archive"), true);
+                    }
+                });
+            }
+        }
+
+        public void Reload ()
+        {
+        }
+
+        public override string PreferencesPageId {
+            get { return Parent.PreferencesPageId; }
+        }
+
+        public override int Count {
+            get { return 0; }
+        }
+
+        public override int FilteredCount {
+            get { return track_model.Count; }
+        }
+
+        public TimeSpan Duration {
+            get {
+                TimeSpan duration = TimeSpan.Zero;
+                foreach (var t in track_model) {
+                    duration += t.Duration;
+                }
+                return duration;
+            }
+        }
+
+        public long FileSize {
+            get { return track_model.Sum (t => t.FileSize); }
+        }
+
+#region ITrackModelSource
+
+        public TrackListModel TrackModel {
+            get { return track_model; }
+        }
+
+        public bool HasDependencies { get { return false; } }
+
+        public void RemoveSelectedTracks () {}
+        public void DeleteSelectedTracks () {}
+
+        public bool ConfirmRemoveTracks { get { return false; } }
+
+        public bool Indexable { get { return false; } }
+
+        public bool ShowBrowser {
+            get { return false; }
+        }
+
+        public bool CanPlay {
+            get { return true; }
+        }
+
+        public bool CanShuffle {
+            get { return false; }
+        }
+
+        public bool CanRepeat {
+            get { return true; }
+        }
+
+        public bool CanAddTracks {
+            get { return false; }
+        }
+
+        public bool CanRemoveTracks {
+            get { return false; }
+        }
+
+        public bool CanDeleteTracks {
+            get { return false; }
+        }
+
+#endregion
+
+        public bool CanUnmap { get { return true; } }
+        public bool ConfirmBeforeUnmap { get { return false; } }
+
+        public bool Unmap ()
+        {
+            item.Delete ();
+            Parent.RemoveChildSource (this);
+            return true;
+        }
+
+        public override bool HasEditableTrackProperties {
+            get { return false; }
+        }
+
+        public override bool HasViewableTrackProperties {
+            get { return false; }
+        }
+
+        public override bool CanSearch {
+            get { return false; }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs
new file mode 100644
index 0000000..27923d8
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/DetailsView.cs
@@ -0,0 +1,541 @@
+//
+// DetailsView.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+using Gtk;
+
+using Hyena.Collections;
+using Hyena.Data.Sqlite;
+
+using Hyena.Data;
+using Hyena.Data.Gui;
+using Hyena.Widgets;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Gui;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class DetailsView : Gtk.HBox, Banshee.Sources.Gui.ISourceContents
+    {
+        private DetailsSource source;
+        private IA.Details details;
+        private Item item;
+
+        public DetailsView (DetailsSource source, Item item)
+        {
+            this.source = source;
+            this.item = item;
+
+            Spacing = 6;
+        }
+
+        public void UpdateDetails ()
+        {
+            details = item.Details;
+            BuildInfoBox ();
+            BuildFilesBox ();
+            ShowAll ();
+        }
+
+#region ISourceContents
+
+        public bool SetSource (ISource source)
+        {
+            this.source = source as DetailsSource;
+            return this.source != null;
+        }
+
+        public void ResetSource ()
+        {
+        }
+
+        public ISource Source { get { return source; } }
+
+        public Widget Widget { get { return this; } }
+
+#endregion
+
+        private Section CreateSection (string label, Widget child)
+        {
+            var section = new Section (label, child);
+            return section;
+        }
+
+        private class Section : VBox
+        {
+            public Section (string label, Widget child)
+            {
+                Spacing = 6;
+
+                Header = new SectionHeader (label, child);
+                PackStart (Header, false, false, 0);
+                PackStart (child, false, false, 0);
+            }
+
+            public SectionHeader Header { get; private set; }
+        }
+
+        private class SectionHeader : EventBox
+        {
+            Arrow arrow;
+            Label label;
+            Widget child;
+
+            public HBox Box { get; private set; }
+
+            public SectionHeader (string headerString, Widget child)
+            {
+                this.child = child;
+
+                AppPaintable = true;
+                CanFocus = true;
+
+                Box = new HBox ();
+                Box.Spacing = 6;
+                Box.BorderWidth = 4;
+                label = new Label ("<b>" + headerString + "</b>") { Xalign = 0f, UseMarkup = true };
+                arrow = new Arrow (ArrowType.Down, ShadowType.None);
+
+                Box.PackStart (arrow, false, false, 0);
+                Box.PackStart (label, true, true, 0);
+
+                State = StateType.Selected;
+
+                bool changing_style = false;
+                StyleSet += (o, a) => {
+                    if (!changing_style) {
+                        changing_style = true;
+                        ModifyBg (StateType.Normal, Style.Background (StateType.Selected));
+                        changing_style = false;
+                    }
+                };
+
+                Child = Box;
+
+                ButtonPressEvent += (o, a) => Toggle ();
+                KeyPressEvent += (o, a) => {
+                    var key = a.Event.Key;
+                    switch (key) {
+                        case Gdk.Key.Return:
+                        case Gdk.Key.KP_Enter:
+                        case Gdk.Key.space:
+                            Toggle ();
+                            a.RetVal = true;
+                            break;
+                    }
+                };
+            }
+
+            private void Toggle ()
+            {
+                Expanded = !Expanded;
+            }
+
+            private bool expanded = true;
+            private bool Expanded {
+                get { return expanded; }
+                set {
+                    arrow.ArrowType = value ? ArrowType.Down : ArrowType.Right;
+                    child.Visible = value;
+                    expanded = value;
+                }
+            }
+        }
+
+        private void BuildInfoBox ()
+        {
+            var frame = new Hyena.Widgets.RoundedFrame ();
+            var vbox = new VBox ();
+            vbox.Spacing = 6;
+            vbox.BorderWidth = 2;
+
+            // Description
+            var desc = new Hyena.Widgets.WrapLabel () {
+                Markup = String.Format ("{0}", GLib.Markup.EscapeText (Hyena.StringUtil.RemoveHtml (details.Description)))
+            };
+
+            var desc_expander = CreateSection (Catalog.GetString ("Description"), desc);
+
+            // Details
+            var table = new Banshee.Gui.TrackEditor.StatisticsPage () {
+                ShadowType = ShadowType.None,
+                BorderWidth = 0
+            };
+
+            table.NameRenderer.Scale = Pango.Scale.Medium;
+            table.ValueRenderer.Scale = Pango.Scale.Medium;
+
+            // Keep the table from needing to vertically scroll
+            table.Child.SizeRequested += (o, a) => {
+                table.SetSizeRequest (a.Requisition.Width, a.Requisition.Height);
+            };
+
+            AddToTable (table, Catalog.GetString ("Creator:"), details.Creator);
+            AddToTable (table, Catalog.GetString ("Venue:"), details.Venue);
+            AddToTable (table, Catalog.GetString ("Location:"), details.Coverage);
+            if (details.DateCreated != DateTime.MinValue) {
+                AddToTable (table, Catalog.GetString ("Date:"), details.DateCreated);
+            } else {
+                AddToTable (table, Catalog.GetString ("Year:"), details.Year);
+            }
+            AddToTable (table, Catalog.GetString ("Publisher:"), details.Publisher);
+            AddToTable (table, Catalog.GetString ("Keywords:"), details.Subject);
+            AddToTable (table, Catalog.GetString ("License URL:"), details.LicenseUrl);
+            AddToTable (table, Catalog.GetString ("Language:"), details.Language);
+
+            table.AddSeparator ();
+
+            AddToTable (table, Catalog.GetString ("Downloads, overall:"), details.DownloadsAllTime);
+            AddToTable (table, Catalog.GetString ("Downloads, past month:"), details.DownloadsLastMonth);
+            AddToTable (table, Catalog.GetString ("Downloads, past week:"), details.DownloadsLastWeek);
+
+            table.AddSeparator ();
+
+            AddToTable (table, Catalog.GetString ("Added:"),      details.DateAdded);
+            AddToTable (table, Catalog.GetString ("Added by:"),   details.AddedBy);
+            AddToTable (table, Catalog.GetString ("Collections:"),   details.Collections);
+            AddToTable (table, Catalog.GetString ("Source:"),     details.Source);
+            AddToTable (table, Catalog.GetString ("Contributor:"), details.Contributor);
+            AddToTable (table, Catalog.GetString ("Recorded by:"),details.Taper);
+            AddToTable (table, Catalog.GetString ("Lineage:"),    details.Lineage);
+            AddToTable (table, Catalog.GetString ("Transferred by:"), details.Transferer);
+
+            var details_expander = CreateSection (Catalog.GetString ("Details"), table);
+
+            // Reviews
+            Section reviews = null;
+            if (details.NumReviews > 0) {
+                string [] stars = {
+                    "\u2606\u2606\u2606\u2606\u2606",
+                    "\u2605\u2606\u2606\u2606\u2606",
+                    "\u2605\u2605\u2606\u2606\u2606",
+                    "\u2605\u2605\u2605\u2606\u2606",
+                    "\u2605\u2605\u2605\u2605\u2606",
+                    "\u2605\u2605\u2605\u2605\u2605"
+                };
+
+                var reviews_box = new VBox () { Spacing = 12, BorderWidth = 0 };
+                reviews = CreateSection (Catalog.GetString ("Reviews"), reviews_box);
+
+                var avg_label = new Label (String.Format (Catalog.GetPluralString (
+                    // Translators: {0} is the number of reviewers, {1} is the average rating (not really relevant if there's only 1)
+                    "{0} reviewer", "{0} reviewers, avg {1}", details.NumReviews),
+                    details.NumReviews, stars[Math.Max (0, Math.Min (5, (int)Math.Round (details.AvgRating)))]
+                ));
+                avg_label.TooltipText = String.Format ("{0:N2}", details.AvgRating);
+                avg_label.Xalign = 1.0f;
+                reviews.Header.Box.PackEnd (avg_label, false, false, 0);
+
+                var sb = new System.Text.StringBuilder ();
+                foreach (var review in details.Reviews) {
+                    //sb.Append ("<small>");
+
+                    var review_txt = new Hyena.Widgets.WrapLabel ();
+
+                    var title = review.Title;
+                    if (title != null) {
+                        sb.AppendFormat ("<b>{0}</b>\n", GLib.Markup.EscapeText (title));
+                    }
+
+                    // Translators: {0} is the unicode-stars-rating, {1} is the name of a person who reviewed this item, and {1} is a date/time string
+                    sb.AppendFormat (Catalog.GetString ("{0} by {1} on {2}"),
+                        stars[Math.Max (0, Math.Min (5, review.Stars))],
+                        GLib.Markup.EscapeText (review.Reviewer),
+                        GLib.Markup.EscapeText (review.DateReviewed.ToLocalTime ().ToShortDateString ())
+                    );
+
+                    var body = review.Body;
+                    if (body != null) {
+                        body = body.Replace ("\r\n", "\n");
+                        body = body.Replace ("\n\n", "\n");
+                        sb.Append ("\n");
+                        sb.Append (GLib.Markup.EscapeText (body));
+                    }
+
+                    //sb.Append ("</small>");
+                    review_txt.Markup = sb.ToString ();
+                    sb.Length = 0;
+
+                    reviews_box.PackStart (review_txt, false, false, 0);
+                }
+            }
+
+            // Packing
+            vbox.PackStart (desc_expander, true, true,  0);
+            vbox.PackStart (details_expander, true, true,  0);
+            if (reviews != null) {
+                vbox.PackStart (reviews, true, true, 0);
+            }
+
+            string write_review_url = String.Format ("http://www.archive.org/write-review.php?identifier={0}", item.Id);
+            var write_review_button = new LinkButton (write_review_url, Catalog.GetString ("Write your own review"));
+            write_review_button.Clicked += (o, a) => Banshee.Web.Browser.Open (write_review_url);
+            write_review_button.Xalign = 0f;
+            vbox.PackStart (write_review_button, false, false, 0);
+
+            var vbox2 = new VBox ();
+            vbox2.PackStart (vbox, false, false, 0);
+
+            var sw = new Gtk.ScrolledWindow () { ShadowType = ShadowType.None };
+            sw.AddWithViewport (vbox2);
+            (sw.Child as Viewport).ShadowType = ShadowType.None;
+            frame.Child = sw;
+            frame.ShowAll ();
+
+            sw.Child.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
+            sw.Child.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
+            sw.Child.ModifyText (StateType.Normal, Style.Text (StateType.Normal));
+            StyleSet += delegate {
+                sw.Child.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
+                sw.Child.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
+                sw.Child.ModifyText (StateType.Normal, Style.Text (StateType.Normal));
+            };
+
+            PackStart (frame, true, true, 0);
+        }
+
+        private void AddToTable (Banshee.Gui.TrackEditor.StatisticsPage table, string label, object val)
+        {
+            if (val != null) {
+                if (val is long) {
+                    table.AddItem (label, ((long)val).ToString ("N0"));
+                } else if (val is DateTime) {
+                    var dt = (DateTime)val;
+                    if (dt != DateTime.MinValue) {
+                        var local_dt = dt.ToLocalTime ();
+                        var str = dt.TimeOfDay == TimeSpan.Zero
+                            ? local_dt.ToShortDateString ()
+                            : local_dt.ToString ("g");
+                        table.AddItem (label, str);
+                    }
+                } else {
+                    table.AddItem (label, val.ToString ());
+                }
+            }
+        }
+
+        private void BuildFilesBox ()
+        {
+            var vbox = new VBox ();
+            vbox.Spacing = 6;
+
+            var file_list = new BaseTrackListView () {
+                HeaderVisible = true,
+                IsEverReorderable = false
+            };
+
+            var files_model = source.TrackModel as MemoryTrackListModel;
+            var columns = new DefaultColumnController ();
+            columns.TrackColumn.Title = "#";
+            var file_columns = new ColumnController ();
+            file_columns.AddRange (
+                columns.IndicatorColumn,
+                columns.TrackColumn,
+                columns.TitleColumn,
+                columns.DurationColumn,
+                columns.FileSizeColumn
+            );
+
+            foreach (var col in file_columns) {
+                col.Visible = true;
+            }
+
+            var file_sw = new Gtk.ScrolledWindow ();
+            file_sw.Child = file_list;
+
+            var tracks = new List<TrackInfo> ();
+
+            var files = new List<IA.DetailsFile> (details.Files);
+
+            string [] format_blacklist = new string [] { "metadata", "fingerprint", "checksums", "xml", "m3u", "dublin core", "unknown" };
+            var formats = new List<string> ();
+            foreach (var f in files) {
+                var track = new TrackInfo () {
+                    Uri         = new SafeUri (f.Location),
+                    FileSize    = f.Size,
+                    TrackNumber = f.Track,
+                    ArtistName  = f.Creator ?? details.Creator,
+                    AlbumTitle  = item.Title,
+                    TrackTitle  = f.Title,
+                    BitRate     = f.BitRate,
+                    MimeType    = f.Format,
+                    Duration    = f.Length
+                };
+
+                // Fix up duration/track#/title
+                if ((f.Length == TimeSpan.Zero || f.Title == null || f.Track == 0) && !f.Location.Contains ("zip") && !f.Location.EndsWith ("m3u")) {
+                    foreach (var b in files) {
+                        if ((f.Title != null && f.Title == b.Title)
+                                || (f.OriginalFile != null && b.Location != null && b.Location.EndsWith (f.OriginalFile))
+                                || (f.OriginalFile != null && f.OriginalFile == b.OriginalFile)) {
+                            if (track.Duration == TimeSpan.Zero)
+                                track.Duration = b.Length;
+
+                            if (track.TrackTitle == null)
+                                track.TrackTitle = b.Title;
+
+                            if (track.TrackNumber == 0)
+                                track.TrackNumber = b.Track;
+
+                            if (track.Duration != TimeSpan.Zero && track.TrackTitle != null && track.TrackNumber != 0)
+                                break;
+                        }
+                    }
+                }
+
+                track.TrackTitle = track.TrackTitle ?? System.IO.Path.GetFileName (f.Location);
+
+                tracks.Add (track);
+
+                if (f.Format != null && !formats.Contains (f.Format)) {
+                    if (!format_blacklist.Any (fmt => f.Format.ToLower ().Contains (fmt))) {
+                        formats.Add (f.Format);
+                    }
+                }
+            }
+
+            // Order the formats according to the preferences
+            string format_order = String.Format (", {0}, {1}, {2},", HomeSource.VideoTypes.Get (), HomeSource.AudioTypes.Get (), HomeSource.TextTypes.Get ()).ToLower ();
+
+            var sorted_formats = formats.Select (f => new { Format = f, Order = Math.Max (format_order.IndexOf (", " + f.ToLower () + ","), format_order.IndexOf (f.ToLower ())) })
+                                        .OrderBy (o => o.Order == -1 ? Int32.MaxValue : o.Order);
+
+            // See if all the files contain their track #
+            bool all_tracks_have_num_in_title = tracks.All (t => t.TrackNumber == 0 || t.TrackTitle.Contains (t.TrackNumber.ToString ()));
+
+            // Make these columns snugly fix their data
+            if (tracks.Count > 0) {
+                SetWidth (columns.TrackColumn,    all_tracks_have_num_in_title ? 0 : tracks.Max (f => f.TrackNumber), 0);
+                SetWidth (columns.FileSizeColumn, tracks.Max (f => f.FileSize), 0);
+                SetWidth (columns.DurationColumn, tracks.Max (f => f.Duration), TimeSpan.Zero);
+            }
+
+            string max_title = "     ";
+            if (tracks.Count > 0) {
+                var sorted_by_title = files.Where (t => !t.Location.Contains ("zip"))
+                                           .OrderBy (f => f.Title == null ? 0 : f.Title.Length)
+                                           .ToList ();
+                string nine_tenths = sorted_by_title[(int)Math.Floor (.90 * sorted_by_title.Count)].Title ?? "";
+                string max = sorted_by_title[sorted_by_title.Count - 1].Title ?? "";
+                max_title = ((double)max.Length >= (double)(1.6 * (double)nine_tenths.Length)) ? nine_tenths : max;
+            }
+            (columns.TitleColumn.GetCell (0) as ColumnCellText).SetMinMaxStrings (max_title);
+
+            file_list.ColumnController = file_columns;
+            file_list.SetModel (files_model);
+
+            var format_list = ComboBox.NewText ();
+            format_list.RowSeparatorFunc = (model, iter) => {
+                return (string)model.GetValue (iter, 0) == "---";
+            };
+
+            bool have_sep = false;
+            int active_format = 0;
+            foreach (var fmt in sorted_formats) {
+                if (fmt.Order == -1 && !have_sep) {
+                    have_sep = true;
+                    if (format_list.Model.IterNChildren () > 0) {
+                        format_list.AppendText ("---");
+                    }
+                }
+
+                format_list.AppendText (fmt.Format);
+
+                if (active_format == 0 && fmt.Format == item.SelectedFormat) {
+                    active_format = format_list.Model.IterNChildren () - 1;
+                }
+            }
+
+            format_list.Changed += (o, a) => {
+                files_model.Clear ();
+
+                var selected_fmt = format_list.ActiveText;
+                foreach (var track in tracks) {
+                    if (track.MimeType == selected_fmt) {
+                        files_model.Add (track);
+                    }
+                }
+
+                files_model.Reload ();
+
+                item.SelectedFormat = selected_fmt;
+                item.Save ();
+            };
+
+            if (formats.Count > 0) {
+                format_list.Active = active_format;
+            }
+
+            vbox.PackStart (file_sw, true, true, 0);
+            vbox.PackStart (format_list, false, false, 0);
+
+            file_list.SizeAllocated += (o, a) => {
+                int target_list_width = file_list.MaxWidth;
+                if (file_sw.VScrollbar != null && file_sw.VScrollbar.IsMapped) {
+                    target_list_width += file_sw.VScrollbar.Allocation.Width + 2;
+                }
+
+                // Don't let the track list be too wide
+                target_list_width = Math.Min (target_list_width, (int) (0.5 * (double)Allocation.Width));
+
+                if (a.Allocation.Width != target_list_width && target_list_width > 0) {
+                    file_sw.SetSizeRequest (target_list_width, -1);
+                }
+            };
+
+            PackStart (vbox, false, false, 0);
+        }
+
+        private void SetWidth<T> (Column col, T max, T zero)
+        {
+            (col.GetCell (0) as ColumnCellText).SetMinMaxStrings (max, max);
+            if (zero.Equals (max)) {
+                col.Visible = false;
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
new file mode 100644
index 0000000..593268a
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
@@ -0,0 +1,189 @@
+//
+// HeaderFilters.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Gtk;
+using Mono.Unix;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class HeaderFilters : HBox
+    {
+        private SearchSource source;
+
+        private ComboBox sort_combo, media_type_combo;
+        private TreeStore media_type_store;
+        private Banshee.Widgets.SearchEntry search_entry;
+        private Button search_button;
+
+        private Dictionary<IA.FieldValue, TreeIter> mediatypes;
+        private TreeIter all_iter;
+
+        public Widget SearchEntry {
+            get { return search_entry; }
+        }
+
+        public HeaderFilters (SearchSource source)
+        {
+            this.source = source;
+            source.Updated += (o, a) => {
+                var s = source.SearchDescription;
+                if (s != null) {
+                    var iter = s.MediaType == null ? all_iter : mediatypes[s.MediaType];
+                    media_type_combo.SetActiveIter (iter);
+                    sort_combo.Active = Math.Max (Array.IndexOf (sorts, s.Sort), 0);
+                    search_entry.Query = s.Query ?? "";
+                }
+            };
+
+            Spacing = 6;
+
+            PackStart (new Label () { Visible = true }, true, true, 0);
+            BuildMediaTypeCombo ();
+            BuildSortCombo ();
+            BuildSearchEntry ();
+            BuildSearchButton ();
+        }
+
+        private void BuildMediaTypeCombo ()
+        {
+            var store = media_type_store = new TreeStore (typeof (IA.MediaType), typeof (string));
+            var combo = media_type_combo = new ComboBox ();
+            combo.Model = store;
+
+            all_iter = store.AppendValues (null, Catalog.GetString ("All"));
+
+            mediatypes = new Dictionary<IA.FieldValue, TreeIter> ();
+            foreach (var mediatype in IA.MediaType.Options.OrderBy (t => t.Name)) {
+                if (mediatype.Id != "software") {
+                    var iter = store.AppendValues (mediatype, mediatype.Name);
+                    mediatypes.Add (mediatype, iter);
+
+                    if (mediatype.Children != null) {
+                        foreach (var child in mediatype.Children.OrderBy (t => t.Name)) {
+                            var child_iter = store.AppendValues (iter, child, child.Name);
+                            mediatypes.Add (child, child_iter);
+
+                            // FIXME should remember the last selected one in a schema or per-source in the db
+                            if (child.Id == "etree")
+                                combo.SetActiveIter (child_iter);
+                        }
+                    }
+                }
+            }
+
+            var cell = new CellRendererText ();
+            combo.PackStart (cell, true);
+            combo.AddAttribute (cell, "text", 1);
+
+            PackStart (new Label (Catalog.GetString ("Collection:")), false, false, 0);
+            PackStart (combo, false, false, 0);
+        }
+
+        private void BuildSearchEntry ()
+        {
+            var entry = search_entry = new Banshee.Widgets.SearchEntry () {
+                WidthRequest = 150,
+                Visible = true,
+                EmptyMessage = String.Format (Catalog.GetString ("Optional Query"))
+            };
+
+            entry.Activated += (o, a) => { search_button.Activate (); };
+
+            // Add 'filter' items
+            var filter_fields = new List<IA.Field> ();
+            int i = 0;
+            foreach (var field in IA.Field.Fields.Where (f => (f != IA.Field.Collection && f != IA.Field.Identifier))) {
+                filter_fields.Add (field);
+                entry.AddFilterOption (i++, field.Name);
+            }
+
+            // Add the Help item
+            entry.Menu.Append (new SeparatorMenuItem ());
+            var help_item = new ImageMenuItem (Catalog.GetString ("_Help")) {
+                Image = new Image ("gtk-help", IconSize.Menu)
+            };
+            help_item.Activated += delegate { Banshee.Web.Browser.Open ("http://www.archive.org/advancedsearch.php"); };
+            entry.Menu.Append (help_item);
+            entry.Menu.ShowAll ();
+
+            entry.FilterChanged += (o, a) => {
+                // Only prepend the filter: part if the query doesn't already end in a :
+                string prev_query = entry.Query.EndsWith (":") ? null : entry.Query;
+                entry.Query = String.Format ("{0}:{1}", filter_fields[entry.ActiveFilterID].Id, prev_query);
+
+                var editable = entry.InnerEntry as Editable;
+                if (editable != null) {
+                    editable.Position = entry.Query.Length;
+                }
+            };
+
+            PackStart (entry, false, false, 0);
+        }
+
+        private void BuildSortCombo ()
+        {
+            var combo = sort_combo = ComboBox.NewText ();
+
+            foreach (var sort in sorts) {
+                combo.AppendText (sort.Name);
+            }
+            combo.Active = 0;
+
+            PackStart (new Label (Catalog.GetString ("Sort by:")), false, false, 0);
+            PackStart (combo, false, false, 0);
+        }
+
+        private void BuildSearchButton ()
+        {
+            var button = search_button = new Hyena.Widgets.ImageButton (Catalog.GetString ("_Search"), Stock.Find);
+            button.Clicked += (o, a) => UpdateSearch ();
+
+            PackStart (button, false, false, 0);
+        }
+
+        private static IA.Sort [] sorts = { IA.Sort.DownloadsDesc, IA.Sort.WeekDesc, IA.Sort.DateCreatedDesc, IA.Sort.DateCreatedAsc, IA.Sort.DateAddedDesc, IA.Sort.TitleAsc, IA.Sort.AvgRatingDesc };
+
+        private void UpdateSearch ()
+        {
+            IA.FieldValue media_type = null;
+            TreeIter iter;
+            if (media_type_combo.GetActiveIter (out iter)) {
+                media_type = media_type_store.GetValue (iter, 0) as IA.FieldValue;
+            }
+
+            var settings = new SearchDescription (null, search_entry.Query, sorts[sort_combo.Active], media_type);
+            source.SetSearch (settings);
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs
new file mode 100644
index 0000000..1a4c43e
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeSource.cs
@@ -0,0 +1,164 @@
+//
+// HomeSource.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Collections;
+using Hyena.Data;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class HomeSource : Banshee.Sources.Source, IDisposable
+    {
+        private static string name = Catalog.GetString ("Internet Archive");
+        private SearchSource search_source;
+        private Actions actions;
+
+        public SearchSource SearchSource {
+            get { return search_source; }
+        }
+
+        public HomeSource () : base (name, name, 190, "internet-archive")
+        {
+            InstallPreferences ();
+
+            //Properties.SetStringList ("Icon.Name", "video-x-generic", "video", "source-library");
+            Properties.SetString ("ActiveSourceUIResource", "HomeSourceActiveUI.xml");
+            Properties.SetString ("GtkActionPath", "/IaHomeSourcePopup");
+            Properties.Set<Gtk.Widget> ("Nereid.SourceContents", new HomeView (this));
+
+            actions = new Actions (this);
+
+            foreach (var item in Item.LoadAll ()) {
+                AddChildSource (new DetailsSource (item));
+            }
+        }
+
+        public void SetSearch (SearchDescription search)
+        {
+            if (search_source == null) {
+                search_source = new SearchSource ();
+                AddChildSource (search_source);
+            }
+
+            SearchSource.SetSearch (search);
+        }
+
+        public override int Count {
+            get { return 0; }
+        }
+
+        public void Dispose ()
+        {
+            UninstallPreferences ();
+
+            if (actions != null) {
+                actions.Dispose ();
+            }
+        }
+
+#region Preferences
+
+        private SourcePage pref_page;
+        private Section pref_section;
+
+        private void InstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null) {
+                return;
+            }
+
+            pref_page = new Banshee.Preferences.SourcePage (this);
+
+            pref_section = pref_page.Add (new Section ("mediatypes", Catalog.GetString ("Preferred Media Types"), 20));
+
+            pref_section.Add (new SchemaPreference<string> (AudioTypes,
+                Catalog.GetString ("_Audio"), Catalog.GetString ("")));
+
+            pref_section.Add (new SchemaPreference<string> (VideoTypes,
+                Catalog.GetString ("_Video"), Catalog.GetString ("")));
+
+            pref_section.Add (new SchemaPreference<string> (TextTypes,
+                Catalog.GetString ("_Text"), Catalog.GetString ("")));
+        }
+
+        private void UninstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null || pref_page == null) {
+                return;
+            }
+
+            pref_page.Dispose ();
+            pref_page = null;
+            pref_section = null;
+        }
+
+        public override string PreferencesPageId {
+            get { return pref_page.Id; }
+        }
+
+        public static readonly SchemaEntry<string> AudioTypes = new SchemaEntry<string> (
+            "plugins.internetarchive", "audio_types",
+            "Audio, VBR Mp3, Ogg Vorbis, 128Kbps MP3,  64Kbps MP3, Flac, VBR ZIP, 64Kbps MP3 ZIP",
+            "Ordered list of preferred mediatypes for audio items", null);
+
+        public static readonly SchemaEntry<string> VideoTypes = new SchemaEntry<string> (
+            "plugins.internetarchive", "video_types",
+            "Ogg Video, 512Kb MPEG4, MPEG2, h.264 MPEG4, DivX, Quicktime, MPEG1",
+            "Ordered list of preferred mediatypes for video items", null);
+
+        public static readonly SchemaEntry<string> TextTypes = new SchemaEntry<string> (
+            "plugins.internetarchive", "text_types",
+            "Text PDF, Standard LuraTech PDF, Grayscale LuraTech PDF, Image Container PDF, ZIP, Text, Hypertext",
+            "Ordered list of preferred mediatypes for text items", null);
+
+#endregion
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs
new file mode 100644
index 0000000..52bfc9f
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HomeView.cs
@@ -0,0 +1,345 @@
+//
+// HomeView.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+using Gtk;
+
+using Hyena.Collections;
+using Hyena.Data.Sqlite;
+
+using Hyena.Data;
+using Hyena.Data.Gui;
+using Hyena.Widgets;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Gui;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+using Banshee.Widgets;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class HomeView : Gtk.HBox, Banshee.Sources.Gui.ISourceContents
+    {
+        private HomeSource source;
+
+        public HomeView (HomeSource source)
+        {
+            this.source = source;
+
+            //var sw = new Gtk.ScrolledWindow ();
+            //sw.BorderWidth = 4;
+            //sw.AddWithViewport (Build ());
+
+            var frame = new Hyena.Widgets.RoundedFrame ();
+            frame.Child = Build ();
+
+            PackStart (frame, true, true, 0);
+            ShowAll ();
+        }
+
+        private Widget Build ()
+        {
+            var hbox = new HBox () { Spacing = 8, BorderWidth = 4 };
+
+            hbox.PackStart (BuildTiles (), false, false, 0);
+            hbox.PackStart (BuildCenter (), true, true, 0);
+
+            return hbox;
+        }
+
+        private Widget BuildCenter ()
+        {
+            var vbox = new VBox () { Spacing = 2 };
+
+            // Search entry/button
+            var search_box = new HBox () { Spacing = 6, BorderWidth = 4 };
+            var entry = new Banshee.Widgets.SearchEntry () {
+                Visible = true,
+                EmptyMessage = String.Format (Catalog.GetString ("Search..."))
+            };
+
+            // Make the search entry text nice and big
+            var font = entry.InnerEntry.Style.FontDescription.Copy ();
+            font.Size = (int) (font.Size * Pango.Scale.XLarge);
+            entry.InnerEntry.ModifyFont (font);
+
+            var button = new Hyena.Widgets.ImageButton (Catalog.GetString ("_Go"), Stock.Find);
+            entry.Activated += (o, a) => { button.Activate (); };
+            button.Clicked += (o, a) => source.SetSearch (new SearchDescription (null, entry.Query, IA.Sort.DownloadsDesc, null));
+
+            search_box.PackStart (entry, true, true, 0);
+            search_box.PackStart (button, false, false, 0);
+
+            var example_searches = new SearchDescription [] {
+                new SearchDescription (Catalog.GetString ("Staff Picks"), "pick:1", IA.Sort.WeekDesc, null),
+                new SearchDescription (Catalog.GetString ("Creative Commons"), "license:creativecommons", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("History"), "subject:history", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("Classic Cartoons"), "", IA.Sort.DateCreatedAsc, IA.MediaType.Get ("animationandcartoons")),
+                new SearchDescription (Catalog.GetString ("Speeches"), "subject:speeches OR title:speech", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("For Children"), "subject:children", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("Poetry"), "subject:poetry", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("Creator is United States"), "creator:\"United States\"", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("Old Movies"), "", IA.Sort.DateCreatedAsc, IA.MediaType.Get ("moviesandfilms")),
+                new SearchDescription (Catalog.GetString ("New From LibriVox"), "publisher:LibriVox", IA.Sort.DateAddedDesc, IA.MediaType.Get ("audio")),
+                new SearchDescription (Catalog.GetString ("Old Texts"), "", IA.Sort.DateCreatedAsc, IA.MediaType.Get ("texts")),
+                new SearchDescription (Catalog.GetString ("Charlie Chaplin"), "\"Charlie Chaplin\"", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("NASA"), "NASA", IA.Sort.DownloadsDesc, null),
+                new SearchDescription (Catalog.GetString ("Library of Congress"), "creator:\"Library of Congress\"", IA.Sort.DownloadsDesc, null)
+            };
+
+            var examples = new FlowBox () { Spacing = 0 };
+            examples.Add (PaddingBox (new Label () { Markup = "Examples:" }));
+
+            foreach (var search in example_searches) {
+                var this_search = search;
+                var link = CreateLink (search.Name, search.Query);
+                link.TooltipText = search.Query;
+                link.Clicked += (o, a) => source.SetSearch (this_search);
+                examples.Add (link);
+            }
+
+            // Intro text and visit button
+            var intro_label = new Hyena.Widgets.WrapLabel () {
+                Markup = Catalog.GetString ("The Internet Archive, a 501(c)(3) non-profit, is building a digital library of Internet sites and other cultural artifacts in digital form. Like a paper library, we provide free access to researchers, historians, scholars, and the general public.")
+            };
+
+            var visit_button = new LinkButton ("http://archive.org/", Catalog.GetString ("Visit the Internet Archive online at archive.org"));
+            visit_button.Clicked += (o, a) => Banshee.Web.Browser.Open ("http://archive.org/");
+            visit_button.Xalign = 0f;
+            var visit_box = new HBox ();
+            visit_box.PackStart (visit_button, false, false, 0);
+            visit_box.PackStart (new Label () { Visible = true }, true, true, 0);
+
+            // Packing
+            vbox.PackStart (search_box, false, false, 0);
+            vbox.PackStart (examples, false, false, 0);
+            vbox.PackStart (PaddingBox (new HSeparator ()), false, false, 6);
+            vbox.PackStart (PaddingBox (intro_label), false, false, 0);
+            vbox.PackStart (visit_box, false, false, 0);
+
+            return vbox;
+        }
+
+        private Widget PaddingBox (Widget child)
+        {
+            var box = new HBox () { BorderWidth = 4 };
+            box.PackStart (child, true, true, 0);
+            child.Show ();
+            box.Show ();
+            return box;
+        }
+
+        public class FlowBox : VBox
+        {
+            private List<HBox> rows = new List<HBox> ();
+            private List<Widget> children = new List<Widget> ();
+
+            private int hspacing;
+            public int HSpacing {
+                get { return hspacing; }
+                set {
+                    hspacing = value;
+                    foreach (var box in rows) {
+                        box.Spacing = hspacing;
+                    }
+                }
+            }
+
+            public FlowBox ()
+            {
+                HSpacing = 2;
+                Spacing = 2;
+
+                bool updating_layout = false;
+                SizeAllocated += (o, a) => {
+                    if (!updating_layout) {
+                        updating_layout = true;
+                        UpdateLayout ();
+                        updating_layout = false;
+                    }
+                };
+            }
+
+            public new void Add (Widget widget)
+            {
+                children.Add (widget);
+                UpdateLayout ();
+            }
+
+            private void UpdateLayout ()
+            {
+                if (Allocation.Width < 2)
+                    return;
+
+                int width = Allocation.Width;
+                int y = 0;
+                int x = 0;
+                int j = 0;
+                foreach (var widget in children) {
+                    x += widget.Allocation.Width + hspacing;
+                    if (x > width) {
+                        y++;
+                        j = 0;
+                        x = widget.Allocation.Width;
+                    }
+
+                    Reparent (widget, GetRow (y), j);
+                    j++;
+                }
+
+                for (int i = y + 1; i < rows.Count; i++) {
+                    var row = GetRow (i);
+                    rows.Remove (row);
+                    Remove (row);
+                }
+            }
+
+            private void Reparent (Widget widget, HBox box, int index)
+            {
+                if (widget.Parent == box) {
+                    return;
+                }
+
+                if (widget.Parent == null) {
+                    box.PackStart (widget, false, false, 0);
+                } else {
+                    widget.Reparent (box);
+                    box.SetChildPacking (widget, false, false, 0, PackType.Start);
+                }
+
+                box.ReorderChild (widget, index);
+                widget.Show ();
+            }
+
+            private HBox GetRow (int i)
+            {
+                if (i < rows.Count) {
+                    return rows[i];
+                } else {
+                    var box = new HBox () { Spacing = HSpacing };
+                    rows.Add (box);
+                    PackStart (box, false, false, 0);
+                    box.Show ();
+                    return box;
+                }
+            }
+        }
+
+        private Button CreateLink (string title, string url)
+        {
+            var button = new LinkButton (url, "") {
+                Relief = ReliefStyle.None,
+            };
+
+            var label = button.Child as Label;
+            if (label != null) {
+                label.Markup = title;//"<small>" + title + "</small>";
+            }
+            return button;
+        }
+
+        private class Category : SearchDescription
+        {
+            public long Count { get; private set; }
+            public string IconName { get; private set; }
+
+            public Category (string media_type, string name, int count, string icon_name)
+                : this (media_type, name, null, count, icon_name) {}
+
+            public Category (string media_type, string name, string query, int count, string icon_name)
+                : base (name, query, IA.Sort.DownloadsDesc, IA.MediaType.Get (media_type))
+            {
+                Count = count;
+                IconName = icon_name;
+            }
+        }
+
+        private Widget BuildTiles ()
+        {
+            var vbox = new VBox () { Spacing = 12, BorderWidth = 4 };
+
+            var categories = new Category [] {
+                new Category ("audio_bookspoetry", Catalog.GetString ("Audiobooks"), 4300, "audio-x-generic"),
+                new Category ("movies", Catalog.GetString ("Movies"), 200000, "video-x-generic"),
+                new Category (null, Catalog.GetString ("Lectures"), "subject:ocw OR creator:university OR mediatype:education OR publisher:University", 1290, "x-office-presentation"),
+                new Category ("etree", Catalog.GetString ("Concerts"), 69000, "audio-x-generic"),
+                new Category ("texts", Catalog.GetString ("Books"), 1600000, "x-office-document")
+            };
+
+            foreach (var cat in categories.OrderBy (c => c.Name)) {
+                var this_cat = cat;
+                var tile = new ImageButton (cat.Name, cat.IconName) {
+                    InnerPadding = 4
+                };
+                tile.LabelWidget.Xalign = 0;
+                tile.Clicked += (o, a) => source.SetSearch (this_cat);
+
+                vbox.PackStart (tile, false, false, 0);
+            }
+
+            return vbox;
+        }
+
+#region ISourceContents
+
+        public bool SetSource (ISource source)
+        {
+            this.source = source as HomeSource;
+            return this.source != null;
+        }
+
+        public void ResetSource ()
+        {
+            source = null;
+        }
+
+        public ISource Source { get { return source; } }
+
+        public Widget Widget { get { return this; } }
+
+#endregion
+
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Item.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Item.cs
new file mode 100644
index 0000000..e6b65c2
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Item.cs
@@ -0,0 +1,157 @@
+//
+// Item.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Collections;
+using Hyena.Data.Sqlite;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class Item
+    {
+        public static Item LoadOrCreate (string id, string title, string mediaType)
+        {
+            var item = Provider.FetchFirstMatching ("ID = ?", id);
+            if (item == null) {
+                item = new Item (id, title, mediaType);
+                item.Save ();
+            }
+
+            return item;
+        }
+
+        public static IEnumerable<Item> LoadAll ()
+        {
+            return Provider.FetchAll ();
+        }
+
+        [DatabaseColumn("ItemId", Constraints = DatabaseColumnConstraints.PrimaryKey)]
+        private int DbId { get; set; }
+
+        [DatabaseColumn]
+        private string DetailsJson { get; set; }
+
+        [DatabaseColumn]
+        public string Id { get; private set; }
+
+        [DatabaseColumn]
+        public string Title { get; private set; }
+
+        [DatabaseColumn]
+        public string MediaType { get; private set; }
+
+        [DatabaseColumn]
+        public string SelectedFormat { get; set; }
+
+        [DatabaseColumn]
+        public string BookmarkFile { get; set; }
+
+        [DatabaseColumn]
+        public int BookmarkPosition { get; set; }
+
+        public IA.Details Details { get; private set; }
+
+        public Item () {}
+
+        private Item (string id, string title, string mediaType)
+        {
+            Id = id;
+            Title = title;
+            MediaType = mediaType;
+        }
+
+        public void Delete ()
+        {
+            Provider.Delete (this);
+        }
+
+        public void LoadDetails ()
+        {
+            if (Details == null) {
+                Details = new IA.Details (Id, DetailsJson);
+                DetailsJson = Details.Json;
+                Save ();
+            }
+        }
+
+        public void Save ()
+        {
+            Provider.Save (this);
+        }
+
+        private static SqliteModelProvider<Item> provider;
+        private static SqliteModelProvider<Item> Provider {
+            get {
+                if (provider == null) {
+                    provider = new SqliteModelProvider<Item> (ServiceManager.DbConnection, "IaItems", false);
+                }
+                return provider;
+            }
+        }
+
+        static Item () {
+            var db = ServiceManager.DbConnection;
+            if (!db.TableExists ("IaItems")) {
+                db.Execute (@"
+                    CREATE TABLE IaItems (
+                        ItemID         INTEGER PRIMARY KEY,
+                        ID             TEXT UNIQUE NOT NULL,
+                        Title          TEXT NOT NULL,
+                        MediaType      TEXT,
+                        DetailsJson    TEXT,
+
+                        SelectedFormat TEXT,
+                        BookmarkFile   TEXT,
+                        BookmarkPosition INTEGER DEFAULT 0
+                    )"
+                );
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchDescription.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchDescription.cs
new file mode 100644
index 0000000..de87c49
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchDescription.cs
@@ -0,0 +1,76 @@
+//
+// SearchDescription.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class SearchDescription
+    {
+        public string  Name  { get; set; }
+        public string  Query { get; set; }
+        public IA.Sort Sort  { get; set; }
+        public IA.FieldValue MediaType  { get; set; }
+
+        public SearchDescription (string name, string query, IA.Sort sort, IA.FieldValue type)
+        {
+            Name = name;
+            Query = query;
+            Sort = sort;
+            MediaType = type;
+        }
+
+        public void ApplyTo (IA.Search search)
+        {
+            search.Sorts.Clear ();
+
+            search.Sorts.Add (Sort);
+
+            // And if the above sort value is the same for two items, sort by creator then by title
+            search.Sorts.Add (IA.Sort.CreatorAsc);
+            search.Sorts.Add (IA.Sort.TitleAsc);
+
+            string query = MediaType != null ? MediaType.ToString () + " AND " : "";
+
+            // Remove medialess 'collection' results
+            query += "-mediatype:collection";
+
+            if (!String.IsNullOrEmpty (Query)) {
+                query += String.Format (" AND {0}", Query);
+            }
+
+            search.Query = query;
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs
new file mode 100644
index 0000000..ec0195f
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchSource.cs
@@ -0,0 +1,219 @@
+//
+// SearchSource.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Collections;
+using Hyena.Data;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class SearchSource : Banshee.Sources.Source
+    {
+        private static string name = Catalog.GetString ("Search Results");
+        private MemoryListModel<IA.SearchResult> model = new MemoryListModel<IA.SearchResult> ();
+
+        private Gtk.Widget header_widget;
+        private IA.Search search;
+        private string status_text = "";
+
+        private int total_results = 0;
+        public int TotalResults { get { return total_results; } }
+
+        public IA.Search Search { get { return search; } }
+        public SearchDescription SearchDescription { get; private set; }
+
+        public IListModel<IA.SearchResult> Model { get { return model; } }
+
+        public IA.SearchResult FocusedItem {
+            get {
+                int focus = model.Selection.FocusedIndex;
+                if (focus >= 0 && focus < model.Count) {
+                    return model[focus];
+                }
+
+                return null;
+            }
+        }
+
+        public SearchSource () : base (name, name, 190, "internet-archive-search")
+        {
+            IA.Search.UserAgent = Banshee.Web.Browser.UserAgent;
+            IA.Search.TimeoutMs = 12*1000;
+
+            search = new IA.Search () { NumResults = 100 };
+
+            Properties.SetStringList ("Icon.Name", "search", "gtk-search");
+
+            Properties.SetString ("ActiveSourceUIResource", "SearchSourceActiveUI.xml");
+            Properties.SetString ("GtkActionPath", "/IaSearchSourcePopup");
+
+            if (header_widget == null) {
+                header_widget = new HeaderFilters (this);
+                header_widget.ShowAll ();
+                Properties.Set<Gtk.Widget> ("Nereid.SourceContents.HeaderWidget", header_widget);
+            }
+
+            Properties.Set<Gtk.Widget> ("Nereid.SourceContents", new SearchView (this));
+        }
+
+        public void SetSearch (SearchDescription settings)
+        {
+            SearchDescription = settings;
+            settings.ApplyTo (Search);
+            Reload ();
+            OnUpdated ();
+            ServiceManager.SourceManager.SetActiveSource (this);
+        }
+
+        public void Reload ()
+        {
+            model.Clear ();
+            ThreadAssist.SpawnFromMain (delegate {
+                ThreadedFetch (0);
+            });
+        }
+
+        public void FetchMore ()
+        {
+            ThreadAssist.SpawnFromMain (delegate {
+                ThreadedFetch (search.Page + 1);
+            });
+        }
+
+        private void ThreadedFetch (int page)
+        {
+            bool success = false;
+            total_results = 0;
+            status_text = "";
+            Exception err = null;
+            int old_page = search.Page;
+            search.Page = page;
+
+            ThreadAssist.ProxyToMain (delegate {
+                SetStatus (Catalog.GetString ("Searching the Internet Archive"), false, true, "gtk-find");
+            });
+
+            IA.SearchResults results = null;
+
+            try {
+                results = search.GetResults ();
+                total_results = results.TotalResults;
+            } catch (System.Net.WebException e) {
+                Hyena.Log.Exception ("Error searching the Internet Archive", e);
+                results = null;
+                err = e;
+            }
+
+            if (results != null) {
+                try {
+
+                    foreach (var result in results) {
+                        model.Add (result);
+
+                        // HACK to remove ugly empty description
+                        //if (track.Comment == "There is currently no description for this item.")
+                            //track.Comment = null;
+                    }
+
+                    success = true;
+                } catch (Exception e) {
+                    err = e;
+                    Hyena.Log.Exception ("Error searching the Internet Archive", e);
+                }
+            }
+
+            if (success) {
+                int count = model.Count;
+                if (total_results == 0) {
+                    ThreadAssist.ProxyToMain (delegate {
+                        SetStatus (Catalog.GetString ("No matches."), false, false, "gtk-info");
+                    });
+                } else {
+                    ThreadAssist.ProxyToMain (ClearMessages);
+                    status_text = String.Format (Catalog.GetPluralString (
+                        "Showing 1 match", "Showing 1 to {0:N0} of {1:N0} total matches", total_results),
+                        count, total_results
+                    );
+                }
+            } else {
+                search.Page = old_page;
+                ThreadAssist.ProxyToMain (delegate {
+                    var web_e = err as System.Net.WebException;
+                    if (web_e != null && web_e.Status == System.Net.WebExceptionStatus.Timeout) {
+                        SetStatus (Catalog.GetString ("Timed out searching the Internet Archive"), true);
+                        CurrentMessage.AddAction (new MessageAction (Catalog.GetString ("Try Again"), (o, a) => {
+                            if (page == 0) Reload (); else FetchMore ();
+                        }));
+                    } else {
+                        SetStatus (Catalog.GetString ("Error searching the Internet Archive"), true);
+                    }
+                });
+            }
+
+            ThreadAssist.ProxyToMain (delegate {
+                model.Reload ();
+                OnUpdated ();
+            });
+        }
+
+        public override string PreferencesPageId {
+            get { return Parent.PreferencesPageId; }
+        }
+
+        public override int Count {
+            get { return 0; }
+        }
+
+        protected override int StatusFormatsCount { get { return 1; } }
+
+        public override string GetStatusText ()
+        {
+            return status_text;
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs
new file mode 100644
index 0000000..427a0a7
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/SearchView.cs
@@ -0,0 +1,177 @@
+//
+// SearchView.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+using Gtk;
+
+using Hyena.Collections;
+using Hyena.Data.Sqlite;
+
+using Hyena.Data;
+using Hyena.Data.Gui;
+using Hyena.Widgets;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Gui;
+using Banshee.Collection.Database;
+using Banshee.Configuration;
+using Banshee.Database;
+using Banshee.Gui;
+using Banshee.Library;
+using Banshee.MediaEngine;
+using Banshee.PlaybackController;
+using Banshee.Playlist;
+using Banshee.Preferences;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+using IA=InternetArchive;
+
+namespace Banshee.InternetArchive
+{
+    public class SearchView : Gtk.HBox, Banshee.Sources.Gui.ISourceContents
+    {
+        private SearchSource source;
+        private ListView<IA.SearchResult> list_view;
+
+        public SearchView (SearchSource source)
+        {
+            this.source = source;
+
+            list_view = new ResultListView ();
+            var controller = new PersistentColumnController ("InternetArchive");
+            list_view.ColumnController = controller;
+            AddColumns ();
+            controller.Load ();
+
+            list_view.RowActivated += (o, a) => {
+                ServiceManager.Get<InterfaceActionService> ()["InternetArchive.ViewItemDetails"].Activate ();
+            };
+
+            list_view.SetModel (source.Model);
+
+            // Packing
+            var sw = new Gtk.ScrolledWindow ();
+            sw.Child = list_view;
+
+            var last_hid_more = DateTime.MinValue;
+            string more_text = Catalog.GetString ("Fetch more results from the Internet Archive?");
+            list_view.Vadjustment.ValueChanged += (o, a) => {
+                var adj = list_view.Vadjustment;
+                if ((DateTime.Now - last_hid_more).TotalSeconds > 2 && adj.Value >= adj.Upper - adj.PageSize) {
+                    if (source.TotalResults > source.Model.Count) {
+                        source.SetStatus (more_text, true, false, "gtk-question");
+                        source.CurrentMessage.AddAction (new MessageAction (Catalog.GetString ("Fetch More"), delegate { source.FetchMore (); }));
+                    }
+                }
+            };
+
+            source.MessageNotify += (o, a) => {
+                if (source.CurrentMessage != null && source.CurrentMessage.Text == more_text && source.CurrentMessage.IsHidden) {
+                    last_hid_more = DateTime.Now;
+                }
+            };
+
+            PackStart (sw, true, true, 0);
+            ShowAll ();
+        }
+
+        private class ResultListView : ListView<IA.SearchResult>
+        {
+            public ResultListView ()
+            {
+                RulesHint = true;
+                IsEverReorderable = false;
+            }
+
+            protected override bool OnPopupMenu ()
+            {
+                ServiceManager.Get<InterfaceActionService> ()["InternetArchive.IaResultPopup"].Activate ();
+                return true;
+            }
+        }
+
+        private void AddColumns ()
+        {
+            var cols = new SortableColumn [] {
+                Create ("Title",       Catalog.GetString ("Title"), 0.9, true, new ColumnCellText (null, true)),
+                Create ("Creator",     Catalog.GetString ("Creator"), 0.15, true, new ColumnCellText (null, true)),
+                Create ("Publisher",   Catalog.GetString ("Publisher"), 0.15, false, new ColumnCellText (null, true)),
+                Create ("Description", Catalog.GetString ("Description"), 0.35, false, new ColumnCellText (null, true)),
+                Create ("AvgRatingInt",Catalog.GetString ("Rating"), 0.15, true, new ColumnCellRating (null, true) { ReadOnly = true }),
+                Create ("Year",        Catalog.GetString ("Year"), 0.15, true, new ColumnCellPositiveInt (null, true, 4, 4) { CultureFormatted = false }),
+                Create ("Downloads",   Catalog.GetString ("Downloads"), 0.15, true, new ColumnCellPositiveInt (null, true, 2, 5)),
+                Create ("Format",      Catalog.GetString ("Formats"), 0.15, false, new ColumnCellText (null, true)),
+                Create ("LicenseUrl",  Catalog.GetString ("License"), 0.15, true, new ColumnCellCreativeCommons (null, true)),
+                Create ("DateAdded",   Catalog.GetString ("Added"), 0.15, false, new ColumnCellDateTime (null, true) { Format = DateTimeFormat.ShortDate })
+            };
+
+            foreach (var col in cols) {
+                list_view.ColumnController.Add (col);
+            }
+        }
+
+        private SortableColumn Create (string property, string label, double width, bool visible, ColumnCell cell)
+        {
+            cell.Property = property;
+            return new SortableColumn (label, cell, width, property, visible);
+        }
+
+#region ISourceContents
+
+        public bool SetSource (ISource source)
+        {
+            this.source = source as SearchSource;
+
+            if (this.source != null) {
+                list_view.SetModel (this.source.Model);
+                return true;
+            }
+
+            return false;
+        }
+
+        public void ResetSource ()
+        {
+            list_view.SetModel (null);
+            source = null;
+        }
+
+        public ISource Source { get { return source; } }
+
+        public Widget Widget { get { return this; } }
+
+#endregion
+
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs
new file mode 100644
index 0000000..d21463c
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs
@@ -0,0 +1,40 @@
+//
+// Collection.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+namespace InternetArchive
+{
+    public class Collection : FieldValue
+    {
+        public Collection (string id, string name) : base (Field.Collection, id, name) {}
+
+        public MediaType MediaType { get; internal set; }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Details.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Details.cs
new file mode 100644
index 0000000..e021b7f
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Details.cs
@@ -0,0 +1,264 @@
+//
+// Details.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Net;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public class Details
+    {
+        private string id, json;
+        private JsonObject details;
+        private JsonObject metadata, misc, item, review_info;
+        private JsonArray reviews;
+
+        public Details (string id) : this (id, null) {}
+
+        public Details (string id, string json)
+        {
+            this.id = id;
+            this.json = json;
+            LoadDetails ();
+        }
+
+#region Properties from the JSON object
+
+        public string Description {
+            get { return metadata.GetJoined ("description", System.Environment.NewLine); }
+        }
+
+        public string Creator {
+            get { return metadata.GetJoined ("creator", ", "); }
+        }
+
+        public string LicenseUrl {
+            get { return metadata.GetJoined (Field.LicenseUrl.Id, null) ?? metadata.GetJoined ("license", null); }
+        }
+
+        public string Language {
+            get { return metadata.GetJoined (Field.Language.Id, ", "); }
+        }
+
+        public string Contributor {
+            get { return metadata.GetJoined (Field.Contributor.Id, ", "); }
+        }
+
+        public string Publisher {
+            get { return metadata.GetJoined ("publisher", ", "); }
+        }
+
+        public string Year {
+            get { return metadata.GetJoined ("year", ", "); }
+        }
+
+        public string Subject {
+            get { return metadata.GetJoined ("subject", ", "); }
+        }
+
+        public string Source {
+            get { return metadata.GetJoined ("source", ", "); }
+        }
+
+        public string Taper {
+            get { return metadata.GetJoined ("taper", ", "); }
+        }
+
+        public string Lineage {
+            get { return metadata.GetJoined ("lineage", ", "); }
+        }
+
+        public string Transferer {
+            get { return metadata.GetJoined ("transferer", ", "); }
+        }
+
+        public string Collections {
+            get { return metadata.GetJoined ("collection", ", "); }
+        }
+
+        public DateTime DateAdded {
+            get { return GetMetadataDate ("addeddate"); }
+        }
+
+        public string AddedBy {
+            get { return metadata.GetJoined ("adder", ", "); }
+        }
+
+        public string Venue {
+            get { return metadata.GetJoined ("venue", ", "); }
+        }
+
+        public string Coverage {
+            get { return metadata.GetJoined ("coverage", ", "); }
+        }
+
+        public string ImageUrl {
+            get { return misc.Get<string> ("image"); }
+        }
+
+        public long DownloadsAllTime {
+            get { return item.Get<int> ("downloads"); }
+        }
+
+        public long DownloadsLastMonth {
+            get { return item.Get<int> ("month"); }
+        }
+
+        public long DownloadsLastWeek {
+            get { return item.Get<int> ("week"); }
+        }
+
+        public DateTime DateCreated {
+            get { return GetMetadataDate ("date"); }
+        }
+
+        private DateTime GetMetadataDate (string key)
+        {
+            DateTime ret;
+            if (DateTime.TryParse (metadata.GetJoined (key, null), out ret))
+                return ret;
+            else
+                return DateTime.MinValue;
+        }
+
+        public IEnumerable<DetailsFile> Files {
+            get {
+                string location_root = String.Format ("http://{0}{1}", details.Get<string> ("server"), details.Get<string> ("dir"));
+                var files = details["files"] as JsonObject;
+                foreach (JsonObject file in files.Values) {
+                    yield return new DetailsFile (file, location_root);
+                }
+            }
+        }
+
+        public IEnumerable<DetailsReview> Reviews {
+            get {
+                if (reviews == null) {
+                    yield break;
+                }
+
+                // Return them in date-descending order
+                for (int i = reviews.Count - 1; i >= 0; i--) {
+                    yield return new DetailsReview (reviews[i] as JsonObject);
+                }
+            }
+        }
+
+        public double AvgRating {
+            get { return review_info.Get<double> ("avg_rating"); }
+        }
+
+        public int AvgRatingInt {
+            get { return (int) Math.Round (AvgRating); }
+        }
+
+        public int NumReviews {
+            get { return review_info.Get<int> ("num_reviews"); }
+        }
+
+        public string WebpageUrl {
+            get { return String.Format ("http://www.archive.org/details/{0}", id); }
+        }
+
+        public string Json {
+            get { return json; }
+        }
+
+#endregion
+
+        private void LoadDetails ()
+        {
+            if (json != null) {
+                // use the passed in json
+            } else if (id == "banshee-internet-archive-offline-mode") {
+                // Hack to load JSON data from local file instead of from archive.org
+                json = System.IO.File.ReadAllText ("item2.json");
+            } else {
+                // get it from archive.org
+                json = FetchDetails (id);
+            }
+
+            if (json != null) {
+                details = new Hyena.Json.Deserializer (json).Deserialize () as JsonObject;
+            }
+
+            if (details != null) {
+                metadata = details.Get<JsonObject> ("metadata");
+                misc     = details.Get<JsonObject> ("misc");
+                item     = details.Get<JsonObject> ("item");
+                var r    = details.Get<JsonObject> ("reviews");
+                if (r != null) {
+                    reviews = r.Get<JsonArray> ("reviews");
+                    review_info = r.Get<JsonObject> ("info");
+                }
+            }
+        }
+
+        private static string FetchDetails (string id)
+        {
+            HttpWebResponse response = null;
+            string url = String.Format ("http://www.archive.org/details/{0}&output=json", id);
+
+            try {
+                Hyena.Log.Debug ("ArchiveSharp Getting Details", url);
+
+                var request = (HttpWebRequest) WebRequest.Create (url);
+                request.UserAgent = Search.UserAgent;
+                request.Timeout   = Search.TimeoutMs;
+                request.KeepAlive = Search.KeepAlive;
+
+                response = (HttpWebResponse) request.GetResponse ();
+
+                if (response.StatusCode != HttpStatusCode.OK) {
+                    return null;
+                }
+
+                using (Stream stream = response.GetResponseStream ()) {
+                    using (StreamReader reader = new StreamReader (stream)) {
+                        return reader.ReadToEnd ();
+                    }
+                }
+            } finally {
+                if (response != null) {
+                    if (response.StatusCode != HttpStatusCode.OK) {
+                        Hyena.Log.WarningFormat ("Got status {0} searching {1}", response.StatusCode, url);
+                    }
+                    response.Close ();
+                    response = null;
+                }
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsFile.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsFile.cs
new file mode 100644
index 0000000..ae842ba
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsFile.cs
@@ -0,0 +1,93 @@
+//
+// DetailsFile.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public class DetailsFile
+    {
+        JsonObject file;
+        string location_root;
+
+        public DetailsFile (JsonObject file, string location_root)
+        {
+            this.file = file;
+            this.location_root = location_root;
+        }
+
+        public string Location {
+            get { return location_root + file.Get<string> ("location"); }
+        }
+
+        public long Size {
+            get { return file.Get<long> ("size"); }
+        }
+
+        public int Track {
+            get {
+                string track = file.Get<string> ("track");
+                if (track == null)
+                    return 0;
+
+                var bits = track.Split ('/', '-');
+                return Int32.Parse (bits[0]);
+            }
+        }
+
+        public string Creator {
+            get { return file.Get<string> ("creator"); }
+        }
+
+        public string OriginalFile {
+            get { return file.Get<string> ("original"); }
+        }
+
+        public string Title {
+            get { return file.Get<string> ("title"); }
+        }
+
+        public int BitRate {
+            get { return file.Get<int> ("bitrate"); }
+        }
+
+        public string Format {
+            get { return file.Get<string> ("format"); }
+        }
+
+        public TimeSpan Length {
+            get { return file.Get<TimeSpan> ("length"); }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsReview.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsReview.cs
new file mode 100644
index 0000000..e3d5db0
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/DetailsReview.cs
@@ -0,0 +1,72 @@
+//
+// DetailsReview.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Mono.Unix;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public class DetailsReview
+    {
+        JsonObject review;
+
+        public DetailsReview (JsonObject review)
+        {
+            this.review = review;
+        }
+
+        public long Id {
+            get { return review.Get<int> ("review_id"); }
+        }
+
+        public int Stars {
+            get { return review.Get<int> ("stars"); }
+        }
+
+        public string Title {
+            get { return review.Get<string> ("reviewtitle"); }
+        }
+
+        public string Body {
+            get { return review.Get<string> ("reviewbody"); }
+        }
+
+        public string Reviewer {
+            get { return review.Get<string> ("reviewer"); }
+        }
+
+        public DateTime DateReviewed {
+            get { return DateTime.Parse (review.Get<string> ("reviewdate")); }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs
new file mode 100644
index 0000000..725934b
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Field.cs
@@ -0,0 +1,95 @@
+//
+// Field.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+using Hyena.Query;
+
+namespace InternetArchive
+{
+    public class Field
+    {
+        /*avg_rating
+        call_number
+        coverage
+
+        foldoutcount
+        headerImage
+        imagecount
+
+        month
+        oai_updatedate
+        publicdate
+        rights
+
+        scanningcentre
+        source
+        subject
+        type
+        volume
+        week
+        */
+
+        private static List<Field> fields = new List<Field> ();
+        public static Field AvgRating  = new Field ("avg_rating", Catalog.GetString ("Rating"));
+        public static Field Creator    = new Field ("creator",    Catalog.GetString ("Creator"));
+        public static Field Collection = new Field ("collection", Catalog.GetString ("Collection"));
+        public static Field Contributor= new Field ("contributor",Catalog.GetString ("Contributor"));
+        public static Field Date       = new Field ("date",       Catalog.GetString ("Created"));
+        public static Field DateAdded  = new Field ("publicdate", Catalog.GetString ("Added"));
+        public static Field Description= new Field ("description",Catalog.GetString ("Description"));
+        public static Field Downloads  = new Field ("downloads",  Catalog.GetString ("Downloads"));
+        public static Field Format     = new Field ("format",     Catalog.GetString ("Format"));
+        public static Field Identifier = new Field ("identifier", Catalog.GetString ("ID"));
+        public static Field Language   = new Field ("language",   Catalog.GetString ("Language"));
+        public static Field LicenseUrl = new Field ("licenseurl", Catalog.GetString ("License"));
+        public static Field License    = new Field ("license",    Catalog.GetString ("License"));
+        public static Field MediaType  = new Field ("mediatype",  Catalog.GetString ("Media Type"));
+        public static Field NumReviews = new Field ("num_reviews",Catalog.GetString ("Review Count"));
+        public static Field Publisher  = new Field ("publisher",  Catalog.GetString ("Publisher"));
+        public static Field Title      = new Field ("title",      Catalog.GetString ("Title"));
+        public static Field Year       = new Field ("year",       Catalog.GetString ("Year"));
+
+        public static IEnumerable<Field> Fields {
+            get { return fields; }
+        }
+
+        public string Name { get; private set; }
+        public string Id { get; private set; }
+
+        public Field (string id, string name)
+        {
+            Id = id;
+            Name = name;
+
+            fields.Add (this);
+            fields.Sort ((a, b) => a.Name.CompareTo (b.Name));
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/FieldValue.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/FieldValue.cs
new file mode 100644
index 0000000..b4da1e3
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/FieldValue.cs
@@ -0,0 +1,51 @@
+//
+// FieldValue.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Hyena.Query;
+
+namespace InternetArchive
+{
+    public class FieldValue
+    {
+        public Field  Field { get; private set; }
+        public string Name  { get; private set; }
+        public string Id    { get; private set; }
+
+        public FieldValue (Field field, string id, string name)
+        {
+            Field = field;
+            Id = id;
+            Name = name;
+        }
+
+        public override string ToString ()
+        {
+            return String.Format ("{0}:{1}", Field.Id, Id);
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/JsonExtensions.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/JsonExtensions.cs
new file mode 100644
index 0000000..1ef4327
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/JsonExtensions.cs
@@ -0,0 +1,99 @@
+//
+// JsonExtensions.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Net;
+using System.Linq;
+using System.Collections.Generic;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public static class JsonExtensions
+    {
+        public static T Get<T> (this JsonObject item, string key)
+        {
+            if (item == null)
+                return default (T);
+
+            object result;
+            if (item.TryGetValue (key, out result)) {
+                try {
+                    if (result is T) {
+                        result = (T)result;
+                    } else if (result is string) {
+                        var type = typeof (T);
+                        string i = result as string;
+                        if (type == typeof(Int32)) {
+                            result = Int32.Parse (i);
+                        } else if (type == typeof(Int64)) {
+                            result = Int64.Parse (i);
+                        } else if (type == typeof(double)) {
+                            result = Double.Parse (i);
+                        } else if (type == typeof(TimeSpan)) {
+                            int h = 0, m = 0, s = 0;
+                            var bits = i.Split (':');
+
+                            if (bits.Length > 0)
+                                s = Int32.Parse (bits[bits.Length - 1]);
+
+                            if (bits.Length > 1)
+                                m = Int32.Parse (bits[bits.Length - 2]);
+
+                            if (bits.Length > 2)
+                                h = Int32.Parse (bits[bits.Length - 3]);
+
+                            result = new TimeSpan (h, m, s);
+                        }
+                    } else {
+                        result = default (T);
+                    }
+
+                    return (T) result;
+                } catch {
+                    Console.WriteLine ("Couldn't cast {0} ({1}) as {2} for key {3}", result, result.GetType (), typeof(T), key);
+                }
+            }
+
+            return default (T);
+        }
+
+        public static string GetJoined (this JsonObject item, string key, string with)
+        {
+            if (item == null)
+                return null;
+
+            var ary = item.Get<System.Collections.IEnumerable> (key);
+            if (ary != null) {
+                return String.Join (with, ary.Cast<object> ().Select (o => o.ToString ()).ToArray ());
+            }
+
+            return null;
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
new file mode 100644
index 0000000..54278b0
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
@@ -0,0 +1,117 @@
+//
+// MediaType.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+namespace InternetArchive
+{
+    public class MediaType : FieldValue
+    {
+        public MediaType (string id, string name) : base (Field.MediaType, id, name)
+        {
+            Children = new List<Collection> ();
+        }
+
+        public MediaType AddChildren (params Collection [] children)
+        {
+            foreach (var child in children) {
+                Children.Add (child);
+                child.MediaType = this;
+            }
+
+            return this;
+        }
+
+        public IList<Collection> Children { get; set; }
+
+        public static FieldValue Get (string id)
+        {
+            foreach (var type in Options) {
+                if (type.Id == id) {
+                    return type;
+                }
+
+                foreach (var collection in type.Children) {
+                    if (collection.Id == id) {
+                        return collection;
+                    }
+                }
+            }
+
+            return null;
+        }
+
+        public static MediaType [] Options = new MediaType [] {
+            new MediaType ("movies", Catalog.GetString ("Moving Images")).AddChildren (
+                new Collection ("animationandcartoons", Catalog.GetString ("Animation & Cartoons")),
+                new Collection ("artsandmusicvideos", Catalog.GetString ("Arts & Music")),
+                new Collection ("computersandtechvideos", Catalog.GetString ("Computers & Technology")),
+                new Collection ("culturalandacademicfilms", Catalog.GetString ("Cultural & Academic Films")),
+                new Collection ("ephemera", Catalog.GetString ("Ephemeral Films")),
+                new Collection ("home_movies", Catalog.GetString ("Home Movies")),
+                new Collection ("moviesandfilms", Catalog.GetString ("Movies")),
+                new Collection ("newsandpublicaffairs", Catalog.GetString ("News & Public Affairs")),
+                new Collection ("opensource_movies", Catalog.GetString ("Open Source Movies")),
+                new Collection ("prelinger", Catalog.GetString ("Prelinger Archives")),
+                new Collection ("spiritualityandreligion", Catalog.GetString ("Spirituality & Religion")),
+                new Collection ("sports", Catalog.GetString ("Sports Videos")),
+                new Collection ("gamevideos", Catalog.GetString ("Videogame Videos")),
+                new Collection ("vlogs", Catalog.GetString ("Vlogs")),
+                new Collection ("youth_media", Catalog.GetString ("Youth Media"))
+            ),
+            new MediaType ("texts", Catalog.GetString ("Texts")).AddChildren (
+                new Collection ("americana", Catalog.GetString ("American Libraries")),
+                new Collection ("toronto", Catalog.GetString ("Canadian Libraries")),
+                new Collection ("universallibrary", Catalog.GetString ("Universal Library")),
+                new Collection ("gutenberg", Catalog.GetString ("Project Gutenberg")),
+                new Collection ("iacl", Catalog.GetString ("Children's Library")),
+                new Collection ("biodiversity", Catalog.GetString ("Biodiversity Heritage Library")),
+                new Collection ("additional_collections", Catalog.GetString ("Additional Collections"))
+            ),
+            new MediaType ("audio", Catalog.GetString ("Audio")).AddChildren (
+                new Collection ("audio_bookspoetry", Catalog.GetString ("Audio Books & Poetry")),
+                new Collection ("audio_tech", Catalog.GetString ("Computers & Technology")),
+                new Collection ("GratefulDead", Catalog.GetString ("Grateful Dead")),
+                new Collection ("etree", Catalog.GetString ("Live Music Archive")),
+                new Collection ("audio_music", Catalog.GetString ("Music & Arts")),
+                new Collection ("netlabels", Catalog.GetString ("Netlabels")),
+                new Collection ("audio_news", Catalog.GetString ("News & Public Affairs")),
+                new Collection ("audio_foreign", Catalog.GetString ("Non-English Audio")),
+                new Collection ("opensource_audio", Catalog.GetString ("Open Source Audio")),
+                new Collection ("audio_podcast", Catalog.GetString ("Podcasts")),
+                new Collection ("radioprograms", Catalog.GetString ("Radio Programs")),
+                new Collection ("audio_religion", Catalog.GetString ("Spirituality & Religion"))
+            ),
+            new MediaType ("education", Catalog.GetString ("Education")),
+            new MediaType ("software", Catalog.GetString ("Software")).AddChildren (
+                new Collection ("clasp", Catalog.GetString ("CLASP"))
+            )
+        };
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs
new file mode 100644
index 0000000..0a504e6
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs
@@ -0,0 +1,120 @@
+//
+// Search.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Net;
+using System.Linq;
+using System.Collections.Generic;
+
+namespace InternetArchive
+{
+    public class Search
+    {
+        List<Sort> sorts = new List<Sort> ();
+        List<Field> result_fields = new List<Field> ();
+
+        public IList<Field>  ReturnFields { get { return result_fields; } }
+        public IList<Sort>   Sorts { get { return sorts; } }
+        public string Query { get; set; }
+        public int NumResults { get; set; }
+        public int Page { get; set; }
+
+        static Search () {
+            UserAgent = "InternetArchiveSharp";
+            TimeoutMs = 20000;
+        }
+
+        public Search ()
+        {
+            NumResults = 50;
+            result_fields.AddRange (Field.Fields);
+            sorts.Add (Sort.AvgRatingDesc);
+        }
+
+        private string GetQuery ()
+        {
+            var sb = new System.Text.StringBuilder ();
+
+            sb.AppendFormat ("q={0}", System.Web.HttpUtility.UrlEncode (Query));
+
+            foreach (var field in result_fields) {
+                sb.AppendFormat ("&fl[]={0}", System.Web.HttpUtility.UrlEncode (field.Id));
+            }
+
+            foreach (var sort in sorts) {
+                sb.AppendFormat ("&sort[]={0}", System.Web.HttpUtility.UrlEncode (sort.Id));
+            }
+
+            sb.AppendFormat ("&rows={0}", NumResults);
+            sb.AppendFormat ("&page={0}", Page);
+            sb.AppendFormat ("&fmt={0}", "json");
+            sb.Append ("&xmlsearch=Search");
+
+            return sb.ToString ();
+        }
+
+        public SearchResults GetResults ()
+        {
+            HttpWebResponse response = null;
+            string url = null;
+
+            try {
+                url = String.Format ("http://www.archive.org/advancedsearch.php?{0}", GetQuery ());
+                Hyena.Log.Debug ("ArchiveSharp Searching", url);
+
+                var request = (HttpWebRequest) WebRequest.Create (url);
+                request.UserAgent = UserAgent;
+                request.Timeout   = TimeoutMs;
+                request.KeepAlive = KeepAlive;
+
+                response = (HttpWebResponse) request.GetResponse ();
+
+                if (response.StatusCode != HttpStatusCode.OK) {
+                    return null;
+                }
+
+                using (Stream stream = response.GetResponseStream ()) {
+                    using (StreamReader reader = new StreamReader (stream)) {
+                        return new SearchResults (reader.ReadToEnd ());
+                    }
+                }
+            } finally {
+                if (response != null) {
+                    if (response.StatusCode != HttpStatusCode.OK) {
+                        Hyena.Log.WarningFormat ("Got status {0} searching {1}", response.StatusCode, url);
+                    }
+                    response.Close ();
+                    response = null;
+                }
+            }
+        }
+
+        public static string UserAgent { get; set; }
+        public static bool   KeepAlive { get; set; }
+        public static int    TimeoutMs { get; set; }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResult.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResult.cs
new file mode 100644
index 0000000..158961d
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResult.cs
@@ -0,0 +1,118 @@
+//
+// SearchResult.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Net;
+using System.Linq;
+using System.Collections.Generic;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public sealed class SearchResult
+    {
+        JsonObject item;
+
+        internal SearchResult (JsonObject item)
+        {
+            this.item = item;
+        }
+
+        public string Id {
+            get { return Get<string> (Field.Identifier); }
+        }
+
+        public string WebpageUrl {
+            get { return String.Format ("http://www.archive.org/details/{0}", Id); }
+        }
+
+        public DateTime DateAdded {
+            get { return GetDate (Field.DateAdded.Id); }
+        }
+
+        public string Creator {
+            get { return GetJoined (Field.Creator, ", ") ?? ""; }
+        }
+
+        public string Description {
+            get { return Hyena.StringUtil.RemoveHtml (Get<string> (Field.Description)); }
+        }
+
+        public string Publisher {
+            get { return GetJoined (Field.Publisher, ", ") ?? ""; }
+        }
+
+        public string LicenseUrl {
+            get { return Get<string> (Field.LicenseUrl) ?? item.GetJoined ("license", null); }
+        }
+
+        public int Downloads {
+            get { return Get<int> (Field.Downloads); }
+        }
+
+        public double AvgRating {
+            get { return Get<double> (Field.AvgRating); }
+        }
+
+        public int AvgRatingInt {
+            get { return (int) Math.Round (AvgRating); }
+        }
+
+        public string Title {
+            get { return Get<string> (Field.Title); }
+        }
+
+        public string Format {
+            get { return GetJoined (Field.Format, ", "); }
+        }
+
+        public string MediaType {
+            get { return Get<string> (Field.MediaType); }
+        }
+
+        public int Year {
+            get { return Get<int> (Field.Year); }
+        }
+
+        public T Get<T> (Field field)
+        {
+            return item.Get<T> (field.Id);
+        }
+
+        public DateTime GetDate (string key)
+        {
+            DateTime ret;
+            return DateTime.TryParse (item.GetJoined (key, null), out ret) ? ret : DateTime.MinValue;
+        }
+
+        public string GetJoined (Field field, string with)
+        {
+            return item.GetJoined (field.Id, with);
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResults.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResults.cs
new file mode 100644
index 0000000..2ab233a
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/SearchResults.cs
@@ -0,0 +1,81 @@
+//
+// SearchResults.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Net;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+
+using Hyena.Json;
+
+namespace InternetArchive
+{
+    public sealed class SearchResults : IEnumerable<SearchResult>
+    {
+        JsonArray results;
+
+        public int TotalResults { get; private set; }
+        public int Count  { get; private set; }
+        public int Offset { get; private set; }
+
+        public SearchResults (string resultsString)
+        {
+            var json = new Deserializer (resultsString).Deserialize () as JsonObject;
+
+            var response_header = json.Get<JsonObject> ("responseHeader");
+            if (response_header != null) {
+                var response_header_params = response_header.Get<JsonObject> ("params");
+
+                Count  = response_header_params.Get<int> ("rows");
+            }
+
+            var response = json.Get<JsonObject> ("response");
+            if (response != null) {
+                results = response.Get<JsonArray> ("docs");
+
+                TotalResults = response.Get<int> ("numFound");
+                Offset = response.Get<int> ("start");
+            }
+        }
+
+        public IEnumerator<SearchResult> GetEnumerator ()
+        {
+            if (results == null)
+                yield break;
+
+            foreach (JsonObject obj in results) {
+                yield return new SearchResult (obj);
+            }
+        }
+
+        IEnumerator IEnumerable.GetEnumerator ()
+        {
+            return GetEnumerator ();
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs
new file mode 100644
index 0000000..2941a0c
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Sort.cs
@@ -0,0 +1,111 @@
+//
+// Sort.cs
+//
+// Author:
+//       Gabriel Burt <gabriel.burt at gmail.com>
+//
+// Copyright (c) 2009 Gabriel Burt
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Mono.Unix;
+
+namespace InternetArchive
+{
+    /*
+    "" = relevance
+    addeddate desc
+    addeddate asc
+    avg_rating desc
+    avg_rating asc
+    call_number desc
+
+    call_number asc
+    createdate desc
+    createdate asc
+    creatorSorter desc
+    creatorSorter asc
+    date desc
+    date asc
+    downloads desc
+    downloads asc
+
+    foldoutcount desc
+    foldoutcount asc
+    headerImage desc
+    headerImage asc
+    identifier desc
+    identifier asc
+    imagecount desc
+    imagecount asc
+    indexdate desc
+
+    indexdate asc
+    languageSorter desc
+    languageSorter asc
+    licenseurl desc
+    licenseurl asc
+    month desc
+    month asc
+    nav_order desc
+    nav_order asc
+
+    num_reviews desc
+    num_reviews asc
+    publicdate desc
+    publicdate asc
+    reviewdate desc
+    reviewdate asc
+    stars desc
+    stars asc
+    titleSorter desc
+
+    titleSorter asc
+    updatedate desc
+    updatedate asc
+    week desc
+    week asc
+    year desc
+    year asc */
+
+    public class Sort
+    {
+        public static Sort DownloadsDesc  = new Sort ("downloads desc",  Catalog.GetString ("Downloads"));
+        public static Sort WeekDesc       = new Sort ("week desc",       Catalog.GetString ("Downloads This Week"));
+        public static Sort DateCreatedDesc= new Sort ("createdate desc", Catalog.GetString ("Newest"));
+        public static Sort DateCreatedAsc = new Sort ("createdate asc",  Catalog.GetString ("Oldest"));
+        public static Sort DateAddedDesc  = new Sort ("addeddate desc",  Catalog.GetString ("Recently Added"));
+        public static Sort AvgRatingDesc  = new Sort ("avg_rating desc", Catalog.GetString ("Rating"));
+        public static Sort TitleAsc       = new Sort ("titleSorter asc", Catalog.GetString ("Title"));
+        public static Sort CreatorAsc     = new Sort ("creatorSorter asc", Catalog.GetString ("Creator"));
+
+        public Sort () {}
+
+        public Sort (string id, string name)
+        {
+            Id = id;
+            Name = name;
+        }
+
+        public string Id { get; private set; }
+        public string Name { get; private set; }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/Makefile.am b/src/Extensions/Banshee.InternetArchive/Makefile.am
new file mode 100644
index 0000000..fe1273e
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Makefile.am
@@ -0,0 +1,37 @@
+ASSEMBLY = Banshee.InternetArchive
+TARGET = library
+LINK = $(REF_EXTENSION_INTERNETARCHIVE)
+INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
+
+SOURCES =  \
+	Banshee.InternetArchive/Actions.cs \
+	Banshee.InternetArchive/DetailsSource.cs \
+	Banshee.InternetArchive/DetailsView.cs \
+	Banshee.InternetArchive/HeaderFilters.cs \
+	Banshee.InternetArchive/HomeSource.cs \
+	Banshee.InternetArchive/HomeView.cs \
+	Banshee.InternetArchive/Item.cs \
+	Banshee.InternetArchive/SearchDescription.cs \
+	Banshee.InternetArchive/SearchSource.cs \
+	Banshee.InternetArchive/SearchView.cs \
+	InternetArchive/Collection.cs \
+	InternetArchive/Details.cs \
+	InternetArchive/DetailsFile.cs \
+	InternetArchive/DetailsReview.cs \
+	InternetArchive/Field.cs \
+	InternetArchive/FieldValue.cs \
+	InternetArchive/JsonExtensions.cs \
+	InternetArchive/MediaType.cs \
+	InternetArchive/Search.cs \
+	InternetArchive/SearchResult.cs \
+	InternetArchive/SearchResults.cs \
+	InternetArchive/Sort.cs
+
+RESOURCES =  \
+	Banshee.InternetArchive.addin.xml \
+	Resources/DetailsSourceActiveUI.xml \
+	Resources/GlobalUI.xml \
+	Resources/HomeSourceActiveUI.xml \
+	Resources/SearchSourceActiveUI.xml
+
+include $(top_srcdir)/build/build.mk
diff --git a/src/Extensions/Banshee.InternetArchive/Makefile.in b/src/Extensions/Banshee.InternetArchive/Makefile.in
new file mode 100644
index 0000000..fd7739a
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Makefile.in
@@ -0,0 +1,850 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/build/build.environment.mk \
+	$(top_srcdir)/build/build.mk \
+	$(top_srcdir)/build/build.rules.mk
+ at ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)"
+subdir = src/Extensions/Banshee.InternetArchive
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
+	$(top_srcdir)/build/m4/shamrock/expansions.m4 \
+	$(top_srcdir)/build/m4/shamrock/i18n.m4 \
+	$(top_srcdir)/build/m4/shamrock/mono.m4 \
+	$(top_srcdir)/build/m4/shamrock/monodoc.m4 \
+	$(top_srcdir)/build/m4/shamrock/nunit.m4 \
+	$(top_srcdir)/build/m4/shamrock/programs.m4 \
+	$(top_srcdir)/build/m4/shamrock/util.m4 \
+	$(top_srcdir)/build/m4/banshee/bnpx11.m4 \
+	$(top_srcdir)/build/m4/banshee/boo.m4 \
+	$(top_srcdir)/build/m4/banshee/daap.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-ipod.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
+	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
+	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
+	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
+	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/libbanshee.m4 \
+	$(top_srcdir)/build/m4/banshee/moblin.m4 \
+	$(top_srcdir)/build/m4/banshee/mono-addins.m4 \
+	$(top_srcdir)/build/m4/banshee/moonlight.m4 \
+	$(top_srcdir)/build/m4/banshee/notify-sharp.m4 \
+	$(top_srcdir)/build/m4/banshee/osx.m4 \
+	$(top_srcdir)/build/m4/banshee/remote-audio.m4 \
+	$(top_srcdir)/build/m4/banshee/taglib.m4 \
+	$(top_srcdir)/build/m4/banshee/torrent.m4 \
+	$(top_srcdir)/build/m4/banshee/webkit.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(moduledir)"
+SCRIPTS = $(module_SCRIPTS)
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AM_MAKEFLAGS = @AM_MAKEFLAGS@
+API_VERSION = @API_VERSION@
+AR = @AR@
+ASM_VERSION = @ASM_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BNPX_CFLAGS = @BNPX_CFLAGS@
+BNPX_GTK_CFLAGS = @BNPX_GTK_CFLAGS@
+BNPX_GTK_LIBS = @BNPX_GTK_LIBS@
+BNPX_LIBS = @BNPX_LIBS@
+BOO_CFLAGS = @BOO_CFLAGS@
+BOO_LIBS = @BOO_LIBS@
+BUILD_HOST_CPU = @BUILD_HOST_CPU@
+BUILD_HOST_OS = @BUILD_HOST_OS@
+BUILD_TIME = @BUILD_TIME@
+BUILD_VENDOR_ID = @BUILD_VENDOR_ID@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CLUTTER_CFLAGS = @CLUTTER_CFLAGS@
+CLUTTER_LIBS = @CLUTTER_LIBS@
+CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISPLAY_VERSION = @DISPLAY_VERSION@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DOCDIR = @DOCDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_RELEASE = @ENABLE_RELEASE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FGREP = @FGREP@
+GCONFSHARP_CFLAGS = @GCONFSHARP_CFLAGS@
+GCONFSHARP_LIBS = @GCONFSHARP_LIBS@
+GCONFTOOL = @GCONFTOOL@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GDK_QUARTZ_CFLAGS = @GDK_QUARTZ_CFLAGS@
+GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
+GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
+GDK_X11_LIBS = @GDK_X11_LIBS@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
+GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
+GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMCS_FLAGS = @GMCS_FLAGS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMESHARP_CFLAGS = @GNOMESHARP_CFLAGS@
+GNOMESHARP_LIBS = @GNOMESHARP_LIBS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GRAPHICS_SUBSYSTEM = @GRAPHICS_SUBSYSTEM@
+GREP = @GREP@
+GSTREAMER_REQUIRED_VERSION = @GSTREAMER_REQUIRED_VERSION@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LIBS = @GST_LIBS@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
+GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
+GTKSHARP_LIBS = @GTKSHARP_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+IGEMACINTEGRATIONSHARP_CFLAGS = @IGEMACINTEGRATIONSHARP_CFLAGS@
+IGEMACINTEGRATIONSHARP_LIBS = @IGEMACINTEGRATIONSHARP_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
+IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
+IPODSHARP_LIBS = @IPODSHARP_LIBS@
+KARMASHARP_ASSEMBLIES = @KARMASHARP_ASSEMBLIES@
+KARMASHARP_CFLAGS = @KARMASHARP_CFLAGS@
+KARMASHARP_LIBS = @KARMASHARP_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBBANSHEE_CFLAGS = @LIBBANSHEE_CFLAGS@
+LIBBANSHEE_LIBS = @LIBBANSHEE_LIBS@
+LIBMTP_CFLAGS = @LIBMTP_CFLAGS@
+LIBMTP_LIBS = @LIBMTP_LIBS@
+LIBMTP_SO_MAP = @LIBMTP_SO_MAP@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEFLAGS = @MAKEFLAGS@
+MAKEINFO = @MAKEINFO@
+MCS = @MCS@
+MDASSEMBLER = @MDASSEMBLER@
+MKDIR_P = @MKDIR_P@
+MONO = @MONO@
+MONODOCER = @MONODOCER@
+MONOTORRENT_ASSEMBLIES = @MONOTORRENT_ASSEMBLIES@
+MONOTORRENT_DBUS_CFLAGS = @MONOTORRENT_DBUS_CFLAGS@
+MONOTORRENT_DBUS_LIBS = @MONOTORRENT_DBUS_LIBS@
+MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@
+MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@
+MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@
+MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@
+MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@
+MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@
+MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@
+MONO_MODULE_LIBS = @MONO_MODULE_LIBS@
+MONO_ZEROCONF_CFLAGS = @MONO_ZEROCONF_CFLAGS@
+MONO_ZEROCONF_LIBS = @MONO_ZEROCONF_LIBS@
+MOONLIGHT_CFLAGS = @MOONLIGHT_CFLAGS@
+MOONLIGHT_LIBS = @MOONLIGHT_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@
+NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@
+NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@
+NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@
+NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@
+NUNIT_CFLAGS = @NUNIT_CFLAGS@
+NUNIT_LIBS = @NUNIT_LIBS@
+OBJC = @OBJC@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+Q = @Q@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SQLITE_CFLAGS = @SQLITE_CFLAGS@
+SQLITE_LIBS = @SQLITE_LIBS@
+STRIP = @STRIP@
+TAGLIB_SHARP_CFLAGS = @TAGLIB_SHARP_CFLAGS@
+TAGLIB_SHARP_LIBS = @TAGLIB_SHARP_LIBS@
+USE_NLS = @USE_NLS@
+V = @V@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+XGETTEXT = @XGETTEXT@
+XMKMF = @XMKMF@
+XVIDMODE_CFLAGS = @XVIDMODE_CFLAGS@
+XVIDMODE_LIBS = @XVIDMODE_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+expanded_bindir = @expanded_bindir@
+expanded_datadir = @expanded_datadir@
+expanded_libdir = @expanded_libdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+shavedir = @shavedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ASSEMBLY = Banshee.InternetArchive
+TARGET = library
+LINK = $(REF_EXTENSION_INTERNETARCHIVE) $(am__append_1)
+INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
+SOURCES = \
+	Banshee.InternetArchive/Actions.cs \
+	Banshee.InternetArchive/DetailsSource.cs \
+	Banshee.InternetArchive/DetailsView.cs \
+	Banshee.InternetArchive/HeaderFilters.cs \
+	Banshee.InternetArchive/HomeSource.cs \
+	Banshee.InternetArchive/HomeView.cs \
+	Banshee.InternetArchive/Item.cs \
+	Banshee.InternetArchive/SearchDescription.cs \
+	Banshee.InternetArchive/SearchSource.cs \
+	Banshee.InternetArchive/SearchView.cs \
+	InternetArchive/Collection.cs \
+	InternetArchive/Details.cs \
+	InternetArchive/DetailsFile.cs \
+	InternetArchive/DetailsReview.cs \
+	InternetArchive/Field.cs \
+	InternetArchive/FieldValue.cs \
+	InternetArchive/JsonExtensions.cs \
+	InternetArchive/MediaType.cs \
+	InternetArchive/Search.cs \
+	InternetArchive/SearchResult.cs \
+	InternetArchive/SearchResults.cs \
+	InternetArchive/Sort.cs
+
+RESOURCES = \
+	Banshee.InternetArchive.addin.xml \
+	Resources/DetailsSourceActiveUI.xml \
+	Resources/GlobalUI.xml \
+	Resources/HomeSourceActiveUI.xml \
+	Resources/SearchSourceActiveUI.xml
+
+
+# Initializers
+MONO_BASE_PATH = 
+MONO_ADDINS_PATH = 
+
+# Install Paths
+DEFAULT_INSTALL_DIR = $(pkglibdir)
+BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends
+EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions
+
+# External libraries to link against, generated from configure
+LINK_SYSTEM = -r:System
+LINK_SYSTEM_WEB = -r:System.Web
+LINK_CAIRO = -r:Mono.Cairo
+LINK_MONO_POSIX = -r:Mono.Posix
+LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib
+LINK_MONO_ZEROCONF = $(MONO_ZEROCONF_LIBS)
+LINK_GLIB = $(GLIBSHARP_LIBS)
+LINK_GTK = $(GTKSHARP_LIBS)
+LINK_GCONF = $(GCONFSHARP_LIBS)
+LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
+LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
+LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
+LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
+LINK_IPOD = $(IPODSHARP_LIBS)
+LINK_BOO = $(BOO_LIBS)
+LINK_WEBKIT = $(WEBKIT_LIBS)
+LINK_MONOTORRENT_DBUS = $(MONOTORRENT_DBUS_LIBS)
+LINK_IGEMACINTEGRATION = $(IGEMACINTEGRATIONSHARP_LIBS)
+LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS)
+LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS)
+LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS)
+DIR_BIN = $(top_builddir)/bin
+
+# Mono.Data
+REF_SQLITE = -r:System -r:System.Data -r:System.Transactions
+LINK_SQLITE = -r:System.Data -r:$(DIR_BIN)/Mono.Data.Sqlite.dll
+
+# Hyena
+REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE) $(LINK_MONO_POSIX)
+LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll
+LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA)
+
+# Hyena.Gui
+REF_HYENA_GUI = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_CAIRO) $(LINK_GTK)
+LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll
+LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI)
+
+# Lastfm
+REF_LASTFM = $(LINK_SYSTEM) $(LINK_SYSTEM_WEB) $(LINK_MONO_MEDIA) $(LINK_MONO_POSIX) $(LINK_HYENA) $(LINK_ICSHARP_ZIP_LIB) 
+LINK_LASTFM = -r:$(DIR_BIN)/Lastfm.dll
+LINK_LASTFM_DEPS = $(REF_LASTFM) $(LINK_LASTFM)
+
+# Lastfm.Gui
+REF_LASTFM_GUI = $(LINK_GLIB) $(LINK_GTK) $(LINK_LASTFM_DEPS)
+LINK_LASTFM_GUI = -r:$(DIR_BIN)/Lastfm.Gui.dll
+LINK_LASTFM_GUI_DEPS = $(REF_LASTFM_GUI) $(LINK_LASTFM_GUI)
+REF_MIGO = $(LINK_HYENA_DEPS) $(LINK_SYSTEM_WEB)
+LINK_MIGO = -r:$(DIR_BIN)/Migo.dll
+LINK_MIGO_DEPS = $(REF_MIGO) $(LINK_MIGO)
+
+# Mono.Media
+REF_MONO_MEDIA = $(LINK_SYSTEM)
+LINK_MONO_MEDIA = -r:$(DIR_BIN)/Mono.Media.dll
+LINK_MONO_MEDIA_DEPS = $(REF_MONO_MEDIA) $(LINK_MONO_MEDIA)
+
+# Mtp
+REF_MTP = $(LINK_SYSTEM) $(LINK_MONO_POSIX)
+LINK_MTP = -r:$(DIR_BIN)/Mtp.dll
+LINK_MTP_DEPS = $(REF_MTP) $(LINK_MTP)
+
+# Karma
+REF_KARMA = $(LINK_SYSTEM) $(LINK_MONO_POSIX)
+LINK_KARMA = $(KARMASHARP_LIBS)
+LINK_KARMA_DEPS = $(REF_KARMA) $(LINK_KARMA)
+
+# MusicBrainz
+REF_MUSICBRAINZ = $(LINK_SYSTEM)
+LINK_MUSICBRAINZ = -r:$(DIR_BIN)/MusicBrainz.dll
+LINK_MUSICBRAINZ_DEPS = $(REF_MUSICBRAINZ) $(LINK_MUSICBRAINZ)
+
+# Core
+REF_BANSHEE_CORE = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_GLIB) \
+	$(LINK_DBUS) $(LINK_TAGLIB) $(LINK_MONO_ADDINS_DEPS)
+
+LINK_BANSHEE_CORE = -r:$(DIR_BIN)/Banshee.Core.dll
+LINK_BANSHEE_CORE_DEPS = $(REF_BANSHEE_CORE) $(LINK_BANSHEE_CORE)
+REF_BANSHEE_SERVICES = $(LINK_SQLITE) $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_MEDIA_DEPS) $(LINK_LASTFM_DEPS)
+LINK_BANSHEE_SERVICES = -r:$(DIR_BIN)/Banshee.Services.dll
+LINK_BANSHEE_SERVICES_DEPS = $(REF_BANSHEE_SERVICES) $(LINK_BANSHEE_SERVICES)
+REF_BANSHEE_WIDGETS = $(LINK_MONO_POSIX) $(LINK_HYENA_GUI_DEPS)
+LINK_BANSHEE_WIDGETS = -r:$(DIR_BIN)/Banshee.Widgets.dll
+LINK_BANSHEE_WIDGETS_DEPS = $(REF_BANSHEE_WIDGETS) $(LINK_BANSHEE_WIDGETS)
+REF_BANSHEE_THICKCLIENT = $(LINK_BANSHEE_WIDGETS_DEPS) \
+	$(LINK_BANSHEE_SERVICES_DEPS) $(LINK_HYENA_GUI_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) $(LINK_MONO_ADDINS_GUI_DEPS)
+
+LINK_BANSHEE_THICKCLIENT = -r:$(DIR_BIN)/Banshee.ThickClient.dll
+LINK_BANSHEE_THICKCLIENT_DEPS = $(REF_BANSHEE_THICKCLIENT) \
+	$(LINK_BANSHEE_THICKCLIENT)
+
+REF_NEREID = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_HALIE = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_BEROE = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_BOOTER = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_BANSHEE_COLLECTIONINDEXER = $(LINK_SYSTEM) $(LINK_DBUS_NO_GLIB) $(LINK_MONO_POSIX)
+
+# Dap
+REF_DAP = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS)
+LINK_DAP = -r:$(DIR_BIN)/Banshee.Dap.dll
+LINK_DAP_DEPS = $(REF_DAP) $(LINK_DAP)
+REF_DAP_MASS_STORAGE = $(LINK_DAP_DEPS)
+REF_DAP_MTP = $(LINK_DAP_DEPS) $(LINK_MTP_DEPS)
+REF_DAP_IPOD = $(LINK_DAP_DEPS) $(LINK_IPOD)
+REF_DAP_KARMA = $(LINK_DAP_DEPS) $(LINK_KARMA_DEPS)
+
+# Extensions
+REF_EXTENSION_AUDIOCD = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MUSICBRAINZ_DEPS)
+REF_EXTENSION_BOOKMARKS = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_BOOSCRIPT = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_BOO)
+REF_EXTENSION_BPM = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
+REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
+LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
+	$(LINK_EXTENSION_PLAYQUEUE)
+
+REF_EXTENSION_LASTFM = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_MEDIA) $(LINK_LASTFM) $(LINK_LASTFM_GUI)
+REF_EXTENSION_NOWPLAYING = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+LINK_EXTENSION_NOWPLAYING = -r:$(DIR_BIN)/Banshee.NowPlaying.dll
+LINK_EXTENSION_NOWPLAYING_DEPS = $(REF_EXTENSION_NOWPLAYING) \
+	$(LINK_EXTENSION_NOWPLAYING)
+
+REF_EXTENSION_NOWPLAYING_CLUTTER = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_PODCASTING = $(LINK_MIGO_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
+
+# Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
+REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
+REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
+REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
+REF_BACKEND_HAL = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_DBUS)
+REF_BACKEND_OSX = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_IGEMACINTEGRATION)
+REF_BACKEND_BNPX11 = $(LINK_EXTENSION_NOWPLAYING_DEPS)
+
+# Cute hack to replace a space with something
+colon := :
+empty := 
+space := $(empty) $(empty)
+
+# Build path to allow running uninstalled
+RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH))
+UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq
+BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE)
+SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \
+	$(top_srcdir)/src/AssemblyInfo.cs
+RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES))
+RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \
+	-resource:$(resource),$(notdir $(resource)))
+
+INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)"
+THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg)
+THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE))
+ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
+ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
+INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
+ at ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
+FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
+DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
+OUTPUT_FILES = \
+	$(ASSEMBLY_FILE) \
+	$(ASSEMBLY_FILE).mdb
+
+moduledir = $(INSTALL_DIR_RESOLVED)
+module_SCRIPTS = $(OUTPUT_FILES)
+EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE)
+CLEANFILES = $(OUTPUT_FILES)
+DISTCLEANFILES = *.pidb
+MAINTAINERCLEANFILES = Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.InternetArchive/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.InternetArchive/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-moduleSCRIPTS: $(module_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-moduleSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+	for dir in "$(DESTDIR)$(moduledir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-moduleSCRIPTS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-moduleSCRIPTS
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-moduleSCRIPTS install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am uninstall uninstall-am uninstall-local \
+	uninstall-moduleSCRIPTS
+
+
+all: $(ASSEMBLY_FILE) theme-icons
+
+run: 
+	@pushd $(top_builddir); \
+	make run \
+	popd;
+
+build-debug:
+	@echo $(DEP_LINK)
+
+$(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE)
+
+$(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
+	@mkdir -p $(top_builddir)/bin
+	@if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \
+		$(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \
+		$(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll $(SOURCES_BUILD); \
+	fi;
+	$(MCS) \
+		$(GMCS_FLAGS) \
+		$(ASSEMBLY_BUILD_FLAGS) \
+		-nowarn:0278 -nowarn:0078 $$warn \
+		-define:HAVE_GTK_2_10 -define:NET_2_0 \
+		-debug -target:$(TARGET) -out:$@ \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
+		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
+	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
+		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
+	fi;
+	@if [ ! -z "$(EXTRA_BUNDLE)" ]; then \
+		cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \
+	fi;
+
+theme-icons: $(THEME_ICONS_SOURCE)
+	@$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+install-data-local: $(THEME_ICONS_SOURCE)
+	@$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+uninstall-local: $(THEME_ICONS_SOURCE)
+	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Extensions/Banshee.InternetArchive/Resources/DetailsSourceActiveUI.xml b/src/Extensions/Banshee.InternetArchive/Resources/DetailsSourceActiveUI.xml
new file mode 100644
index 0000000..1e132da
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Resources/DetailsSourceActiveUI.xml
@@ -0,0 +1,15 @@
+<ui>
+  <toolbar name="HeaderToolbar">
+    <placeholder name="SourceActions">
+        <toolitem action="OpenItemWebsite" />
+        <toolitem action="UnmapSourceAction"/>
+    </placeholder>
+  </toolbar>
+
+  <popup name="TrackContextMenu" action="TrackContextMenuAction">
+    <placeholder name="BelowAddToPlaylist">
+        <separator />
+        <separator />
+    </placeholder>
+  </popup>
+</ui>
diff --git a/src/Extensions/Banshee.InternetArchive/Resources/GlobalUI.xml b/src/Extensions/Banshee.InternetArchive/Resources/GlobalUI.xml
new file mode 100644
index 0000000..9943d23
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Resources/GlobalUI.xml
@@ -0,0 +1,19 @@
+<ui>
+  <popup action="IaHomeSourcePopup">
+    <menuitem action="VisitInternetArchive" />
+    <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
+  </popup>
+
+  <popup action="IaSearchSourcePopup">
+    <menuitem action="VisitInternetArchive" />
+    <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
+  </popup>
+
+  <popup action="IaDetailsSourcePopup">
+    <menuitem action="OpenItemWebsite" />
+    <menuitem action="VisitInternetArchive" />
+    <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
+    <separator />
+    <menuitem action="UnmapSourceAction"/>
+  </popup>
+</ui>
diff --git a/src/Extensions/Banshee.InternetArchive/Resources/HomeSourceActiveUI.xml b/src/Extensions/Banshee.InternetArchive/Resources/HomeSourceActiveUI.xml
new file mode 100644
index 0000000..cb99c63
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Resources/HomeSourceActiveUI.xml
@@ -0,0 +1,7 @@
+<ui>
+  <toolbar name="HeaderToolbar">
+    <placeholder name="SourceActions">
+        <toolitem action="VisitInternetArchive" />
+    </placeholder>
+  </toolbar>
+</ui>
diff --git a/src/Extensions/Banshee.InternetArchive/Resources/SearchSourceActiveUI.xml b/src/Extensions/Banshee.InternetArchive/Resources/SearchSourceActiveUI.xml
new file mode 100644
index 0000000..780c682
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/Resources/SearchSourceActiveUI.xml
@@ -0,0 +1,27 @@
+<ui>
+  <toolbar name="HeaderToolbar">
+    <placeholder name="SourceActions">
+        <toolitem action="VisitInternetArchive" />
+    </placeholder>
+  </toolbar>
+
+  <menubar name="MainMenu" action="MainMenuAction">
+    <menu name="EditMenu" action="EditMenuAction">
+      <placeholder name="BelowAddToPlaylist">
+        <separator />
+        <!--<menuitem name="PodcastItemDownload" action="PodcastItemDownloadAction" />
+        <menuitem name="PodcastItemDeleteFile" action="PodcastItemDeleteFileAction" />-->
+        <!--
+        <menuitem name="PodcastItemCancel" action="PodcastItemCancelAction" />-->
+        <!--<menuitem name="PodcastItemMarkNew" action="PodcastItemMarkNewAction" />
+        <menuitem name="PodcastItemMarkOld" action="PodcastItemMarkOldAction" />-->
+        <separator />
+      </placeholder>
+    </menu>
+  </menubar>
+
+  <popup action="IaResultPopup">
+    <menuitem action="ViewItemDetails" />
+    <menuitem action="OpenItemWebsite" />
+  </popup>
+</ui>
diff --git a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
index 97e8059..7447515 100644
--- a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
+++ b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSource.cs
@@ -51,15 +51,15 @@ namespace Banshee.InternetRadio
     {
         private InternetRadioSourceContents source_contents;
         private uint ui_id;
-        
+
         public InternetRadioSource () : base (Catalog.GetString ("Radio"), Catalog.GetString ("Radio"), "internet-radio", 220)
         {
             Properties.SetString ("Icon.Name", "radio");
             TypeUniqueId = "internet-radio";
             IsLocal = false;
-            
+
             AfterInitialized ();
-            
+
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             uia_service.GlobalActions.AddImportant (
                 new ActionEntry ("AddRadioStationAction", Stock.Add,
@@ -67,19 +67,19 @@ namespace Banshee.InternetRadio
                     Catalog.GetString ("Add a new Internet Radio station or playlist"),
                     OnAddStation)
             );
-            
+
             ui_id = uia_service.UIManager.AddUiFromResource ("GlobalUI.xml");
-            
+
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.Set<bool> ("ActiveSourceUIResourcePropagate", true);
             Properties.Set<System.Reflection.Assembly> ("ActiveSourceUIResource.Assembly", typeof(InternetRadioSource).Assembly);
 
             Properties.SetString ("GtkActionPath", "/InternetRadioContextMenu");
-            
+
             source_contents = new InternetRadioSourceContents ();
             Properties.Set<bool> ("Nereid.SourceContentsPropagate", true);
             Properties.Set<ISourceContents> ("Nereid.SourceContents", source_contents);
-            
+
             Properties.SetString ("TrackEditorActionLabel", Catalog.GetString ("Edit Station"));
             Properties.Set<InvokeHandler> ("TrackEditorActionHandler", delegate {
                 ITrackModelSource active_track_model_source =
@@ -89,7 +89,7 @@ namespace Banshee.InternetRadio
                     active_track_model_source.TrackModel.SelectedItems.Count <= 0) {
                     return;
                 }
-                
+
                 foreach (TrackInfo track in active_track_model_source.TrackModel.SelectedItems) {
                     DatabaseTrackInfo station_track = track as DatabaseTrackInfo;
                     if (station_track != null) {
@@ -98,7 +98,7 @@ namespace Banshee.InternetRadio
                     }
                 }
             });
-            
+
             Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
                 <column-controller>
                   <!--<column modify-default=""IndicatorColumn"">
@@ -136,16 +136,16 @@ namespace Banshee.InternetRadio
                 Catalog.GetString ("Creator"),
                 Catalog.GetString ("Description")
             ));
-            
+
             ServiceManager.PlayerEngine.TrackIntercept += OnPlayerEngineTrackIntercept;
             //ServiceManager.PlayerEngine.ConnectEvent (OnTrackInfoUpdated, Banshee.MediaEngine.PlayerEvent.TrackInfoUpdated);
-            
+
             TrackEqualHandler = delegate (DatabaseTrackInfo a, TrackInfo b) {
                 RadioTrackInfo radio_track = b as RadioTrackInfo;
                 return radio_track != null && DatabaseTrackInfo.TrackEqual (
                     radio_track.ParentTrack as DatabaseTrackInfo, a);
             };
-            
+
             if (new XspfMigrator (this).Migrate ()) {
                 Reload ();
             }
@@ -162,24 +162,24 @@ namespace Banshee.InternetRadio
 
             yield return genre_model;
         }
-        
+
         public override void Dispose ()
         {
             base.Dispose ();
 
             //ServiceManager.PlayerEngine.DisconnectEvent (OnTrackInfoUpdated);
-            
+
             InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService> ();
             if (uia_service == null) {
                 return;
             }
-            
+
             if (ui_id > 0) {
                 uia_service.UIManager.RemoveUi (ui_id);
                 uia_service.GlobalActions.Remove ("AddRadioStationAction");
-                ui_id = 0;    
+                ui_id = 0;
             }
-            
+
             ServiceManager.PlayerEngine.TrackIntercept -= OnPlayerEngineTrackIntercept;
         }
 
@@ -194,62 +194,62 @@ namespace Banshee.InternetRadio
                 Banshee.Metadata.MetadataService.Instance.Lookup (radio_track);
             }
         }*/
-        
+
         private bool OnPlayerEngineTrackIntercept (TrackInfo track)
         {
             DatabaseTrackInfo station = track as DatabaseTrackInfo;
             if (station == null || station.PrimarySource != this) {
                 return false;
             }
-            
+
             new RadioTrackInfo (station).Play ();
-            
+
             return true;
         }
-        
+
         private void OnAddStation (object o, EventArgs args)
         {
             EditStation (null);
         }
-        
+
         private void EditStation (DatabaseTrackInfo track)
         {
             StationEditor editor = new StationEditor (track);
             editor.Response += OnStationEditorResponse;
             editor.Show ();
         }
-        
+
         private void OnStationEditorResponse (object o, ResponseArgs args)
         {
             StationEditor editor = (StationEditor)o;
             bool destroy = true;
-            
+
             try {
                 if (args.ResponseId == ResponseType.Ok) {
                     DatabaseTrackInfo track = editor.Track ?? new DatabaseTrackInfo ();
                     track.PrimarySource = this;
                     track.IsLive = true;
-                
+
                     try {
                         track.Uri = new SafeUri (editor.StreamUri);
                     } catch {
                         destroy = false;
                         editor.ErrorMessage = Catalog.GetString ("Please provide a valid station URI");
                     }
-                    
+
                     if (!String.IsNullOrEmpty (editor.StationCreator)) {
                         track.ArtistName = editor.StationCreator;
-                    }    
-                    
+                    }
+
                     track.Comment = editor.Description;
-                    
+
                     if (!String.IsNullOrEmpty (editor.Genre)) {
                         track.Genre = editor.Genre;
                     } else {
                         destroy = false;
                         editor.ErrorMessage = Catalog.GetString ("Please provide a station genre");
                     }
-                    
+
                     if (!String.IsNullOrEmpty (editor.StationTitle)) {
                         track.TrackTitle = editor.StationTitle;
                         track.AlbumTitle = editor.StationTitle;
@@ -257,9 +257,9 @@ namespace Banshee.InternetRadio
                         destroy = false;
                         editor.ErrorMessage = Catalog.GetString ("Please provide a station title");
                     }
-                    
+
                     track.Rating = editor.Rating;
-                    
+
                     if (destroy) {
                         track.Save ();
                     }
@@ -272,13 +272,13 @@ namespace Banshee.InternetRadio
             }
         }
 
-        #region IBasicPlaybackController implementation 
-        
+        #region IBasicPlaybackController implementation
+
         public bool First ()
         {
             return false;
         }
-        
+
         public bool Next (bool restart)
         {
             RadioTrackInfo radio_track = ServiceManager.PlaybackController.CurrentTrack as RadioTrackInfo;
@@ -288,7 +288,7 @@ namespace Banshee.InternetRadio
                 return false;
             }
         }
-        
+
         public bool Previous (bool restart)
         {
             RadioTrackInfo radio_track = ServiceManager.PlaybackController.CurrentTrack as RadioTrackInfo;
@@ -298,14 +298,14 @@ namespace Banshee.InternetRadio
                 return false;
             }
         }
-        
-        #endregion 
+
+        #endregion
 
         public override bool AcceptsInputFromSource (Source source)
         {
             return false;
         }
-        
+
         public override bool CanDeleteTracks {
             get { return false; }
         }
@@ -313,15 +313,15 @@ namespace Banshee.InternetRadio
         public override bool ShowBrowser {
             get { return true; }
         }
-        
+
         public override bool CanRename {
             get { return false; }
         }
-        
+
         protected override bool HasArtistAlbum {
             get { return false; }
         }
-        
+
         public override bool HasViewableTrackProperties {
             get { return false; }
         }
diff --git a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs
index c73c840..d25c6b5 100644
--- a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs
+++ b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/InternetRadioSourceContents.cs
@@ -29,9 +29,9 @@
 using System;
 using Mono.Unix;
 
-using Gtk; 
- 
-using Hyena.Data; 
+using Gtk;
+
+using Hyena.Data;
 using Hyena.Data.Gui;
 
 using Banshee.Base;
@@ -51,17 +51,17 @@ namespace Banshee.InternetRadio
     {
         private TrackListView track_view;
         private QueryFilterView<string> genre_view;
-        
+
         public InternetRadioSourceContents () : base ("iradio")
         {
         }
-        
+
         protected override void InitializeViews ()
         {
             SetupMainView (track_view = new TrackListView ());
-            SetupFilterView (genre_view = new QueryFilterView<string> (Catalog.GetString ("Not Set")));    
+            SetupFilterView (genre_view = new QueryFilterView<string> (Catalog.GetString ("Not Set")));
         }
-        
+
         protected override void ClearFilterSelections ()
         {
             if (genre_view.Model != null) {
@@ -72,7 +72,7 @@ namespace Banshee.InternetRadio
         protected override bool ActiveSourceCanHasBrowser {
             get { return true; }
         }
-        
+
         protected override string ForcePosition {
             get { return "left"; }
         }
@@ -85,18 +85,18 @@ namespace Banshee.InternetRadio
             if (track_source == null) {
                 return false;
             }
-            
+
             base.source = source;
-            
+
             SetModel (track_view, track_source.TrackModel);
-            
+
             foreach (IListModel model in track_source.CurrentFilters) {
                 IListModel<QueryFilterInfo<string>> genre_model = model as IListModel<QueryFilterInfo<string>>;
                 if (genre_model != null) {
                     SetModel (genre_view, genre_model);
                 }
             }
-            
+
             return true;
         }
 
@@ -109,12 +109,12 @@ namespace Banshee.InternetRadio
 
         #endregion
 
-        #region ITrackModelSourceContents implementation 
-        
+        #region ITrackModelSourceContents implementation
+
         public IListView<TrackInfo> TrackView {
             get { return track_view; }
         }
-        
+
         #endregion
     }
 }
diff --git a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
index 24b958b..137d5ed 100644
--- a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
+++ b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/StationEditor.cs
@@ -49,45 +49,45 @@ namespace Banshee.InternetRadio
         private Alignment error_container;
         private Label error;
         private DatabaseTrackInfo track;
-        
+
         Table table;
-        
+
         public StationEditor (DatabaseTrackInfo track) : base()
         {
             AccelGroup accel_group = new AccelGroup ();
             AddAccelGroup (accel_group);
-            
+
             Title = String.Empty;
             SkipTaskbarHint = true;
             Modal = true;
-            
+
             this.track = track;
-            
+
             string title = track == null
                 ? Catalog.GetString ("Add new radio station")
                 : Catalog.GetString ("Edit radio station");
-            
+
             BorderWidth = 6;
             HasSeparator = false;
             DefaultResponse = ResponseType.Ok;
             Modal = true;
-            
+
             VBox.Spacing = 6;
-            
+
             HBox split_box = new HBox ();
             split_box.Spacing = 12;
             split_box.BorderWidth = 6;
-            
+
             Image image = new Image ();
             image.IconSize = (int)IconSize.Dialog;
             image.IconName = "radio";
             image.Yalign = 0.0f;
             image.Show ();
-            
+
             VBox main_box = new VBox ();
             main_box.BorderWidth = 5;
             main_box.Spacing = 10;
-            
+
             Label header = new Label ();
             header.Markup = String.Format ("<big><b>{0}</b></big>", GLib.Markup.EscapeText (title));
             header.Xalign = 0.0f;
@@ -98,11 +98,11 @@ namespace Banshee.InternetRadio
             message.Xalign = 0.0f;
             message.Wrap = true;
             message.Show ();
-            
+
             table = new Table (5, 2, false);
             table.RowSpacing = 6;
             table.ColumnSpacing = 6;
-                        
+
             genre_entry = ComboBoxEntry.NewText ();
 
             foreach (string genre in ServiceManager.DbConnection.QueryEnumerable<string> ("SELECT DISTINCT Genre FROM CoreTracks ORDER BY Genre")) {
@@ -110,170 +110,170 @@ namespace Banshee.InternetRadio
                     genre_entry.AppendText (genre);
                 }
             }
-            
+
             if (track != null && !String.IsNullOrEmpty (track.Genre)) {
                 genre_entry.Entry.Text = track.Genre;
             }
-            
+
             AddRow (Catalog.GetString ("Station Genre:"), genre_entry);
-            
+
             name_entry        = AddEntryRow (Catalog.GetString ("Station Name:"));
             stream_entry      = AddEntryRow (Catalog.GetString ("Stream URL:"));
             creator_entry     = AddEntryRow (Catalog.GetString ("Station Creator:"));
             description_entry = AddEntryRow (Catalog.GetString ("Description:"));
-            
+
             rating_entry = new RatingEntry ();
             HBox rating_box = new HBox ();
             rating_box.PackStart (rating_entry, false, false, 0);
             AddRow (Catalog.GetString ("Rating:"), rating_box);
-            
+
             table.ShowAll ();
-            
+
             main_box.PackStart (header, false, false, 0);
             main_box.PackStart (message, false, false, 0);
             main_box.PackStart (table, false, false, 0);
             main_box.Show ();
-            
+
             split_box.PackStart (image, false, false, 0);
             split_box.PackStart (main_box, true, true, 0);
             split_box.Show ();
-            
+
             VBox.PackStart (split_box, true, true, 0);
-            
+
             Button cancel_button = new Button (Stock.Cancel);
             cancel_button.CanDefault = false;
             cancel_button.UseStock = true;
             cancel_button.Show ();
             AddActionWidget (cancel_button, ResponseType.Close);
-            
-            cancel_button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Escape, 
+
+            cancel_button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Escape,
                 0, Gtk.AccelFlags.Visible);
-            
+
             save_button = new Button (Stock.Save);
             save_button.CanDefault = true;
             save_button.UseStock = true;
             save_button.Sensitive = false;
             save_button.Show ();
             AddActionWidget (save_button, ResponseType.Ok);
-            
-            save_button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return, 
+
+            save_button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return,
                 0, Gtk.AccelFlags.Visible);
-                
+
             name_entry.HasFocus = true;
-            
+
             if (track != null) {
                 if (!String.IsNullOrEmpty (track.TrackTitle)) {
                     name_entry.Text = track.TrackTitle;
                 }
-                
+
                 if (!String.IsNullOrEmpty (track.Uri.AbsoluteUri)) {
                     stream_entry.Text = track.Uri.AbsoluteUri;
                 }
-                
+
                 if (!String.IsNullOrEmpty (track.Comment)) {
                     description_entry.Text = track.Comment;
                 }
-                
+
                 if (!String.IsNullOrEmpty (track.ArtistName)) {
                     creator_entry.Text = track.ArtistName;
                 }
-                
+
                 rating_entry.Value = track.Rating;
             }
-            
+
             error_container = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
             error_container.TopPadding = 6;
             HBox error_box = new HBox ();
             error_box.Spacing = 4;
-            
+
             Image error_image = new Image ();
             error_image.Stock = Stock.DialogError;
             error_image.IconSize = (int)IconSize.Menu;
             error_image.Show ();
-            
+
             error = new Label ();
             error.Xalign = 0.0f;
             error.Show ();
-            
+
             error_box.PackStart (error_image, false, false, 0);
             error_box.PackStart (error, true, true, 0);
             error_box.Show ();
-            
+
             error_container.Add (error_box);
-            
+
             table.Attach (error_container, 0, 2, 4, 5, AttachOptions.Expand | AttachOptions.Fill, AttachOptions.Shrink, 0, 0);
-            
+
             genre_entry.Entry.Changed += OnFieldsChanged;
             name_entry.Changed += OnFieldsChanged;
             stream_entry.Changed += OnFieldsChanged;
-            
+
             OnFieldsChanged (this, EventArgs.Empty);
         }
-        
+
         private Entry AddEntryRow (string title)
         {
             Entry entry = new Entry ();
             AddRow (title, entry);
             return entry;
         }
-        
+
         private uint row = 0;
         private void AddRow (string title, Widget entry)
         {
             Label label = new Label (title);
             label.Xalign = 0.0f;
-            
+
             table.Attach (label, 0, 1, row, row + 1, AttachOptions.Fill, AttachOptions.Fill | AttachOptions.Expand, 0, 0);
             table.Attach (entry, 1, 2, row, row + 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Shrink, 0, 0);
             row++;
         }
-        
+
         private void OnFieldsChanged (object o, EventArgs args)
         {
-            save_button.Sensitive = genre_entry.Entry.Text.Trim ().Length > 0 && 
+            save_button.Sensitive = genre_entry.Entry.Text.Trim ().Length > 0 &&
                 name_entry.Text.Trim ().Length > 0 && stream_entry.Text.Trim ().Length > 0;
         }
-        
+
         public void FocusUri ()
         {
             stream_entry.HasFocus = true;
             stream_entry.SelectRegion (0, stream_entry.Text.Length);
         }
-        
+
         public DatabaseTrackInfo Track {
             get { return track; }
         }
-        
+
         public string Genre {
             get { return genre_entry.Entry.Text.Trim (); }
         }
-        
+
         public string StationCreator {
             get { return creator_entry.Text.Trim (); }
         }
-        
+
         public string StationTitle {
             get { return name_entry.Text.Trim (); }
         }
-        
+
         public string StreamUri {
             get { return stream_entry.Text.Trim (); }
         }
-        
+
         public string Description {
             get { return description_entry.Text.Trim (); }
         }
-        
+
         public int Rating {
             get { return rating_entry.Value; }
         }
-        
+
         public string ErrorMessage {
-            set { 
+            set {
                 if (value == null) {
                     error_container.Hide ();
                 } else {
-                    error.Text = value; 
+                    error.Text = value;
                     error_container.Show ();
                 }
             }
diff --git a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs
index df65e5e..6db686f 100644
--- a/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs
+++ b/src/Extensions/Banshee.InternetRadio/Banshee.InternetRadio/XspfMigrator.cs
@@ -43,43 +43,43 @@ namespace Banshee.InternetRadio
     public class XspfMigrator
     {
         private InternetRadioSource source;
-        
+
         public XspfMigrator (InternetRadioSource source)
         {
             this.source = source;
         }
-        
+
         public bool Migrate ()
         {
             if (DatabaseConfigurationClient.Client.Get<bool> ("InternetRadio.LegacyXspfMigrated", false)) {
                 return false;
             }
-            
+
             DatabaseConfigurationClient.Client.Set<bool> ("InternetRadio.LegacyXspfMigrated", true);
-            
+
             string xspf_path = Paths.Combine (Paths.LegacyApplicationData, "plugins", "stations");
 
             try {
                 foreach (string file in Directory.GetFiles (Paths.Combine (xspf_path, "user"), "*.xspf")) {
                     MigrateXspf (file);
                 }
-                
+
                 foreach (string file in Directory.GetFiles (xspf_path, "*.xspf")) {
                     MigrateXspf (file);
                 }
             } catch (Exception e) {
                 Hyena.Log.Exception ("Migrating Internet Radio Stations", e);
             }
-            
+
             return true;
         }
-        
+
         private void MigrateXspf (string path)
         {
             try {
                 Media.Playlists.Xspf.Playlist playlist = new Media.Playlists.Xspf.Playlist ();
                 playlist.Load (path);
-                
+
                 foreach (Track track in playlist.Tracks) {
                     try {
                         MigrateXspfTrack (playlist, track);
@@ -89,51 +89,51 @@ namespace Banshee.InternetRadio
                 }
             } catch (Exception e) {
                 Log.Exception ("Could not migrat XSPF playlist", e);
-            }   
+            }
         }
-        
+
         private void MigrateXspfTrack (Media.Playlists.Xspf.Playlist playlist, Track track)
         {
             if (track.LocationCount <= 0) {
                 return;
             }
-        
+
             DatabaseTrackInfo station = new DatabaseTrackInfo ();
             station.PrimarySource = source;
             station.IsLive = true;
-            
+
             station.Uri = GetSafeUri (track.Locations[0]);
-            
+
             if (!String.IsNullOrEmpty (track.Title)) {
                 station.TrackTitle = track.Title;
             }
-            
+
             if (!String.IsNullOrEmpty (track.Creator)) {
                 station.ArtistName = track.Creator;
             }
-            
+
             if (!String.IsNullOrEmpty (track.Annotation)) {
                 station.Comment = track.Annotation;
             }
-            
+
             if (!String.IsNullOrEmpty (playlist.Title)) {
                 station.Genre = playlist.Title;
             }
-            
+
             if (track.Info != null) {
                 station.MoreInfoUri = GetSafeUri (track.Info);
             }
-            
+
             station.Save ();
         }
-        
+
         private SafeUri GetSafeUri (Uri uri)
         {
             try {
                 if (uri == null) {
                     return null;
                 }
-                
+
                 string absolute = uri.AbsoluteUri;
                 return String.IsNullOrEmpty (absolute) ? null : new SafeUri (absolute);
             } catch {
diff --git a/src/Extensions/Banshee.InternetRadio/Makefile.in b/src/Extensions/Banshee.InternetRadio/Makefile.in
index a379b7b..a7172a4 100644
--- a/src/Extensions/Banshee.InternetRadio/Makefile.in
+++ b/src/Extensions/Banshee.InternetRadio/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,6 +386,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -480,11 +490,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -502,6 +513,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -531,6 +543,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -550,14 +563,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.InternetRadio/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.InternetRadio/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.InternetRadio/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.InternetRadio/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -575,25 +588,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -623,13 +652,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -661,6 +694,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -681,6 +715,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -689,18 +725,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -761,7 +807,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -778,6 +824,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs
index 6813f6d..44ceed0 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/AudioscrobblerService.cs
@@ -40,7 +40,6 @@ using Mono.Unix;
 using Hyena;
 
 using Lastfm;
-using Lastfm.Gui;
 
 using Banshee.MediaEngine;
 using Banshee.Base;
@@ -61,93 +60,88 @@ namespace Banshee.Lastfm.Audioscrobbler
         private ActionGroup actions;
         private uint ui_manager_id;
         private InterfaceActionService action_service;
-        private Queue queue;        
+        private Queue queue;
         private Account account;
-        
+
         private bool queued; /* if current_track has been queued */
         private bool now_playing_sent = false; /* self explanitory :) */
         private int iterate_countdown = 4 * 4; /* number of times to wait for iterate event before sending now playing */
-        
+
         private DateTime song_start_time;
         private TrackInfo last_track;
-    
+
         public AudioscrobblerService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             account = LastfmCore.Account;
-            
+
             if (account.UserName == null) {
                 account.UserName = LastUserSchema.Get ();
-                account.CryptedPassword = LastPassSchema.Get ();
+                account.SessionKey = LastSessionKeySchema.Get ();
                 account.ScrobbleUrl = LastScrobbleUrlSchema.Get ();
             }
-            
+
             if (LastfmCore.UserAgent == null) {
                 LastfmCore.UserAgent = Banshee.Web.Browser.UserAgent;
             }
-            
+
             Browser.Open = Banshee.Web.Browser.Open;
-            
+
             queue = new Queue ();
             LastfmCore.AudioscrobblerQueue = queue;
             connection = LastfmCore.Audioscrobbler;
-            
+
             Network network = ServiceManager.Get<Network> ();
             connection.UpdateNetworkState (network.Connected);
             network.StateChanged += delegate (object o, NetworkStateChangedArgs args) {
                 connection.UpdateNetworkState (args.Connected);
             };
-            
+
             // Update the Visit action menu item if we update our account info
             LastfmCore.Account.Updated += delegate (object o, EventArgs args) {
-                actions["AudioscrobblerVisitAction"].Sensitive = LastfmCore.Account.UserName != null 
-                    && LastfmCore.Account.CryptedPassword != null;
+                actions["AudioscrobblerVisitAction"].Sensitive = String.IsNullOrEmpty (LastfmCore.Account.UserName);
             };
-            
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
+
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
                 PlayerEvent.StartOfStream |
                 PlayerEvent.EndOfStream |
                 PlayerEvent.Seek |
                 PlayerEvent.Iterate);
-            
+
             action_service = ServiceManager.Get<InterfaceActionService> ("InterfaceActionService");
             InterfaceInitialize ();
         }
-        
+
         public void InterfaceInitialize ()
         {
             actions = new ActionGroup ("Audioscrobbler");
-            
+
             actions.Add (new ActionEntry [] {
                 new ActionEntry ("AudioscrobblerAction", null,
                     Catalog.GetString ("_Last.fm"), null,
                     Catalog.GetString ("Configure the Audioscrobbler plugin"), null),
-                    
+
                 new ActionEntry ("AudioscrobblerVisitAction", null,
                     Catalog.GetString ("Visit _User Profile Page"), null,
-                    Catalog.GetString ("Visit Your Last.fm Profile Page"), OnVisitOwnProfile),
-                
-                new ActionEntry ("AudioscrobblerConfigureAction", Stock.Properties,
-                    Catalog.GetString ("_Configure..."), null,
-                    Catalog.GetString ("Configure the Last.fm Extension"), OnConfigurePlugin)
+                    Catalog.GetString ("Visit Your Last.fm Profile Page"), OnVisitOwnProfile)
             });
-            
-            actions.Add (new ToggleActionEntry [] { 
+
+            actions.Add (new ToggleActionEntry [] {
                 new ToggleActionEntry ("AudioscrobblerEnableAction", null,
                     Catalog.GetString ("_Enable Song Reporting"), "<control>U",
                     Catalog.GetString ("Enable song reporting"), OnToggleEnabled, Enabled)
             });
-            
+
             action_service.UIManager.InsertActionGroup (actions, 0);
             ui_manager_id = action_service.UIManager.AddUiFromResource ("AudioscrobblerMenu.xml");
-            
+
             actions["AudioscrobblerVisitAction"].Sensitive = account.UserName != null && account.UserName != String.Empty;
         }
-        
-  
+
+
         public void Dispose ()
         {
             // Try and queue the currently playing track just in case it's queueable
@@ -155,18 +149,18 @@ namespace Banshee.Lastfm.Audioscrobbler
             if (ServiceManager.PlayerEngine.CurrentTrack != null) {
                 Queue (ServiceManager.PlayerEngine.CurrentTrack);
             }
-            
+
             ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
-            
+
             // When we stop the connection, queue ends up getting saved too, so the
             // track we queued earlier should stay until next session.
             connection.Stop ();
-        
+
             action_service.UIManager.RemoveUi (ui_manager_id);
             action_service.UIManager.RemoveActionGroup (actions);
             actions = null;
         }
-        
+
         // We need to time how long the song has played
         internal class SongTimer
         {
@@ -174,16 +168,16 @@ namespace Banshee.Lastfm.Audioscrobbler
             public long PlayTime {
                 get { return playtime; }
             }
-            
+
             private long previouspos = 0;
-            
+
             // number of events to ignore to get sync (since events may be fired in wrong order)
             private int ignorenext = 0;
-                        
+
             public void IncreasePosition ()
             {
                 long increase = 0;
-                
+
                 if (ignorenext == 0) {
                     increase = (ServiceManager.PlayerEngine.Position - previouspos);
                     if (increase > 0) {
@@ -192,17 +186,17 @@ namespace Banshee.Lastfm.Audioscrobbler
                 } else {
                     ignorenext--;
                 }
-                
+
                 previouspos = ServiceManager.PlayerEngine.Position;
             }
-            
+
             public void SkipPosition ()
-            {                
+            {
                 // Set newly seeked position
                 previouspos = ServiceManager.PlayerEngine.Position;
                 ignorenext = 2; // allow 2 iterates to sync
             }
-            
+
             public void Reset ()
             {
                 playtime = 0;
@@ -210,115 +204,104 @@ namespace Banshee.Lastfm.Audioscrobbler
                 ignorenext = 0;
             }
         }
-        
+
         SongTimer st = new SongTimer ();
-        
+
         private void Queue (TrackInfo track) {
-            if (track == null || st.PlayTime == 0 || 
+            if (track == null || st.PlayTime == 0 ||
                 !(actions["AudioscrobblerEnableAction"] as ToggleAction).Active) {
-                
+
                 return;
             }
-            
+
             Log.DebugFormat ("Track {3} had playtime of {0} msec ({4}sec), duration {1} msec, queued: {2}",
                 st.PlayTime, track.Duration.TotalMilliseconds, queued, track, st.PlayTime / 1000);
-            
-            if (!queued && track.Duration.TotalSeconds > 30 && 
-                (track.MediaAttributes & TrackMediaAttributes.Music) != 0 && 
+
+            if (!queued && track.Duration.TotalSeconds > 30 &&
+                (track.MediaAttributes & TrackMediaAttributes.Music) != 0 &&
                 !String.IsNullOrEmpty (track.ArtistName) && !String.IsNullOrEmpty (track.TrackTitle) &&
                 (st.PlayTime > track.Duration.TotalMilliseconds / 2 || st.PlayTime > 240 * 1000)) {
                     if (!connection.Started) {
                         connection.Start ();
                     }
-                    
+
                     queue.Add (track, song_start_time);
                     queued = true;
             }
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
                 case PlayerEvent.StartOfStream:
                     // Queue the previous track in case of a skip
                     Queue (last_track);
-                
+
                     st.Reset ();
                     song_start_time = DateTime.Now;
                     last_track = ServiceManager.PlayerEngine.CurrentTrack;
                     queued = false;
                     now_playing_sent = false;
                     iterate_countdown = 4 * 4;  /* we get roughly 4 events/sec */
-                    
+
                     break;
-                
+
                 case PlayerEvent.Seek:
                     st.SkipPosition ();
                     break;
-                
+
                 case PlayerEvent.Iterate:
                     // Queue as now playing
                     if (!now_playing_sent && iterate_countdown == 0) {
                         if (last_track != null && last_track.Duration.TotalSeconds > 30 &&
                             (actions["AudioscrobblerEnableAction"] as ToggleAction).Active &&
                             (last_track.MediaAttributes & TrackMediaAttributes.Music) != 0) {
-                            
+
                             connection.NowPlaying (last_track.ArtistName, last_track.TrackTitle,
                                 last_track.AlbumTitle, last_track.Duration.TotalSeconds, last_track.TrackNumber);
                         }
-                        
+
                         now_playing_sent = true;
                     } else if (iterate_countdown > 0) {
                         iterate_countdown --;
                     }
-                    
+
                     st.IncreasePosition ();
                     break;
-                
+
                 case PlayerEvent.EndOfStream:
                     Queue (ServiceManager.PlayerEngine.CurrentTrack);
-                    iterate_countdown = 4 * 4; 
+                    iterate_countdown = 4 * 4;
                     break;
             }
         }
-        
-        private void OnConfigurePlugin (object o, EventArgs args)
-        {
-            AccountLoginDialog dialog = new AccountLoginDialog (account, true);
-            dialog.SaveOnEdit = true;
-            if (account.UserName == null) {
-                dialog.AddSignUpButton ();
-            }
-            dialog.Run ();
-            dialog.Destroy ();
-        }
-        
+
         private void OnVisitOwnProfile (object o, EventArgs args)
         {
             account.VisitUserProfile (account.UserName);
         }
-        
+
         private void OnToggleEnabled (object o, EventArgs args)
         {
             Enabled = (o as ToggleAction).Active;
         }
-        
+
         internal bool Enabled {
             get { return EngineEnabledSchema.Get (); }
-            set { 
+            set {
                 EngineEnabledSchema.Set (value);
                 (actions["AudioscrobblerEnableAction"] as ToggleAction).Active = value;
             }
         }
-           
+
         public static readonly SchemaEntry<string> LastUserSchema = new SchemaEntry<string> (
             "plugins.lastfm", "username", "", "Last.fm user", "Last.fm username"
         );
 
-        public static readonly SchemaEntry<string> LastPassSchema = new SchemaEntry<string> (
-            "plugins.lastfm", "password_hash", "", "Last.fm password", "Last.fm password (hashed)"
+        public static readonly SchemaEntry<string> LastSessionKeySchema = new SchemaEntry<string> (
+            "plugins.lastfm", "session_key", "", "Last.fm session key", "Last.fm sessions key used in authenticated calls"
         );
-   
+
         public static readonly SchemaEntry<string> LastScrobbleUrlSchema = new SchemaEntry<string> (
             "plugins.audioscrobbler", "api_url",
             null,
@@ -332,7 +315,7 @@ namespace Banshee.Lastfm.Audioscrobbler
             "Engine enabled",
             "Audioscrobbler reporting engine enabled"
         );
-        
+
         string IService.ServiceName {
             get { return "AudioscrobblerService"; }
         }
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/Queue.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/Queue.cs
index fd582dc..462c602 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/Queue.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Audioscrobbler/Queue.cs
@@ -67,9 +67,9 @@ namespace Banshee.Lastfm.Audioscrobbler
                 this.start_time = (long) (start_time.ToUniversalTime () - epoch).TotalSeconds;
                 // TODO
                 //this.musicbrainzid = track.MusicBrainzId;
-                
+
                 this.musicbrainzid = "";
-                
+
                 // set trackauth value, otherwise empty string is default
                 if (track is LastfmTrackInfo) {
                     this.track_auth = (track as LastfmTrackInfo).TrackAuth;
@@ -93,31 +93,31 @@ namespace Banshee.Lastfm.Audioscrobbler
             public long StartTime {
                 get { return start_time; }
             }
-            
+
             public string Artist {
                 get { return artist; }
             }
-            
+
             public string Album {
                 get { return album; }
             }
-            
+
             public string Title {
                 get { return title; }
             }
-            
+
             public int TrackNumber {
                 get { return track_number; }
             }
-            
+
             public int Duration {
                 get { return duration; }
             }
-            
+
             public string MusicBrainzId {
                 get { return musicbrainzid; }
             }
-            
+
             public string TrackAuth {
                 get { return track_auth; }
             }
@@ -143,7 +143,7 @@ namespace Banshee.Lastfm.Audioscrobbler
             string xmlfilepath = Path.Combine (Banshee.Base.Paths.ExtensionCacheRoot, "last.fm");
             xml_path = Path.Combine (xmlfilepath, "audioscrobbler-queue.xml");
             queue = new List<QueuedTrack> ();
-            
+
             if (!Directory.Exists(xmlfilepath)) {
                 Directory.CreateDirectory (xmlfilepath);
             }
@@ -166,7 +166,7 @@ namespace Banshee.Lastfm.Audioscrobbler
 
             writer.WriteStartElement ("AudioscrobblerQueue");
             foreach (QueuedTrack track in queue) {
-                writer.WriteStartElement ("QueuedTrack");    
+                writer.WriteStartElement ("QueuedTrack");
                 writer.WriteElementString ("Artist", track.Artist);
                 writer.WriteElementString ("Album", track.Album);
                 writer.WriteElementString ("Title", track.Title);
@@ -193,7 +193,7 @@ namespace Banshee.Lastfm.Audioscrobbler
                 XmlNodeList nodes = doc.SelectNodes (query);
 
                 foreach (XmlNode node in nodes) {
-                    string artist = "";    
+                    string artist = "";
                     string album = "";
                     string title = "";
                     int track_number = 0;
@@ -225,7 +225,7 @@ namespace Banshee.Lastfm.Audioscrobbler
                     queue.Add (new QueuedTrack (artist, album, title, track_number, duration,
                         start_time, musicbrainzid, track_auth));
                 }
-            } catch { 
+            } catch {
             }
         }
 
@@ -239,14 +239,14 @@ namespace Banshee.Lastfm.Audioscrobbler
                 if (i == 49) break;
 
                 QueuedTrack track = (QueuedTrack) queue[i];
-                
+
                 string str_track_number = String.Empty;
                 if (track.TrackNumber != 0)
                     str_track_number = track.TrackNumber.ToString();
-                 
-                string source = "P"; /* chosen by user */   
+
+                string source = "P"; /* chosen by user */
                 if (track.TrackAuth.Length != 0) {
-                    // from last.fm 
+                    // from last.fm
                     source = "L" + track.TrackAuth;
                 }
 
@@ -255,13 +255,13 @@ namespace Banshee.Lastfm.Audioscrobbler
                     HttpUtility.UrlEncode (track.Artist),
                     HttpUtility.UrlEncode (track.Title),
                     track.StartTime.ToString (),
-                    source, 
-                    ""  /* rating: L/B/S */, 
+                    source,
+                    ""  /* rating: L/B/S */,
                     track.Duration.ToString (),
                     HttpUtility.UrlEncode (track.Album),
                     str_track_number,
                     track.MusicBrainzId,
-                    
+
                     i);
             }
 
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs
index 7465dba..b3eae79 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmActions.cs
@@ -59,7 +59,7 @@ namespace Banshee.Lastfm.Radio
         public LastfmActions (LastfmSource lastfm) : base (ServiceManager.Get<InterfaceActionService> (), "Lastfm")
         {
             this.lastfm = lastfm;
-            
+
             AddImportant (
                 new ActionEntry (
                     "LastfmAddAction", Stock.Add,
@@ -112,7 +112,7 @@ namespace Banshee.Lastfm.Radio
 
                 new ActionEntry ("LastfmArtistPlaySimilarRadioAction", StationType.Similar.IconName,
                     String.Format (listen_to, String.Format ("'{0}'", Catalog.GetString ("Similar to"))), null,
-                    String.Format (listen_to_long, String.Format ("'{0}'", Catalog.GetString ("Similar to"))), 
+                    String.Format (listen_to_long, String.Format ("'{0}'", Catalog.GetString ("Similar to"))),
                     OnArtistPlaySimilarRadio),
 
                 new ActionEntry ("LastfmArtistRecommendAction", "",
@@ -169,8 +169,8 @@ namespace Banshee.Lastfm.Radio
             lastfm.Connection.StateChanged += HandleConnectionStateChanged;
             Actions.SourceActions ["SourcePropertiesAction"].Activated += OnSourceProperties;
             ServiceManager.PlaybackController.SourceChanged += OnPlaybackSourceChanged;
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.StartOfStream | 
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
+                PlayerEvent.StartOfStream |
                 PlayerEvent.EndOfStream);
             UpdateActions ();
         }
@@ -183,7 +183,7 @@ namespace Banshee.Lastfm.Radio
             base.Dispose ();
         }
 
-#region Action Handlers 
+#region Action Handlers
 
         private void OnAddStation (object sender, EventArgs args)
         {
@@ -200,9 +200,7 @@ namespace Banshee.Lastfm.Radio
         private void OnSourceProperties (object o, EventArgs args)
         {
             Source source = Actions.SourceActions.ActionSource;
-            if (source is LastfmSource) {
-                ShowLoginDialog ();
-            } else if (source is StationSource) {
+            if (source is StationSource) {
                 StationEditor editor = new StationEditor (lastfm, source as StationSource);
                 editor.RunDialog ();
             }
@@ -219,7 +217,7 @@ namespace Banshee.Lastfm.Radio
         private void OnLoved (object sender, EventArgs args)
         {
             LastfmTrackInfo track = ServiceManager.PlayerEngine.CurrentTrack as LastfmTrackInfo;
-            if (track == null) 
+            if (track == null)
                 return;
 
             track.Love ();
@@ -301,7 +299,7 @@ namespace Banshee.Lastfm.Radio
                     break;
                 }
             }
-            
+
             if (fan_radio == null) {
                 fan_radio = new StationSource (lastfm,
                     String.Format (Catalog.GetString ("Fans of {0}"), CurrentArtist),
@@ -322,7 +320,7 @@ namespace Banshee.Lastfm.Radio
                     break;
                 }
             }
-            
+
             if (similar_radio == null) {
                 similar_radio = new StationSource (lastfm,
                     String.Format (Catalog.GetString ("Similar to {0}"), CurrentArtist),
@@ -345,7 +343,7 @@ namespace Banshee.Lastfm.Radio
         private void OnTrackRecommend (object sender, EventArgs args)
         {
         }
-        
+
 #endregion
 
         private string artist;
@@ -368,17 +366,17 @@ namespace Banshee.Lastfm.Radio
 
         public void ShowLoginDialog ()
         {
-            AccountLoginDialog dialog = new AccountLoginDialog (lastfm.Account, true);
-            dialog.SaveOnEdit = false;
-            if (lastfm.Account.UserName == null) {
-                dialog.AddSignUpButton ();
+            try {
+                Banshee.Preferences.Gui.PreferenceDialog dialog = new Banshee.Preferences.Gui.PreferenceDialog ();
+                dialog.ShowSourcePageId (lastfm.PreferencesPageId);
+                dialog.Run ();
+                dialog.Destroy ();
+            } catch (ApplicationException) {
             }
-            dialog.Run ();
-            dialog.Destroy ();
         }
 
         private void OnPlayerEvent (PlayerEventArgs args)
-        { 
+        {
             UpdateActions ();
         }
 
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmColumnController.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmColumnController.cs
index 8cc3c4d..8df6a11 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmColumnController.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmColumnController.cs
@@ -43,7 +43,7 @@ namespace Banshee.Lastfm.Radio
                 AlbumColumn,
                 DurationColumn
             );
-            
+
             DefaultSortColumn = ArtistColumn;
             Load ();
         }
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs
index e8685a4..4d8e038 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSource.cs
@@ -33,6 +33,7 @@ using System.Collections.Generic;
 using Mono.Unix;
 
 using Lastfm;
+using Lastfm.Gui;
 using Hyena.Data;
 
 using Banshee.Base;
@@ -42,13 +43,14 @@ using Banshee.Sources;
 using Banshee.MediaEngine;
 using Banshee.ServiceStack;
 using Banshee.Networking;
+using Banshee.Preferences;
 
 using Banshee.Sources.Gui;
 
 using Browser = Lastfm.Browser;
 
 namespace Banshee.Lastfm.Radio
-{   
+{
     public class LastfmSource : Source, IDisposable
     {
         private const string lastfm = "Last.fm";
@@ -76,15 +78,16 @@ namespace Banshee.Lastfm.Radio
             // username we used so we can load the user's stations.
             if (account.UserName != null) {
                 account.UserName = LastUserSchema.Get ();
-                account.CryptedPassword = LastPassSchema.Get ();
+                account.SessionKey = LastSessionKeySchema.Get ();
+                account.Subscriber = LastIsSubscriberSchema.Get ();
             }
 
             if (LastfmCore.UserAgent == null) {
                 LastfmCore.UserAgent = Banshee.Web.Browser.UserAgent;
             }
-            
+
             Browser.Open = Banshee.Web.Browser.Open;
-            
+
             connection = LastfmCore.Radio;
             Network network = ServiceManager.Get<Network> ();
             connection.UpdateNetworkState (network.Connected);
@@ -99,7 +102,6 @@ namespace Banshee.Lastfm.Radio
             Properties.Set<bool> ("ActiveSourceUIResourcePropagate", true);
             Properties.SetString ("GtkActionPath", "/LastfmSourcePopup");
             Properties.SetString ("Icon.Name", "lastfm-audioscrobbler");
-            Properties.SetString ("SourcePropertiesActionLabel", Catalog.GetString ("Edit Last.fm Settings"));
             Properties.SetString ("SortChildrenActionLabel", Catalog.GetString ("Sort Stations by"));
             Properties.Set<LastfmColumnController> ("TrackView.ColumnController", new LastfmColumnController ());
 
@@ -108,6 +110,7 @@ namespace Banshee.Lastfm.Radio
             Properties.Set<bool> ("Nereid.SourceContents.HeaderVisible", false);
 
             actions = new LastfmActions (this);
+            InstallPreferences ();
 
             ServiceManager.SourceManager.AddSource (this);
 
@@ -119,8 +122,9 @@ namespace Banshee.Lastfm.Radio
             ServiceManager.Get<DBusCommandService> ().ArgumentPushed -= OnCommandLineArgument;
             Connection.StateChanged -= HandleConnectionStateChanged;
             Connection.Dispose ();
+            UninstallPreferences ();
             actions.Dispose ();
-            
+
             actions = null;
             connection = null;
             account = null;
@@ -131,7 +135,7 @@ namespace Banshee.Lastfm.Radio
             if (!isFile || String.IsNullOrEmpty (uri)) {
                 return;
             }
-            
+
             // Handle lastfm:// URIs
             if (uri.StartsWith ("lastfm://")) {
                 StationSource.CreateFromUrl (this, uri);
@@ -156,22 +160,22 @@ namespace Banshee.Lastfm.Radio
                 Catalog.GetString ("Total Play Count"),
                 SortType.Descending, new PlayCountComparer ())
         };
-        
+
         public override SourceSortType[] ChildSortTypes {
             get { return sort_types; }
         }
-        
+
         public override SourceSortType DefaultChildSort {
             get { return SortNameAscending; }
         }
-        
+
         private string last_username;
         private bool last_was_subscriber = false;
         public void SetUserName (string username)
         {
-            if (username != last_username || last_was_subscriber != Connection.Subscriber) {
+            if (username != last_username || last_was_subscriber != Account.Subscriber) {
                 last_username = username;
-                last_was_subscriber = Connection.Subscriber;
+                last_was_subscriber = Account.Subscriber;
                 LastfmSource.LastUserSchema.Set (last_username);
                 ClearChildSources ();
                 PauseSorting ();
@@ -205,7 +209,7 @@ namespace Banshee.Lastfm.Radio
         }
 
         public override bool HasProperties {
-            get { return true; }
+            get { return false; }
         }
 
         private void HandleConnectionStateChanged (object sender, ConnectionStateChangedArgs args)
@@ -216,12 +220,13 @@ namespace Banshee.Lastfm.Radio
         private void UpdateUI ()
         {
             bool have_user = Account.UserName != null;
-            bool have_pass = Account.CryptedPassword != null;
-            
-            if (have_pass) {
-                LastPassSchema.Set (Account.CryptedPassword);
+            bool have_session_key = Account.SessionKey != null;
+
+            if (have_session_key) {
+                LastSessionKeySchema.Set (Account.SessionKey);
+                LastIsSubscriberSchema.Set (Account.Subscriber);
             }
-            
+
             if (have_user) {
                 SetUserName (Account.UserName);
             } else {
@@ -252,15 +257,114 @@ namespace Banshee.Lastfm.Radio
         internal static void SetStatus (SourceMessage status_message, LastfmSource lastfm, bool error, ConnectionState state)
         {
             status_message.FreezeNotify ();
-            if (error && (state == ConnectionState.NoAccount || state == ConnectionState.InvalidAccount)) {
-                status_message.AddAction (new MessageAction (Catalog.GetString ("Account Settings"),
-                    delegate { lastfm.Actions.ShowLoginDialog (); }));
-                status_message.AddAction (new MessageAction (Catalog.GetString ("Join Last.fm"),
-                    delegate { lastfm.Account.SignUp (); }));
+            if (error) {
+                if (state == ConnectionState.NoAccount || state == ConnectionState.InvalidAccount || state == ConnectionState.NotAuthorized) {
+                    status_message.AddAction (new MessageAction (Catalog.GetString ("Account Settings"),
+                        delegate { lastfm.Actions.ShowLoginDialog (); }));
+                }
+                if (state == ConnectionState.NoAccount || state == ConnectionState.InvalidAccount) {
+                    status_message.AddAction (new MessageAction (Catalog.GetString ("Join Last.fm"),
+                        delegate { lastfm.Account.SignUp (); }));
+                }
             }
             status_message.ThawNotify ();
         }
 
+        private SourcePage pref_page;
+        private Section pref_section;
+        private SchemaPreference<string> user_pref;
+
+        private void InstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null) {
+                return;
+            }
+
+            service.InstallWidgetAdapters += OnPreferencesServiceInstallWidgetAdapters;
+            pref_page = new Banshee.Preferences.SourcePage (this);
+            pref_section = pref_page.Add (new Section ("lastfm-account", Catalog.GetString ("Account"), 20));
+            pref_section.ShowLabel = false;
+
+            user_pref = new SchemaPreference<string> (LastUserSchema, Catalog.GetString ("_Username"));
+            pref_section.Add (user_pref);
+            pref_section.Add (new VoidPreference ("lastfm-signup"));
+        }
+
+        private void UninstallPreferences ()
+        {
+            PreferenceService service = ServiceManager.Get<PreferenceService> ();
+            if (service == null || pref_page == null) {
+                return;
+            }
+
+            service.InstallWidgetAdapters -= OnPreferencesServiceInstallWidgetAdapters;
+            pref_page.Dispose ();
+            pref_page = null;
+        }
+
+        private bool Authorized { get { return !String.IsNullOrEmpty (account.SessionKey); } }
+        private bool NeedAuth { get { return !String.IsNullOrEmpty (user_pref.Value) && !Authorized; } }
+
+        private void OnPreferencesServiceInstallWidgetAdapters (object sender, EventArgs args)
+        {
+            if (pref_section == null) {
+                return;
+            }
+
+            var user_entry = new Gtk.Entry (user_pref.Value ?? "");
+            user_entry.Changed += (o, a) => { user_pref.Value = user_entry.Text; };
+
+            var auth_button = new Gtk.Button (Authorized ? Catalog.GetString ("Authorized!") : Catalog.GetString ("Authorize..."));
+            user_pref.ValueChanged += (s) => { auth_button.Sensitive = NeedAuth; };
+            auth_button.Sensitive = NeedAuth;
+            auth_button.TooltipText = Catalog.GetString ("Open Last.fm in a browser, giving you the option to authorize Banshee to work with your account");
+            auth_button.Clicked += delegate {
+                account.SessionKey = null;
+                account.RequestAuthorization ();
+            };
+
+            var signup_button = new Gtk.LinkButton (account.SignUpUrl, Catalog.GetString ("Sign up for Last.fm"));
+            signup_button.Xalign = 0f;
+
+            var refresh_button = new Gtk.Button (new Gtk.Image (Gtk.Stock.Refresh, Gtk.IconSize.Button));
+            user_pref.ValueChanged += (s) => { refresh_button.Sensitive = NeedAuth; };
+            refresh_button.Sensitive = NeedAuth;
+            refresh_button.TooltipText = Catalog.GetString ("Check if Banshee has been authorized");
+            refresh_button.Clicked += delegate {
+                if (String.IsNullOrEmpty (account.UserName) || account.SessionKey == null) {
+                    account.UserName = LastUserSchema.Get ();
+                    account.FetchSessionKey ();
+                    account.Save ();
+                    LastSessionKeySchema.Set (account.SessionKey);
+                }
+
+                auth_button.Sensitive = refresh_button.Sensitive = NeedAuth;
+                auth_button.Label = Authorized
+                    ? Catalog.GetString ("Authorized!")
+                    : Catalog.GetString ("Authorize...");
+            };
+
+            var auth_box = new Gtk.HBox () { Spacing = 6 };
+            auth_box.PackStart (user_entry, true, true, 0);
+            auth_box.PackStart (auth_button, false, false, 0);
+            auth_box.PackStart (refresh_button, false, false, 0);
+            auth_box.ShowAll ();
+
+            signup_button.Visible = String.IsNullOrEmpty (user_pref.Value);
+
+            var button_box = new Gtk.HBox () { Spacing = 6 };
+            button_box.PackStart (new Badge (account) { Visible = true}, false, false, 0);
+            button_box.PackStart (signup_button, true, true, 0);
+
+            user_pref.DisplayWidget = auth_box;
+            pref_section["lastfm-signup"].DisplayWidget = button_box;
+        }
+
+        public override string PreferencesPageId {
+            get { return pref_page.Id; }
+        }
+
         public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
             "plugins.lastfm", "enabled", false, "Extension enabled", "Last.fm extension enabled"
         );
@@ -269,8 +373,12 @@ namespace Banshee.Lastfm.Radio
             "plugins.lastfm", "username", "", "Last.fm user", "Last.fm username"
         );
 
-        public static readonly SchemaEntry<string> LastPassSchema = new SchemaEntry<string> (
-            "plugins.lastfm", "password_hash", "", "Last.fm password", "Last.fm password (hashed)"
+        public static readonly SchemaEntry<string> LastSessionKeySchema = new SchemaEntry<string> (
+            "plugins.lastfm", "session_key", "", "Last.fm session key", "Last.fm session key used in authenticated calls"
+        );
+
+        public static readonly SchemaEntry<bool> LastIsSubscriberSchema = new SchemaEntry<bool> (
+            "plugins.lastfm", "subscriber", false, "User is Last.fm subscriber", "User is Last.fm subscriber"
         );
 
         public static readonly SchemaEntry<bool> ExpandedSchema = new SchemaEntry<bool> (
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs
index e43b89f..f451395 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmSourceContents.cs
@@ -57,7 +57,7 @@ namespace Banshee.Lastfm.Radio
             };
 
             viewport.Add (main_box);
-            
+
             StyleSet += delegate {
                 viewport.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
                 viewport.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
@@ -76,7 +76,7 @@ namespace Banshee.Lastfm.Radio
 
             if (lastfm.Connection.Connected) {
                 UpdateForUser (lastfm.Account.UserName);
-            } else { 
+            } else {
                 lastfm.Connection.StateChanged += HandleConnectionStateChanged;
             }
 
@@ -139,7 +139,7 @@ namespace Banshee.Lastfm.Radio
             recently_loved.SetList (user.RecentLovedTracks);
             recently_played.SetList (user.RecentTracks);
             top_artists.SetList (user.GetTopArtists (TopType.Overall));
-            
+
             ShowAll ();
         }
 
@@ -260,7 +260,7 @@ namespace Banshee.Lastfm.Radio
                 //menu.Append (new MenuItem ("Listen to Loved Station"));
                 //menu.Append (new MenuItem ("Listen to Neighbors Station"));
 
-                menu.ShowAll (); 
+                menu.ShowAll ();
                 menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
                 menu.Deactivated += delegate {
                     (sender as Button).Relief = ReliefStyle.None;
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
index 44e22e7..7f41504 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
@@ -58,7 +58,7 @@ namespace Banshee.Lastfm.Radio
         public bool Hated {
             get { return hated; }
         }
-        
+
         public string TrackAuth {
             get { return trackauth; }
         }
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs
index 0533a66..8f2e83d 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationEditor.cs
@@ -63,7 +63,7 @@ namespace Banshee.Lastfm.Radio
             Initialize ();
             Dialog.Title = Catalog.GetString ("Edit Station");
         }
-    
+
         public StationEditor (LastfmSource lastfm) : base (dialog_name, new Glade.XML (
             System.Reflection.Assembly.GetExecutingAssembly (), dialog_resource, dialog_name, Banshee.ServiceStack.Application.InternalName))
         {
@@ -89,7 +89,7 @@ namespace Banshee.Lastfm.Radio
             int active_type = 0;
             int i = 0;
             foreach (StationType type in StationType.Types) {
-                if (!type.SubscribersOnly || lastfm.Connection.Subscriber) {
+                if (!type.SubscribersOnly || lastfm.Account.Subscriber) {
                     type_combo.AppendText (type.Label);
                     if (source != null && type == source.Type) {
                         active_type = i;
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs
index e74426f..2aeffce 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/StationSource.cs
@@ -49,7 +49,7 @@ using Banshee.MediaEngine;
 using Banshee.Collection;
 using Banshee.ServiceStack;
 using Banshee.PlaybackController;
- 
+
 namespace Banshee.Lastfm.Radio
 {
     public class StationSource : Source, ITrackModelSource, IUnmapableSource, IDisposable, IBasicPlaybackController
@@ -71,9 +71,9 @@ namespace Banshee.Lastfm.Radio
             }
             return null;
         }
-        
+
         private MemoryTrackListModel track_model;
-        
+
         private LastfmSource lastfm;
         public LastfmSource LastfmSource {
             get { return lastfm; }
@@ -113,7 +113,7 @@ namespace Banshee.Lastfm.Radio
         }
 
         private int dbid;
-        
+
         // For StationSources that already exist in the db
         protected StationSource (LastfmSource lastfm, int dbId, string name, string type, string arg, int playCount) : base (generic_name, name, 150, dbId.ToString ())
         {
@@ -174,7 +174,7 @@ namespace Banshee.Lastfm.Radio
             HyenaSqliteCommand command = new HyenaSqliteCommand (
                 @"INSERT INTO LastfmStations (Creator, Name, Type, Arg, PlayCount)
                     VALUES (?, ?, ?, ?, ?)",
-                lastfm.Account.UserName, Name, 
+                lastfm.Account.UserName, Name,
                 Type.ToString (), Arg, PlayCount
             );
 
@@ -195,7 +195,7 @@ namespace Banshee.Lastfm.Radio
             Station = Type.GetStationFor (Arg);
             OnUpdated ();
         }
-        
+
         //private bool shuffle;
         public override void Activate ()
         {
@@ -289,15 +289,15 @@ namespace Banshee.Lastfm.Radio
                     current_track = i;
             }
         }
-        
+
 #region IBasicPlaybackController
 
         bool IBasicPlaybackController.First ()
         {
             return ((IBasicPlaybackController)this).Next (false);
         }
-        
-        private bool playback_requested;    
+
+        private bool playback_requested;
         bool IBasicPlaybackController.Next (bool restart)
         {
             TrackInfo next = NextTrack;
@@ -308,12 +308,12 @@ namespace Banshee.Lastfm.Radio
             }
             return true;
         }
-        
+
         bool IBasicPlaybackController.Previous (bool restart)
         {
             return true;
         }
-        
+
 #endregion
 
         public TrackInfo NextTrack {
@@ -330,7 +330,7 @@ namespace Banshee.Lastfm.Radio
                 return (left < 0) ? 0 : left;
             }
         }
-        
+
         public bool HasDependencies {
             get { return false; }
         }
@@ -388,7 +388,7 @@ namespace Banshee.Lastfm.Radio
 
         private void OnPlayerEvent (PlayerEventArgs args)
         {
-            if (((PlayerEventStateChangeArgs)args).Current == PlayerState.Loaded && 
+            if (((PlayerEventStateChangeArgs)args).Current == PlayerState.Loaded &&
                 track_model.Contains (ServiceManager.PlayerEngine.CurrentTrack)) {
                 CurrentTrack = ServiceManager.PlayerEngine.CurrentTrack;
 
@@ -417,7 +417,7 @@ namespace Banshee.Lastfm.Radio
                 }
             }
         }
-        
+
         private void HandleConnectionStateChanged (object sender, ConnectionStateChangedArgs args)
         {
             UpdateUI (args.State);
@@ -504,7 +504,7 @@ namespace Banshee.Lastfm.Radio
         public bool ShowBrowser {
             get { return false; }
         }
-        
+
         public bool Indexable {
             get { return false; }
         }
@@ -540,11 +540,11 @@ namespace Banshee.Lastfm.Radio
             base.Rename (newName);
             Save ();
         }
-        
+
         public override bool HasProperties {
             get { return true; }
         }
-        
+
         public static List<StationSource> LoadAll (LastfmSource lastfm, string creator)
         {
             List<StationSource> stations = new List<StationSource> ();
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs
index a2c2961..dca4ebe 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/RecommendationPane.cs
@@ -71,9 +71,9 @@ namespace Banshee.Lastfm.Recommendations
         private TitledList artist_box;
         private TitledList album_box;
         private TitledList track_box;
-        
+
         private Gtk.ScrolledWindow similar_artists_view_sw;
-        
+
         private TileView similar_artists_view;
         private VBox album_list;
         private VBox track_list;
@@ -91,7 +91,7 @@ namespace Banshee.Lastfm.Recommendations
             Catalog.GetString ("Unknown Artist"),
             Catalog.GetString ("Various Artists")
         };
-        
+
         private bool ready = false;
         private bool refreshing = false;
         private bool show_when_ready = true;
@@ -100,7 +100,7 @@ namespace Banshee.Lastfm.Recommendations
             set {
                 show_when_ready = value;
                 ShowIfReady ();
-                
+
                 if (!show_when_ready) {
                     CancelTasks ();
                 } else if (!ready && !refreshing) {
@@ -108,7 +108,7 @@ namespace Banshee.Lastfm.Recommendations
                 }
             }
         }
-        
+
         private void ShowIfReady ()
         {
             if (ShowWhenReady && ready) {
@@ -123,7 +123,7 @@ namespace Banshee.Lastfm.Recommendations
                 if (artist == value) {
                     return;
                 }
-                
+
                 ready = false;
                 artist = value;
 
@@ -133,35 +133,35 @@ namespace Banshee.Lastfm.Recommendations
                         break;
                     }
                 }
-                
+
                 if (!String.IsNullOrEmpty (artist)) {
                     RefreshRecommendations ();
                 }
             }
         }
-        
+
         private void RefreshRecommendations ()
         {
             CancelTasks ();
-            
+
             if (show_when_ready && !String.IsNullOrEmpty (Artist)) {
                 refreshing = true;
                 context_page.SetState (Banshee.ContextPane.ContextState.Loading);
                 Banshee.Kernel.Scheduler.Schedule (new RefreshRecommendationsJob (this, Artist));
             }
         }
-        
+
         private void CancelTasks ()
         {
             Banshee.Kernel.Scheduler.Unschedule (typeof (RefreshRecommendationsJob));
             refreshing = false;
         }
-        
+
         public void HideWithTimeout ()
         {
             GLib.Timeout.Add (200, OnHideTimeout);
         }
-        
+
         private bool OnHideTimeout ()
         {
             if (!ShowWhenReady || !ready) {
@@ -196,7 +196,7 @@ namespace Banshee.Lastfm.Recommendations
             track_box.TitleWidthChars = 25;
             track_list = new VBox ();
             track_box.PackStart (track_list, true, true, 0);
-            
+
             no_artists_pane = new MessagePane ();
             no_artists_pane.NoShowAll = true;
             no_artists_pane.Visible = false;
@@ -218,72 +218,72 @@ namespace Banshee.Lastfm.Recommendations
             main_box.PackStart (album_box, false, false, 5);
             main_box.PackStart (new VSeparator (), false, false, 0);
             main_box.PackStart (track_box, false, false, 5);
-            
+
             no_artists_pane.Hide ();
         }
-        
+
         private void OnSideSizeAllocated (object o, SizeAllocatedArgs args)
         {
             SetSizeRequest (-1, args.Allocation.Height + (Allocation.Height - args.Allocation.Height));
         }
-        
+
         protected override void OnStyleSet (Style previous_style)
         {
             base.OnStyleSet (previous_style);
             similar_artists_view.ModifyBg (StateType.Normal, Style.Base (StateType.Normal));
         }
-        
+
         private class RefreshRecommendationsJob : Banshee.Kernel.Job
         {
             private RecommendationPane pane;
             private string artist;
-            
+
             public RefreshRecommendationsJob (RecommendationPane pane, string artist)
             {
                 this.pane = pane;
                 this.artist = artist;
             }
-            
+
             protected override void RunJob ()
             {
                 pane.UpdateForArtist (artist);
             }
         }
-            
+
         private void UpdateForArtist (string artist)
         {
             try {
                 LastfmArtistData artist_data = new LastfmArtistData (artist);
-                
+
                 // Make sure all the album art is downloaded
                 foreach (SimilarArtist similar in artist_data.SimilarArtists) {
                     DataCore.DownloadContent (similar.SmallImageUrl);
                 }
-                
+
                 UpdateForArtist (artist, artist_data.SimilarArtists, artist_data.TopAlbums, artist_data.TopTracks);
             } catch (Exception e) {
                 Log.Exception (e);
             }
         }
-        
-        private void UpdateForArtist (string artist_name, LastfmData<SimilarArtist> similar_artists, 
+
+        private void UpdateForArtist (string artist_name, LastfmData<SimilarArtist> similar_artists,
             LastfmData<ArtistTopAlbum> top_albums, LastfmData<ArtistTopTrack> top_tracks)
         {
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 album_box.Title = String.Format (album_title_format, artist);
                 track_box.Title = String.Format (track_title_format, artist);
-                
+
                 similar_artists_view.ClearWidgets ();
                 ClearBox (album_list);
                 ClearBox (track_list);
-                
-                // Similar Artists                
+
+                // Similar Artists
                 for (int i = 0; i < Math.Min (20, similar_artists.Count); i++) {
                     SimilarArtistTile tile = new SimilarArtistTile (similar_artists[i]);
                     tile.ShowAll ();
                     similar_artists_view.AddWidget (tile);
                 }
-                
+
                 if (similar_artists.Count > 0) {
                     no_artists_pane.Hide ();
                     similar_artists_view_sw.ShowAll ();
@@ -291,39 +291,39 @@ namespace Banshee.Lastfm.Recommendations
                     similar_artists_view_sw.Hide ();
                     no_artists_pane.ShowAll ();
                 }
-                
+
                 for (int i = 0; i < Math.Min (5, top_albums.Count); i++) {
                     ArtistTopAlbum album = top_albums[i];
                     Button album_button = new Button ();
                     album_button.Relief = ReliefStyle.None;
-        
+
                     Label label = new Label ();
                     label.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
                     label.Ellipsize = Pango.EllipsizeMode.End;
                     label.Xalign = 0;
                     label.Markup = String.Format ("{0}. {1}", i+1, GLib.Markup.EscapeText (album.Name));
                     album_button.Add (label);
-        
+
                     album_button.Clicked += delegate {
                         Banshee.Web.Browser.Open (album.Url);
                     };
                     album_list.PackStart (album_button, false, true, 0);
                 }
                 album_box.ShowAll ();
-                
+
                 for (int i = 0; i < Math.Min (5, top_tracks.Count); i++) {
                     ArtistTopTrack track = top_tracks[i];
                     Button track_button = new Button ();
                     track_button.Relief = ReliefStyle.None;
-        
+
                     HBox box = new HBox ();
-        
+
                     Label label = new Label ();
                     label.ModifyFg (StateType.Normal, Style.Text (StateType.Normal));
                     label.Ellipsize = Pango.EllipsizeMode.End;
                     label.Xalign = 0;
                     label.Markup = String.Format ("{0}. {1}", i+1, GLib.Markup.EscapeText (track.Name));
-        
+
                     /*if(node.SelectSingleNode("track_id") != null) {
                         box.PackEnd(new Image(now_playing_arrow), false, false, 0);
                         track_button.Clicked += delegate {
@@ -335,19 +335,19 @@ namespace Banshee.Lastfm.Recommendations
                             Banshee.Web.Browser.Open (track.Url);
                         };
                     //}
-        
+
                     box.PackStart (label, true, true, 0);
                     track_button.Add (box);
                     track_list.PackStart (track_button, false, true, 0);
                 }
                 track_box.ShowAll ();
-                
+
                 ready = true;
                 refreshing = false;
                 context_page.SetState (Banshee.ContextPane.ContextState.Loaded);
             });
         }
-        
+
         private static void ClearBox (Box box)
         {
             while (box.Children.Length > 0) {
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/SimilarArtistTile.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/SimilarArtistTile.cs
index 2af64ca..9928f14 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/SimilarArtistTile.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Recommendations/SimilarArtistTile.cs
@@ -37,31 +37,31 @@ namespace Banshee.Lastfm.Recommendations
     public class SimilarArtistTile : Tile
     {
         private SimilarArtist artist;
-        
+
         public SimilarArtistTile (SimilarArtist artist)
         {
             Artist = artist;
         }
-        
+
         protected override void OnClicked ()
         {
             if (artist != null) {
                 Banshee.Web.Browser.Open (artist.Url);
             }
         }
-        
+
         public SimilarArtist Artist {
             set {
                 artist = value;
-                
+
                 PrimaryText = value.Name;
-                
+
                 try {
                     SecondaryText = String.Format (Catalog.GetString ("{0}% Similarity"), value.MatchAsInt);
                 } catch {
                     SecondaryText = Catalog.GetString ("Unknown Similarity");
                 }
-                
+
                 try {
                     Pixbuf = new Gdk.Pixbuf (DataCore.GetCachedPathFromUrl (value.SmallImageUrl));
                 } catch {
diff --git a/src/Extensions/Banshee.Lastfm/Makefile.in b/src/Extensions/Banshee.Lastfm/Makefile.in
index 8c97dc9..47eac4e 100644
--- a/src/Extensions/Banshee.Lastfm/Makefile.in
+++ b/src/Extensions/Banshee.Lastfm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -392,6 +401,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -495,11 +505,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -517,6 +528,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -546,6 +558,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -565,14 +578,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Lastfm/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Lastfm/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Lastfm/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Lastfm/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -590,25 +603,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -638,13 +667,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -676,6 +709,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -696,6 +730,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -704,18 +740,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -776,7 +822,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -793,6 +839,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Lastfm/Resources/AudioscrobblerMenu.xml b/src/Extensions/Banshee.Lastfm/Resources/AudioscrobblerMenu.xml
index b861ca7..bde075c 100644
--- a/src/Extensions/Banshee.Lastfm/Resources/AudioscrobblerMenu.xml
+++ b/src/Extensions/Banshee.Lastfm/Resources/AudioscrobblerMenu.xml
@@ -4,8 +4,6 @@
             <menu name="Audioscrobbler" action="AudioscrobblerAction">
                     <menuitem name="AudioscrobblerEnable" action="AudioscrobblerEnableAction" />
                     <menuitem name="AudioscrobblerVisit" action="AudioscrobblerVisitAction" />
-                    <separator />
-                    <menuitem name="AudioscrobblerConfigure" action="AudioscrobblerConfigureAction" />
             </menu>
         </menu>
     </menubar>
diff --git a/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml b/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml
index 2393f24..50025e0 100644
--- a/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml
+++ b/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml
@@ -4,7 +4,7 @@
         <menuitem name="Connect" action="LastfmConnectAction" />
         <menu name='SortChildren' action='SortChildrenAction' />
         <separator />
-        <menuitem name="SourceProperties" action="SourcePropertiesAction" />
+        <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
     </popup>
 
     <popup name="LastfmStationSourcePopup" action="LastfmStationSourcePopupAction">
diff --git a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs
index aad67a5..7603399 100644
--- a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs
+++ b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeService.cs
@@ -16,11 +16,11 @@ namespace Banshee.MiniMode
         private Menu viewMenu;
         private MenuItem menuItem;
         private InterfaceActionService action_service;
-        
+
         void IExtensionService.Initialize ()
         {
             action_service = ServiceManager.Get<InterfaceActionService> ("InterfaceActionService");
-            
+
             viewMenu = (action_service.UIManager.GetWidget ("/MainMenu/ViewMenu") as MenuItem).Submenu as Menu;
             menuItem = new MenuItem (Catalog.GetString ("_Mini Mode"));
             menuItem.Activated += delegate {
@@ -34,13 +34,13 @@ namespace Banshee.MiniMode
             viewMenu.Insert (menuItem, 2);
             menuItem.Show ();
         }
-        
+
         public void Dispose ()
         {
             if (viewMenu != null && menuItem != null) {
                 viewMenu.Remove (menuItem);
             }
-        
+
             if (mini_mode != null) {
                 // We'll do our visual cleaning in a timeout to avoid
                 // glitches when Banshee quits. Besides, the plugin window is
@@ -49,13 +49,13 @@ namespace Banshee.MiniMode
                 GLib.Timeout.Add (1000, delegate {
                     try {
                         mini_mode.Hide ();
-                    } catch { 
+                    } catch {
                     }
                     return false;
                 });
             }
         }
-        
+
         string IService.ServiceName {
             get { return "MiniModeService"; }
         }
diff --git a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs
index 76c8c8b..0299fc3 100644
--- a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs
+++ b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/MiniModeWindow.cs
@@ -6,27 +6,27 @@
  *             Felipe Almeida Lessa
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 using Glade;
@@ -45,7 +45,7 @@ using Banshee.ServiceStack;
 using Banshee.Widgets;
 
 namespace Banshee.MiniMode
-{ 
+{
     public class MiniMode : Banshee.Gui.BaseClientWindow
     {
         [Widget] private Gtk.Box SeekContainer;
@@ -55,9 +55,9 @@ namespace Banshee.MiniMode
         [Widget] private Gtk.Box CoverBox;
         [Widget] private Gtk.Box PlaybackBox;
         [Widget] private Gtk.Box LowerButtonsBox;
-        
+
         [Widget] private Gtk.Button fullmode_button;
-        
+
         private TrackInfoDisplay track_info_display;
         private ConnectedVolumeButton volume_button;
         private SourceComboBox source_combo_box;
@@ -71,10 +71,10 @@ namespace Banshee.MiniMode
         public MiniMode (BaseClientWindow defaultMainWindow) : base (Catalog.GetString ("Banshee Media Player"), "minimode", 0, 0)
         {
             default_main_window = defaultMainWindow;
-            
+
             glade = new Glade.XML (System.Reflection.Assembly.GetExecutingAssembly (), "minimode.glade", "MiniModeWindow", null);
             glade.Autoconnect (this);
-            
+
             Widget child = glade["mini_mode_contents"];
             (child.Parent as Container).Remove (child);
             Add (child);
@@ -83,21 +83,21 @@ namespace Banshee.MiniMode
 
             // Playback Buttons
             Widget previous_button = ActionService.PlaybackActions["PreviousAction"].CreateToolItem ();
-            
+
             Widget playpause_button = ActionService.PlaybackActions["PlayPauseAction"].CreateToolItem ();
-            
+
             Widget button = ActionService.PlaybackActions["NextAction"].CreateToolItem ();
             Menu menu = ActionService.PlaybackActions.ShuffleActions.CreateMenu ();
             MenuButton next_button = new MenuButton (button, menu, true);
-            
+
             PlaybackBox.PackStart (previous_button, false, false, 0);
             PlaybackBox.PackStart (playpause_button, false, false, 0);
             PlaybackBox.PackStart (next_button, false, false, 0);
             PlaybackBox.ShowAll ();
-            
+
             // Seek Slider/Position Label
             seek_slider = new ConnectedSeekSlider ();
-            
+
             SeekContainer.PackStart (seek_slider, false, false, 0);
             SeekContainer.ShowAll ();
 
@@ -105,12 +105,12 @@ namespace Banshee.MiniMode
             volume_button = new ConnectedVolumeButton ();
             VolumeContainer.PackStart (volume_button, false, false, 0);
             volume_button.Show ();
-            
+
             // Source combobox
             source_combo_box = new SourceComboBox ();
             SourceBox.PackStart (source_combo_box, true, true, 0);
             source_combo_box.Show ();
-            
+
             // Track info
             track_info_display = new ClassicTrackInfoDisplay ();
             track_info_display.Show ();
@@ -118,21 +118,21 @@ namespace Banshee.MiniMode
 
             // Repeat button
             RepeatActionButton repeat_toggle_button = new RepeatActionButton ();
-            
+
             LowerButtonsBox.PackEnd (repeat_toggle_button, false, false, 0);
             LowerButtonsBox.ShowAll ();
-            
+
             tooltip_host = TooltipSetter.CreateHost ();
 
             SetTip (fullmode_button, Catalog.GetString ("Switch back to full mode"));
             SetTip (repeat_toggle_button, Catalog.GetString ("Change repeat playback mode"));
-            
+
             // Hook up everything
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
                 PlayerEvent.Error |
                 PlayerEvent.StateChange |
                 PlayerEvent.TrackInfoUpdated);
-            
+
             SetHeightLimit ();
         }
 
@@ -148,7 +148,7 @@ namespace Banshee.MiniMode
         private void SetHeightLimit ()
         {
             Gdk.Geometry limits = new Gdk.Geometry ();
-            
+
             limits.MinHeight = -1;
             limits.MaxHeight = -1;
             limits.MinWidth = SizeRequest ().Width;
@@ -184,7 +184,7 @@ namespace Banshee.MiniMode
         }
 
         // ---- Player Event Handlers ----
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
@@ -209,14 +209,14 @@ namespace Banshee.MiniMode
         protected void UpdateMetaDisplay ()
         {
             TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
-            
+
             if (track == null) {
                 InfoBox.Visible = false;
                 return;
             }
-            
+
             InfoBox.Visible = true;
-            
+
             try {
                 SetHeightLimit ();
             } catch (Exception) {
@@ -229,7 +229,7 @@ namespace Banshee.MiniMode
 
         private void OverrideFullscreen ()
         {
-            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> (); 
+            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> ();
             if (service == null || service.ViewActions == null) {
                 return;
             }
@@ -240,7 +240,7 @@ namespace Banshee.MiniMode
 
         private void RelinquishFullscreen ()
         {
-            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> (); 
+            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> ();
             if (service == null || service.ViewActions == null) {
                 return;
             }
diff --git a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceModel.cs b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceModel.cs
index aa37df8..09608cc 100644
--- a/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceModel.cs
+++ b/src/Extensions/Banshee.MiniMode/Banshee.MiniMode/SourceModel.cs
@@ -6,27 +6,27 @@
  *             Felipe Almeida Lessa
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using Gtk;
 
@@ -35,39 +35,39 @@ using Banshee.Sources;
 using Banshee.Sources.Gui;
 
 namespace Banshee.MiniMode
-{ 
+{
     public class SourceModel : Gtk.TreeStore
     {
         internal SourceModel() : base(typeof(Gdk.Pixbuf), typeof(string), typeof(Source))
-        {          
+        {
             Clear();
-            
+
             foreach(Source source in ServiceManager.SourceManager.Sources) {
                 AddSource(source);
             }
-            
+
             ServiceManager.SourceManager.SourceAdded += delegate(SourceAddedArgs args) {
                 AddSource(args.Source, args.Position);
             };
-            
+
             ServiceManager.SourceManager.SourceRemoved += delegate(SourceEventArgs args) {
                 RemoveSource(args.Source);
             };
         }
 
-        private void SetSource(TreeIter iter, Source source) 
+        private void SetSource(TreeIter iter, Source source)
         {
             Gdk.Pixbuf icon = SourceIconResolver.ResolveIcon(source);
-            
+
             if(icon == null) {
                 icon = Banshee.Gui.IconThemeUtils.LoadIcon(22, "source-library");
             }
-            
+
             SetValue(iter, 0, icon);
             SetValue(iter, 1, source.Name);
             SetValue(iter, 2, source);
         }
-                
+
         private void AddSource(Source source)
         {
             if(source.Parent == null) {
@@ -82,11 +82,11 @@ namespace Banshee.MiniMode
                 AddSource(source, iter);
             }
         }
-        
+
         private void AddSource(Source source, TreeIter iter)
         {
             SetSource(iter, source);
-            
+
             foreach(Source child in source.Children) {
                 AddSource(child, AppendNode(iter));
             }
@@ -109,25 +109,25 @@ namespace Banshee.MiniMode
                 Remove(ref iter);
             }
         }
-        
+
         public TreeIter FindSource(Source source)
         {
             TreeIter iter = TreeIter.Zero;
             GetIterFirst(out iter);
             return FindSource(source, iter);
         }
-        
+
         private TreeIter FindSource(Source source, TreeIter iter)
         {
             if(!IterIsValid(iter)) {
                 return TreeIter.Zero;
             }
-            
+
             do {
                 if((GetValue(iter, 2) as Source) == source) {
                     return iter;
                 }
-                
+
                 if(IterHasChild(iter)) {
                     TreeIter citer = TreeIter.Zero;
                     IterChildren(out citer, iter);
@@ -137,7 +137,7 @@ namespace Banshee.MiniMode
                     }
                 }
             } while(IterNext(ref iter));
-            
+
             return TreeIter.Zero;
         }
     }
diff --git a/src/Extensions/Banshee.MiniMode/Makefile.in b/src/Extensions/Banshee.MiniMode/Makefile.in
index b8a9421..670f311 100644
--- a/src/Extensions/Banshee.MiniMode/Makefile.in
+++ b/src/Extensions/Banshee.MiniMode/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -375,6 +384,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -478,11 +488,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -500,6 +511,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -529,6 +541,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -548,14 +561,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.MiniMode/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.MiniMode/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.MiniMode/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.MiniMode/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -573,25 +586,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -621,13 +650,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -659,6 +692,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -679,6 +713,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -687,18 +723,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -759,7 +805,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -776,6 +822,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin.addin.xml b/src/Extensions/Banshee.Moblin/Banshee.Moblin.addin.xml
index 57f48d3..f76bd55 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin.addin.xml
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin.addin.xml
@@ -19,5 +19,9 @@
   <Extension path="/Banshee/ServiceManager/Service">
     <Service class="Banshee.Moblin.MoblinService"/>
   </Extension>
+  
+  <Extension path="/Banshee/ThickClient/GtkBaseClient/PostInitializeGtk">
+    <PostInitializeGtk class="Banshee.Moblin.MoblinPanel"/>
+  </Extension>
    
 </Addin>
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs
index c1524dc..5f93b52 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MediaPanelContents.cs
@@ -1,21 +1,21 @@
-// 
+//
 // MediaPanelContents.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -26,6 +26,7 @@
 
 using System;
 using Gtk;
+using Mono.Unix;
 
 using Hyena.Data.Gui;
 using Banshee.Collection.Gui;
@@ -44,24 +45,43 @@ namespace Banshee.Moblin
             BorderWidth = 10;
             Spacing = 10;
         }
-        
+
         private void BuildViews ()
         {
-            var left = new VBox ();
+            var left = new VBox () { Spacing = 10 };
             left.PackStart (new SearchHeader (), false, false, 0);
+
+            left.PackStart (new Label () {
+                Xalign = 0.0f,
+                Xpad = 10,
+                Markup = String.Format ("<b><big>{0}</big></b>",
+                    GLib.Markup.EscapeText (Catalog.GetString ("Most Recently Played")))
+            }, false, false, 0);
+            left.PackStart (new RecentAlbumsView (), false, false, 0);
+
+            var button = new Button (Catalog.GetString ("Music Library"));
+            button.Clicked += (o, e) => {
+                ServiceManager.SourceManager.SetActiveSource (ServiceManager.SourceManager.MusicLibrary);
+                ServiceManager.Get<MoblinService> ().PresentPrimaryInterface ();
+            };
+            var hbox = new HBox ();
+            hbox.PackStart (button, false, false, 0);
+            hbox.ShowAll ();
+            left.PackStart (hbox, false, false, 0);
+
             PackStart (left, true, true, 0);
             PackStart (new PlayQueueBox (), false, false, 0);
 
             ShowAll ();
         }
-        
+
         protected override void OnParentSet (Widget previous)
         {
             base.OnParentSet (previous);
-            
+
             if (Parent != null) {
                 Parent.ModifyBg (StateType.Normal, Style.White);
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinPanel.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinPanel.cs
new file mode 100644
index 0000000..106b581
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinPanel.cs
@@ -0,0 +1,84 @@
+//
+// MoblinPanel.cs
+//
+// Author:
+//   Aaron Bockover <abockover at novell.com>
+//
+// Copyright 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using Gtk;
+using Mutter;
+using Hyena;
+using Banshee.Base;
+
+namespace Banshee.Moblin
+{
+    public class MoblinPanel : IDisposable
+    {
+        public static MoblinPanel Instance { get; private set; }
+
+        public PanelGtk ToolbarPanel { get; private set; }
+        public Container ParentContainer { get; private set; }
+
+        public uint ToolbarPanelWidth { get; private set; }
+        public uint ToolbarPanelHeight { get; private set; }
+
+        public MoblinPanel ()
+        {
+            if (Instance != null) {
+                throw new ApplicationException ("Only one MoblinPanel instance can exist");
+            }
+
+            if (ApplicationContext.CommandLine.Contains ("mutter-panel")) {
+                BuildPanel ();
+                Instance = this;
+            }
+        }
+
+        public void Dispose ()
+        {
+        }
+
+        private void BuildPanel ()
+        {
+            try {
+                ToolbarPanel = new PanelGtk ("media", "media", null, "media-button", true);
+                ParentContainer = ToolbarPanel.Window;
+                ParentContainer.ModifyBg (StateType.Normal, ParentContainer.Style.White);
+                ToolbarPanel.SetSizeEvent += (o, e) => {
+                    ToolbarPanelWidth = e.Width;
+                    ToolbarPanelHeight = e.Height;
+                };
+            } catch (Exception e) {
+                Log.Exception ("Could not bind to Moblin panel", e);
+
+                var window = new Gtk.Window ("Moblin Media Panel");
+                window.SetDefaultSize (1000, 500);
+                window.WindowPosition = Gtk.WindowPosition.Center;
+                ParentContainer = window;
+            }
+
+            ParentContainer.ShowAll ();
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinService.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinService.cs
index 39f44bb..6933653 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinService.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinService.cs
@@ -27,90 +27,218 @@
 //
 
 using System;
+using Gtk;
 
+using Hyena;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Sources;
 using Banshee.ServiceStack;
+using Banshee.MediaEngine;
 using Banshee.Gui;
 
+using Mutter;
+
 namespace Banshee.Moblin
 {
     public class MoblinService : IExtensionService
     {
         private GtkElementsService elements_service;
         private InterfaceActionService interface_action_service;
-        
-        private Gtk.Widget media_panel_window;
-        
+        private SourceManager source_manager;
+        private PlayerEngineService player;
+        private Banshee.Sources.Source now_playing;
+
         public MoblinService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             elements_service = ServiceManager.Get<GtkElementsService> ();
             interface_action_service = ServiceManager.Get<InterfaceActionService> ();
-        
+            source_manager = ServiceManager.SourceManager;
+            player = ServiceManager.PlayerEngine;
+
             if (!ServiceStartup ()) {
                 ServiceManager.ServiceStarted += OnServiceStarted;
             }
         }
-        
-        private void OnServiceStarted (ServiceStartedArgs args) 
+
+        private void OnServiceStarted (ServiceStartedArgs args)
         {
             if (args.Service is Banshee.Gui.InterfaceActionService) {
                 interface_action_service = (InterfaceActionService)args.Service;
             } else if (args.Service is GtkElementsService) {
                 elements_service = (GtkElementsService)args.Service;
+            } else if (args.Service is SourceManager) {
+                source_manager = ServiceManager.SourceManager;
+            } else if (args.Service is PlayerEngineService) {
+                player = ServiceManager.PlayerEngine;
             }
-                    
+
             ServiceStartup ();
         }
-        
+
         private bool ServiceStartup ()
         {
-            if (elements_service == null || interface_action_service == null) {
+            if (elements_service == null || interface_action_service == null || source_manager == null || player == null) {
                 return false;
             }
-            
+
             Initialize ();
-            
+
             ServiceManager.ServiceStarted -= OnServiceStarted;
-            
+
             return true;
         }
-        
+
         private void Initialize ()
         {
-            BuildPanel ();
+            ReflectionHackeryUpTheNereid ();
+
+            if (MoblinPanel.Instance == null) {
+                return;
+            }
+
+            var container = MoblinPanel.Instance.ParentContainer;
+            foreach (var child in container.Children) {
+                container.Remove (child);
+            }
+            container.Add (new MediaPanelContents ());
+            container.ShowAll ();
+
+            if (MoblinPanel.Instance.ToolbarPanel != null) {
+                container.SetSizeRequest (
+                    (int)MoblinPanel.Instance.ToolbarPanelWidth,
+                    (int)MoblinPanel.Instance.ToolbarPanelHeight);
+            }
+
+            // Since the Panel is running, we don't actually ever want to quit!
+            Banshee.ServiceStack.Application.ShutdownRequested += () => {
+                elements_service.PrimaryWindow.Hide ();
+                return false;
+            };
+
+            FindNowPlaying ();
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerStateChanged, PlayerEvent.StateChange | PlayerEvent.StartOfStream);
         }
-        
-        public void Dispose ()
+
+        private void ReflectionHackeryUpTheNereid ()
         {
-            if (media_panel_window != null) {
-                media_panel_window.Hide ();
-                media_panel_window.Destroy ();
-                media_panel_window = null;
+            // This is a horribly abusive method, but hey, this kind
+            // of stuff is what Firefox extensions are made of!
+
+            // First grab the type and instance of the primary window
+            // and make sure we're only hacking the Nereid UI
+            var pwin = elements_service.PrimaryWindow;
+            var pwin_type = pwin.GetType ();
+            if (pwin_type.FullName != "Nereid.PlayerInterface") {
+                return;
             }
-            
-            interface_action_service = null;
-            elements_service = null;
+
+            // regular metacity does not seem to like this at all, crashing
+            // and complaining "Window manager warning: Buggy client sent a
+            // _NET_ACTIVE_WINDOW message with a timestamp of 0 for 0x2e00020"
+            if (MoblinPanel.Instance != null) {
+                pwin.Decorated = false;
+                pwin.Maximize ();
+            }
+
+            // Now we want to make the Toolbar work in the Moblin GTK theme
+            var pwin_toolbar = (Toolbar)pwin_type.GetProperty ("HeaderToolbar").GetValue (pwin, null);
+            var pwin_toolbar_align = (Alignment)pwin_toolbar.Parent;
+            pwin_toolbar_align.TopPadding = 0;
+            pwin_toolbar_align.BottomPadding = 6;
+            pwin_type.GetMethod ("DisableHeaderToolbarExposeEvent").Invoke (pwin, null);
+
+            // Remove the volume button since Moblin enforces the global volume
+            foreach (var child in pwin_toolbar.Children) {
+                if (child.GetType ().FullName.StartsWith ("Banshee.Widgets.GenericToolItem")) {
+                    var c = child as Container;
+                    if (c != null && c.Children[0] is Banshee.Gui.Widgets.ConnectedVolumeButton) {
+                        pwin_toolbar.Remove (child);
+                        break;
+                    }
+                }
+            }
+
+            // Incredibly ugly hack to pack in a close button in a separate
+            // toolbar so that it may be aligned at the top right of the
+            // window (appears to float in the menubar)
+            var pwin_header_table = (Table)pwin_type.GetProperty ("HeaderTable").GetValue (pwin, null);
+
+            var close_button = new Banshee.Widgets.HoverImageButton (IconSize.Menu, "window-close") { DrawFocus = false };
+            close_button.Image.Xpad = 1;
+            close_button.Image.Ypad = 1;
+            close_button.Clicked += (o, e) => Banshee.ServiceStack.Application.Shutdown ();
+
+            var close_toolbar = new Toolbar () {
+                ShowArrow = false,
+                ToolbarStyle = ToolbarStyle.Icons
+            };
+
+            close_toolbar.Add (close_button);
+            close_toolbar.ShowAll ();
+
+            pwin_header_table.Attach (close_toolbar, 1, 2, 0, 1,
+                AttachOptions.Shrink, AttachOptions.Fill | AttachOptions.Expand, 0, 0);
+
+            // Set the internal engine volume to 100%
+            // FIXME: We should have something like PlayerEngine.InternalVolumeEnabled = false
+            ServiceManager.PlayerEngine.Volume = 100;
         }
-        
-#region Media Panel
 
-        private void BuildPanel ()
+        private void OnPlayerStateChanged (PlayerEventArgs args)
         {
-            var window = new Gtk.Window ("Moblin Media Panel");
-            window.SetDefaultSize (990, 460);
-            window.WindowPosition = Gtk.WindowPosition.Center;
-            window.Add (new MediaPanelContents ());
-            window.ShowAll ();
+            var player = ServiceManager.PlayerEngine;
+            if (player.CurrentState == PlayerState.Playing && player.CurrentTrack.HasAttribute (TrackMediaAttributes.VideoStream)) {
+                if (now_playing != null) {
+                    ServiceManager.SourceManager.SetActiveSource (now_playing);
+                }
 
-            elements_service.RegisterContentWindow (window);
+                PresentPrimaryInterface ();
+            }
+        }
 
-            media_panel_window = window;
+        private void FindNowPlaying ()
+        {
+            foreach (var src in ServiceManager.SourceManager.Sources) {
+                if (src.UniqueId.Contains ("now-playing")) {
+                    now_playing = src;
+                    break;
+                }
+            }
+
+            if (now_playing != null)
+                return;
+
+            Banshee.ServiceStack.ServiceManager.SourceManager.SourceAdded += (args) => {
+                if (now_playing == null && args.Source.UniqueId.Contains ("now-playing")) {
+                    now_playing = args.Source;
+                }
+            };
         }
 
-#endregion        
+        public void PresentPrimaryInterface ()
+        {
+            elements_service.PrimaryWindow.Maximize ();
+            elements_service.PrimaryWindow.Present ();
+            if (MoblinPanel.Instance != null && MoblinPanel.Instance.ToolbarPanel != null) {
+                MoblinPanel.Instance.ToolbarPanel.RequestHide ();
+            }
+        }
+
+        public void Dispose ()
+        {
+            if (MoblinPanel.Instance != null) {
+                MoblinPanel.Instance.Dispose ();
+            }
+
+            interface_action_service = null;
+            elements_service = null;
+        }
 
         string IService.ServiceName {
             get { return "MoblinService"; }
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinTrackInfoDisplay.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinTrackInfoDisplay.cs
index 8dc9e6b..b39ddf1 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinTrackInfoDisplay.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/MoblinTrackInfoDisplay.cs
@@ -32,37 +32,37 @@ using System.Text.RegularExpressions;
 using Banshee.ServiceStack;
 
 namespace Banshee.Moblin
-{    
+{
     public class MoblinTrackInfoDisplay : Banshee.Gui.Widgets.ClassicTrackInfoDisplay
     {
         private Regex line_three_split;
-        
+
         public MoblinTrackInfoDisplay () : base ()
         {
         }
-        
+
         protected override string GetSecondLineText (Banshee.Collection.TrackInfo track)
         {
             if (line_three_split == null) {
                 line_three_split = new Regex (@"size=""small"">", RegexOptions.Compiled);
             }
-            
+
             var text = base.GetSecondLineText (track);
             var splits = line_three_split.Split (text);
             string new_text = String.Empty;
-            
+
             for (int i = 0; i < splits.Length; i++) {
                 if (i == 2) {
                     new_text += "\n";
                 }
-                
+
                 new_text += splits[i];
-                
+
                 if (i < 2) {
                     new_text += @"size=""small"">";
                 }
             }
-            
+
             return new_text;
         }
     }
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs
index aedaddd..4f8cf7f 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlayQueueBox.cs
@@ -1,21 +1,21 @@
-// 
+//
 // PlayQueueBox.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -26,6 +26,7 @@
 
 using System;
 using Gtk;
+using Mono.Unix;
 
 using Hyena.Data.Gui;
 using Banshee.Collection.Gui;
@@ -39,30 +40,36 @@ namespace Banshee.Moblin
     public class PlayQueueBox : VBox
     {
         private TerseTrackListView playqueue_view;
-        
+
         public PlayQueueBox ()
         {
             Spacing = 5;
-            
+
             FindPlayQueue ();
-            
+
+            PackStart (new Label () {
+                Markup = String.Format ("<b><big>{0}</big></b>",
+                    GLib.Markup.EscapeText (Catalog.GetString ("Play Queue"))),
+                Xalign = 0.0f
+            }, false, false, 0);
+
             PackStart (new PlaybackBox (), false, false, 0);
-            
-            PackStart (new MoblinTrackInfoDisplay () {
-                HeightRequest = 64
-            }, false, false, 10);
-            
-            PackEnd (new Hyena.Widgets.ScrolledWindow () {
+
+            PackStart (new Hyena.Widgets.ScrolledWindow () {
                 (playqueue_view = new TerseTrackListView () {
                     HasFocus = true
                 })
             }, true, true, 0);
-            
+
+            PackStart (new MoblinTrackInfoDisplay () {
+                HeightRequest = 64
+            }, false, false, 10);
+
             playqueue_view.ColumnController.Insert (new Column (null, "indicator",
                 new ColumnCellStatusIndicator (null), 0.05, true, 20, 20), 0);
             playqueue_view.ColumnController.Add (new Column ("Rating", new ColumnCellRating ("Rating", false), 0.15));
         }
-        
+
         private void FindPlayQueue ()
         {
             Banshee.ServiceStack.ServiceManager.SourceManager.SourceAdded += delegate (SourceAddedArgs args) {
@@ -83,10 +90,6 @@ namespace Banshee.Moblin
             ServiceManager.SourceManager.SetActiveSource (play_queue);
             //play_queue.TrackModel.Reloaded += HandleTrackModelReloaded;
             playqueue_view.SetModel (play_queue.TrackModel);
-            
-            var header = play_queue.CreateHeaderWidget ();
-            PackStart (header, false, false, 0);
-            header.ShowAll ();
         }
     }
 }
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlaybackBox.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlaybackBox.cs
index c41560c..8eecd13 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlaybackBox.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/PlaybackBox.cs
@@ -1,21 +1,21 @@
-// 
+//
 // PlaybackBox.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -39,11 +39,11 @@ namespace Banshee.Moblin
         public PlaybackBox ()
         {
             var action_service = ServiceManager.Get<InterfaceActionService> ();
-        
+
             PackStart (action_service.PlaybackActions["PreviousAction"].CreateToolItem (), false, false, 0);
             PackStart (action_service.PlaybackActions["PlayPauseAction"].CreateToolItem (), false, false, 0);
             PackStart (new NextButton (action_service), false, false, 0);
-            
+
             var seek_slider = new ConnectedSeekSlider ();
             seek_slider.Show ();
             PackStart (seek_slider, false, false, 0);
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsList.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsList.cs
new file mode 100644
index 0000000..55fb740
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsList.cs
@@ -0,0 +1,100 @@
+//
+// RecentAlbumsList.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+using Hyena.Data;
+using Hyena.Data.Sqlite;
+
+using Banshee.ServiceStack;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+
+namespace Banshee.Moblin
+{
+    public class RecentAlbumsList
+    {
+        private List<AlbumInfo> list = new List<AlbumInfo> ();
+        private int max_count;
+        private HyenaSqliteCommand select_cmd;
+
+        public event EventHandler Changed;
+
+        public RecentAlbumsList (int maxCount)
+        {
+            max_count = maxCount;
+
+            select_cmd = new HyenaSqliteCommand (@"
+                SELECT a.AlbumID, a.Title, a.ArtistName, a.IsCompilation, MAX(t.LastPlayedStamp) as MaxLastPlayed
+                    FROM CoreAlbums a, CoreTracks t
+                    WHERE t.PrimarySourceID = ? AND a.AlbumID = t.AlbumID AND a.Title != ''
+                    GROUP BY a.AlbumID
+                    ORDER BY MaxLastPlayed DESC
+                    LIMIT ?");
+
+            Reload ();
+            ServiceManager.PlaybackController.TrackStarted += (o, a) => Reload ();
+        }
+
+        public ReadOnlyCollection<AlbumInfo> Albums {
+            get { return list.AsReadOnly (); }
+        }
+
+        private void Reload ()
+        {
+            list.Clear ();
+
+            using (var reader = ServiceManager.DbConnection.Query (select_cmd, 1, max_count)) {
+                while (reader.Read ()) {
+                    list.Add (new AlbumInfo (reader[1] as string) {
+                        ArtistName = reader[2] as string
+                    });
+                }
+            }
+
+            // Dump ();
+            OnChanged ();
+        }
+
+        /*private void Dump ()
+        {
+            Console.WriteLine ("RecentAlbumsList has {0} albums", list.Count);
+            foreach (var album in Albums) {
+                Console.WriteLine ("Recent Album: {0} by {1} (ArtworkId: {2})", album.Title, album.ArtistName, album.ArtworkId);
+            }
+        }*/
+
+        private void OnChanged ()
+        {
+            var handler = Changed;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsView.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsView.cs
new file mode 100644
index 0000000..6c3852d
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/RecentAlbumsView.cs
@@ -0,0 +1,145 @@
+//
+// RecentAlbumsView.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+using Gtk;
+
+using Banshee.Gui;
+using Banshee.Gui.Widgets;
+using Banshee.Collection;
+using Banshee.Collection.Gui;
+using Banshee.ServiceStack;
+
+namespace Banshee.Moblin
+{
+    public class RecentAlbumsView : Table
+    {
+        const int icon_size = 98;
+        const int cols = 5;
+        const int rows = 3;
+
+        private class AlbumButton : Button
+        {
+            private Image image = new Image ();
+            private AlbumInfo album;
+
+            public AlbumButton ()
+            {
+                Relief = ReliefStyle.None;
+                Add (image);
+                image.Show ();
+            }
+
+            protected override void OnClicked ()
+            {
+                var source = ServiceManager.SourceManager.MusicLibrary;
+                var other_source = ServiceManager.SourceManager.VideoLibrary;
+                if (source != null) {
+                    if (other_source != null) {
+                        // HACK the Nereid search bar pulls the source's query value when
+                        // the active source is changed, so artificially ensure that happens
+                        ServiceManager.SourceManager.SetActiveSource (other_source);
+                    }
+
+                    source.FilterType = TrackFilterType.None;
+                    source.FilterQuery = String.Format ("artist=\"{0}\" album=\"{1}\"", Album.ArtistName, Album.Title);
+                    ServiceManager.SourceManager.SetActiveSource (source);
+                    ServiceManager.Get<MoblinService> ().PresentPrimaryInterface ();
+
+                    var player = ServiceManager.PlayerEngine;
+                    if (!player.IsPlaying () || player.CurrentState == Banshee.MediaEngine.PlayerState.Paused) {
+                        ServiceManager.PlaybackController.Source = source;
+                        ServiceManager.PlaybackController.Next ();
+                    }
+                }
+            }
+
+            public Gdk.Pixbuf Pixbuf {
+                get { return image.Pixbuf; }
+                set { image.Pixbuf = value; }
+            }
+
+            public AlbumInfo Album {
+                get { return album; }
+                set {
+                    album = value;
+                    TooltipMarkup = String.Format ("<b><big>{0}</big></b>\n<i>{1}</i>",
+                        GLib.Markup.EscapeText (album.DisplayTitle),
+                        GLib.Markup.EscapeText (album.DisplayArtistName));
+                }
+            }
+        }
+
+        private RecentAlbumsList recent;
+        private List<AlbumButton> buttons;
+
+        public RecentAlbumsView () : base (5, 3, false)
+        {
+            RowSpacing = ColumnSpacing = 12;
+            Build ();
+
+            recent = new RecentAlbumsList (cols * rows);
+            recent.Changed += (o, a) => Reload ();
+            Reload ();
+
+            NoShowAll = true;
+        }
+
+        private void Build ()
+        {
+            buttons = new List<AlbumButton> ();
+
+            for (uint j = 0; j < rows; j++) {
+                for (uint i = 0; i < cols; i++) {
+                    var button = new AlbumButton ();
+                    buttons.Add (button);
+                    Attach (button, i, i + 1, j, j + 1);
+                }
+            }
+
+            Show ();
+        }
+
+        public void Reload ()
+        {
+            var artwork = ServiceManager.Get<ArtworkManager> ();
+
+            for (int i = 0; i < cols * rows; i++) {
+                if (i >= recent.Albums.Count) {
+                    buttons[i].Hide ();
+                    continue;
+                }
+
+                var album = recent.Albums[i];
+                buttons[i].Album = album;
+                buttons[i].Pixbuf = artwork.LookupScalePixbuf (album.ArtworkId, icon_size);
+                buttons[i].Show ();
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs
index f22d409..3146fbf 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchEntry.cs
@@ -1,21 +1,21 @@
-// 
+//
 // SearchEntry.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Aaron Bockover
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -40,7 +40,7 @@ namespace Banshee.Moblin
         public SearchEntry ()
         {
             BuildSearchEntry ();
-            
+
             InterfaceActionService uia = ServiceManager.Get<InterfaceActionService> ();
             if (uia != null) {
                 Gtk.Action action = uia.GlobalActions["WikiSearchHelpAction"];
@@ -48,27 +48,27 @@ namespace Banshee.Moblin
                     MenuItem item = new SeparatorMenuItem ();
                     item.Show ();
                     Menu.Append (item);
-                    
+
                     item = new ImageMenuItem (Stock.Help, null);
                     item.Activated += delegate { action.Activate (); };
                     item.Show ();
                     Menu.Append (item);
                 }
             }
-            
+
             SearchSensitive = true;
             Show ();
         }
-        
+
         private struct SearchFilter
         {
             public int Id;
             public string Field;
             public string Title;
         }
-        
+
         private Dictionary<int, SearchFilter> search_filters = new Dictionary<int, SearchFilter> ();
-        
+
         private void AddSearchFilter (TrackFilterType id, string field, string title)
         {
             SearchFilter filter = new SearchFilter ();
@@ -77,7 +77,7 @@ namespace Banshee.Moblin
             filter.Title = title;
             search_filters.Add (filter.Id, filter);
         }
-        
+
         private void BuildSearchEntry ()
         {
             AddSearchFilter (TrackFilterType.None, String.Empty, Catalog.GetString ("Artist, Album, or Title"));
@@ -105,7 +105,7 @@ namespace Banshee.Moblin
         private void OnSearchEntryFilterChanged (object o, EventArgs args)
         {
             /* Translators: this is a verb (command), not a noun (things) */
-            EmptyMessage = String.Format (Catalog.GetString ("Filter Results"));
+            EmptyMessage = String.Format (Catalog.GetString ("_Search").Replace ("_", String.Empty));
             /*search_entry.EmptyMessage = String.Format (Catalog.GetString ("Filter on {0}"),
                 search_entry.GetLabelForFilterID (search_entry.ActiveFilterID));*/
 
@@ -120,12 +120,12 @@ namespace Banshee.Moblin
                 editable.Position = Query.Length;
             }
         }
-               
+
         public bool SearchSensitive {
             get { return Sensitive; }
             set { Sensitive = value; }
         }
-        
+
         public Banshee.Widgets.SearchEntry Entry {
             get { return this; }
         }
diff --git a/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs b/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs
index 25314da..2cecc88 100644
--- a/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs
+++ b/src/Extensions/Banshee.Moblin/Banshee.Moblin/SearchHeader.cs
@@ -1,21 +1,21 @@
-// 
+//
 // SearchHeader.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -30,6 +30,10 @@ using Gtk;
 
 using Hyena.Gui;
 
+using Banshee.Collection;
+using Banshee.ServiceStack;
+using Banshee.Gui;
+
 namespace Banshee.Moblin
 {
     public class SearchHeader : HBox
@@ -39,37 +43,49 @@ namespace Banshee.Moblin
             Spacing = 10;
             BorderWidth = 10;
             PackStart (new Label () { Markup = String.Format ("<big><b>{0}</b></big>",
-                Catalog.GetString ("Media")) }, false, false, 0);
-            PackStart (new SearchEntry (), true, true, 0);
+                GLib.Markup.EscapeText (Catalog.GetString ("Media"))) }, false, false, 0);
+
+            var search = new SearchEntry ();
+            search.Entry.Activated += (o, e) => {
+                var source = ServiceManager.SourceManager.MusicLibrary;
+                if (source != null) {
+                    source.FilterType = (TrackFilterType)search.Entry.ActiveFilterID;
+                    source.FilterQuery = search.Entry.Query;
+                    ServiceManager.SourceManager.SetActiveSource (source);
+                    search.Entry.Query = String.Empty;
+                    ServiceManager.Get<MoblinService> ().PresentPrimaryInterface ();
+                }
+            };
+            PackStart (search, true, true, 0);
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (!Visible || !IsMapped) {
                 return true;
             }
-            
+
             RenderBackground (evnt.Window, evnt.Region);
             foreach (var child in Children) {
                 PropagateExpose (child, evnt);
             }
-            
+
             return true;
         }
-        
+
         private void RenderBackground (Gdk.Window window, Gdk.Region region)
-        {   
+        {
             Cairo.Context cr = Gdk.CairoHelper.Create (window);
-            
+
             cr.Color = new Cairo.Color (0xe7 / (double)0xff,
                 0xea / (double)0xff, 0xfd / (double)0xff);
-            
+
             CairoExtensions.RoundedRectangle (cr,
                 Allocation.X, Allocation.Y,
                 Allocation.Width, Allocation.Height, 5);
-            
+
             cr.Fill ();
-            
+
             CairoExtensions.DisposeContext (cr);
         }
     }
diff --git a/src/Extensions/Banshee.Moblin/Makefile.am b/src/Extensions/Banshee.Moblin/Makefile.am
index d824c64..1e7f029 100644
--- a/src/Extensions/Banshee.Moblin/Makefile.am
+++ b/src/Extensions/Banshee.Moblin/Makefile.am
@@ -5,22 +5,44 @@ INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 
 SOURCES =  \
 	Banshee.Moblin/MediaPanelContents.cs \
+	Banshee.Moblin/MoblinPanel.cs \
 	Banshee.Moblin/MoblinService.cs \
 	Banshee.Moblin/MoblinTrackInfoDisplay.cs \
 	Banshee.Moblin/PlaybackBox.cs \
 	Banshee.Moblin/PlayQueueBox.cs \
+	Banshee.Moblin/RecentAlbumsList.cs \
+	Banshee.Moblin/RecentAlbumsView.cs \
 	Banshee.Moblin/SearchEntry.cs \
 	Banshee.Moblin/SearchHeader.cs \
 	Mutter/PanelClient.cs \
-	Mutter/PanelGtk.cs
+	Mutter/PanelGtk.cs \
+	Mutter/SetSizeHandler.cs
 
 RESOURCES = Banshee.Moblin.addin.xml
 
 if HAVE_MOBLIN
+
 include $(top_srcdir)/build/build.mk
+
 module_SCRIPTS += Banshee.Moblin.dll.config
+
+paneldir = $(libdir)/mutter-moblin
+panel_SCRIPTS = moblin-panel-media
+
+servicedir = $(datadir)/dbus-1/services
+service_DATA = org.moblin.UX.Shell.Panels.media.service
+
+org.moblin.UX.Shell.Panels.media.service: org.moblin.UX.Shell.Panels.media.service.in $(top_builddir)/config.log
+	sed -e "s|\@libexecdir\@|$(libdir)/mutter-moblin|" $< > $@
+
+clean-local:
+	rm org.moblin.UX.Shell.Panels.media.service
+
 else
 EXTRA_DIST = $(SOURCES) $(RESOURCES)
 endif
 
-EXTRA_DIST += Banshee.Moblin.dll.config
+EXTRA_DIST += \
+	Banshee.Moblin.dll.config \
+	moblin-panel-media \
+	org.moblin.UX.Shell.Panels.media.service.in
diff --git a/src/Extensions/Banshee.Moblin/Makefile.in b/src/Extensions/Banshee.Moblin/Makefile.in
index 30bf73f..2947c46 100644
--- a/src/Extensions/Banshee.Moblin/Makefile.in
+++ b/src/Extensions/Banshee.Moblin/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -14,10 +15,12 @@
 
 @SET_MAKE@
 
+
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +57,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,10 +77,33 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(module_SCRIPTS)
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(paneldir)" \
+	"$(DESTDIR)$(servicedir)"
+SCRIPTS = $(module_SCRIPTS) $(panel_SCRIPTS)
 DIST_SOURCES =
+DATA = $(service_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
@@ -139,6 +166,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +187,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +202,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -348,14 +360,18 @@ LINK = $(REF_EXTENSION_MOBLIN) $(LINK_EXTENSION_PLAYQUEUE_DEPS) \
 INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 SOURCES = \
 	Banshee.Moblin/MediaPanelContents.cs \
+	Banshee.Moblin/MoblinPanel.cs \
 	Banshee.Moblin/MoblinService.cs \
 	Banshee.Moblin/MoblinTrackInfoDisplay.cs \
 	Banshee.Moblin/PlaybackBox.cs \
 	Banshee.Moblin/PlayQueueBox.cs \
+	Banshee.Moblin/RecentAlbumsList.cs \
+	Banshee.Moblin/RecentAlbumsView.cs \
 	Banshee.Moblin/SearchEntry.cs \
 	Banshee.Moblin/SearchHeader.cs \
 	Mutter/PanelClient.cs \
-	Mutter/PanelGtk.cs
+	Mutter/PanelGtk.cs \
+	Mutter/SetSizeHandler.cs
 
 RESOURCES = Banshee.Moblin.addin.xml
 
@@ -379,6 +395,7 @@ RESOURCES = Banshee.Moblin.addin.xml
 @HAVE_MOBLIN_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @HAVE_MOBLIN_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @HAVE_MOBLIN_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at HAVE_MOBLIN_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @HAVE_MOBLIN_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @HAVE_MOBLIN_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @HAVE_MOBLIN_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -482,11 +499,12 @@ RESOURCES = Banshee.Moblin.addin.xml
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at HAVE_MOBLIN_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at HAVE_MOBLIN_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at HAVE_MOBLIN_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MOBLIN_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @HAVE_MOBLIN_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -504,6 +522,7 @@ RESOURCES = Banshee.Moblin.addin.xml
 @HAVE_MOBLIN_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at HAVE_MOBLIN_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @HAVE_MOBLIN_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @HAVE_MOBLIN_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @HAVE_MOBLIN_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -533,6 +552,7 @@ RESOURCES = Banshee.Moblin.addin.xml
 @HAVE_MOBLIN_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @HAVE_MOBLIN_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@HAVE_MOBLIN_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@HAVE_MOBLIN_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @HAVE_MOBLIN_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @HAVE_MOBLIN_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @HAVE_MOBLIN_TRUE at OUTPUT_FILES = \
@@ -543,13 +563,20 @@ RESOURCES = Banshee.Moblin.addin.xml
 @HAVE_MOBLIN_TRUE at module_SCRIPTS = $(OUTPUT_FILES) \
 @HAVE_MOBLIN_TRUE@	Banshee.Moblin.dll.config
 @HAVE_MOBLIN_FALSE at EXTRA_DIST = $(SOURCES) $(RESOURCES) \
- at HAVE_MOBLIN_FALSE@	Banshee.Moblin.dll.config
+ at HAVE_MOBLIN_FALSE@	Banshee.Moblin.dll.config \
+ at HAVE_MOBLIN_FALSE@	moblin-panel-media \
+ at HAVE_MOBLIN_FALSE@	org.moblin.UX.Shell.Panels.media.service.in
 @HAVE_MOBLIN_TRUE at EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \
 @HAVE_MOBLIN_TRUE@	$(THEME_ICONS_SOURCE) \
- at HAVE_MOBLIN_TRUE@	Banshee.Moblin.dll.config
+ at HAVE_MOBLIN_TRUE@	Banshee.Moblin.dll.config moblin-panel-media \
+ at HAVE_MOBLIN_TRUE@	org.moblin.UX.Shell.Panels.media.service.in
 @HAVE_MOBLIN_TRUE at CLEANFILES = $(OUTPUT_FILES)
 @HAVE_MOBLIN_TRUE at DISTCLEANFILES = *.pidb
 @HAVE_MOBLIN_TRUE at MAINTAINERCLEANFILES = Makefile.in
+ at HAVE_MOBLIN_TRUE@paneldir = $(libdir)/mutter-moblin
+ at HAVE_MOBLIN_TRUE@panel_SCRIPTS = moblin-panel-media
+ at HAVE_MOBLIN_TRUE@servicedir = $(datadir)/dbus-1/services
+ at HAVE_MOBLIN_TRUE@service_DATA = org.moblin.UX.Shell.Panels.media.service
 all: all-am
 
 .SUFFIXES:
@@ -557,14 +584,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Moblin/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Moblin/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Moblin/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Moblin/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -582,31 +609,101 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
+install-panelSCRIPTS: $(panel_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	test -z "$(paneldir)" || $(MKDIR_P) "$(DESTDIR)$(paneldir)"
+	@list='$(panel_SCRIPTS)'; test -n "$(paneldir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(paneldir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(paneldir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-panelSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(panel_SCRIPTS)'; test -n "$(paneldir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(paneldir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(paneldir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
+install-serviceDATA: $(service_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(servicedir)" || $(MKDIR_P) "$(DESTDIR)$(servicedir)"
+	@list='$(service_DATA)'; test -n "$(servicedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicedir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(servicedir)" || exit $$?; \
+	done
+
+uninstall-serviceDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(service_DATA)'; test -n "$(servicedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(servicedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(servicedir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -630,21 +727,25 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(SCRIPTS)
+all-am: Makefile $(SCRIPTS) $(DATA)
 installdirs:
-	for dir in "$(DESTDIR)$(moduledir)"; do \
+	for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(paneldir)" "$(DESTDIR)$(servicedir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
@@ -668,6 +769,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -676,9 +778,10 @@ maintainer-clean-generic:
 	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
 @HAVE_MOBLIN_FALSE at uninstall-local:
 @HAVE_MOBLIN_FALSE at install-data-local:
+ at HAVE_MOBLIN_FALSE@clean-local:
 clean: clean-am
 
-clean-am: clean-generic clean-libtool mostlyclean-am
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
 
 distclean: distclean-am
 	-rm -f Makefile
@@ -690,26 +793,39 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
 
-install-data-am: install-data-local install-moduleSCRIPTS
+install-data-am: install-data-local install-moduleSCRIPTS \
+	install-panelSCRIPTS install-serviceDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -728,22 +844,25 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-local uninstall-moduleSCRIPTS
+uninstall-am: uninstall-local uninstall-moduleSCRIPTS \
+	uninstall-panelSCRIPTS uninstall-serviceDATA
 
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-data-local install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-moduleSCRIPTS install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
+	clean-local distclean distclean-generic distclean-libtool \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-data-local \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-moduleSCRIPTS install-panelSCRIPTS \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-serviceDATA install-strip installcheck installcheck-am \
 	installdirs maintainer-clean maintainer-clean-generic \
 	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
 	ps ps-am uninstall uninstall-am uninstall-local \
-	uninstall-moduleSCRIPTS
+	uninstall-moduleSCRIPTS uninstall-panelSCRIPTS \
+	uninstall-serviceDATA
 
 
 @HAVE_MOBLIN_TRUE at all: $(ASSEMBLY_FILE) theme-icons
@@ -770,7 +889,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_MOBLIN_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @HAVE_MOBLIN_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @HAVE_MOBLIN_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at HAVE_MOBLIN_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at HAVE_MOBLIN_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @HAVE_MOBLIN_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @HAVE_MOBLIN_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @HAVE_MOBLIN_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -787,6 +906,13 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @HAVE_MOBLIN_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @HAVE_MOBLIN_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
+ at HAVE_MOBLIN_TRUE@org.moblin.UX.Shell.Panels.media.service: org.moblin.UX.Shell.Panels.media.service.in $(top_builddir)/config.log
+ at HAVE_MOBLIN_TRUE@	sed -e "s|\@libexecdir\@|$(libdir)/mutter-moblin|" $< > $@
+
+ at HAVE_MOBLIN_TRUE@clean-local:
+ at HAVE_MOBLIN_TRUE@	rm org.moblin.UX.Shell.Panels.media.service
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Moblin/Mutter/PanelClient.cs b/src/Extensions/Banshee.Moblin/Mutter/PanelClient.cs
index e6b4838..596cc34 100644
--- a/src/Extensions/Banshee.Moblin/Mutter/PanelClient.cs
+++ b/src/Extensions/Banshee.Moblin/Mutter/PanelClient.cs
@@ -1,21 +1,21 @@
-// 
+//
 // PanelClient.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -33,74 +33,136 @@ namespace Mutter
     {
         [DllImport ("libmoblin-panel-gtk")]
         private static extern IntPtr mpl_panel_client_get_type ();
-    
+
         public static new GLib.GType GType {
             get { return new GLib.GType (mpl_panel_client_get_type ()); }
         }
-        
+
         protected PanelClient () : base (IntPtr.Zero)
         {
             CreateNativeObject (new string [0], new GLib.Value [0]);
         }
-    
+
         public PanelClient (IntPtr raw) : base (raw)
         {
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_request_show (IntPtr panel);
-    
+
         public void RequestShow ()
         {
             mpl_panel_client_request_show (Handle);
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_request_hide (IntPtr panel);
-    
+
         public void RequestHide ()
         {
             mpl_panel_client_request_hide (Handle);
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_request_focus (IntPtr panel);
-    
+
         public void RequestFocus ()
         {
             mpl_panel_client_request_focus (Handle);
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_set_height_request (IntPtr panel, uint height);
-        
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern uint mpl_panel_client_get_height_request (IntPtr panel);
-    
+
         public uint HeightRequest {
             get { return mpl_panel_client_get_height_request (Handle); }
             set { mpl_panel_client_set_height_request (Handle, value); }
         }
-        
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_request_button_style (IntPtr panel, string style);
-    
+
         public string ButtonStyleRequest {
             set { mpl_panel_client_request_button_style (Handle, value); }
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern void mpl_panel_client_request_tooltip (IntPtr panel, string tooltip);
-    
+
         public string TooltipRequest {
             set { mpl_panel_client_request_tooltip (Handle, value); }
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern uint mpl_panel_client_get_xid (IntPtr panel);
-    
+
         public uint Xid {
             get { return mpl_panel_client_get_xid (Handle); }
         }
+
+        [GLib.Signal ("set-size")]
+        public event SetSizeHandler SetSizeEvent {
+            add { GLib.Signal.Lookup (this, "set-size", typeof (SetSizeArgs)).AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "set-size", typeof (SetSizeArgs)).RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("show-begin")]
+        public event EventHandler ShowBeginEvent {
+            add { GLib.Signal.Lookup (this, "show-begin").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "show-begin").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("show-end")]
+        public event EventHandler ShowEndEvent {
+            add { GLib.Signal.Lookup (this, "show-end").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "show-end").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("hide-begin")]
+        public event EventHandler HideBeginEvent {
+            add { GLib.Signal.Lookup (this, "hide-begin").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "hide-begin").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("hide-end")]
+        public event EventHandler HideEndEvent {
+            add { GLib.Signal.Lookup (this, "hide-end").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "hide-end").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("request-show")]
+        public event EventHandler RequestShowEvent {
+            add { GLib.Signal.Lookup (this, "request-show").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "request-show").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("request-hide")]
+        public event EventHandler RequestHideEvent {
+            add { GLib.Signal.Lookup (this, "request-hide").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "request-hide").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("request-focus")]
+        public event EventHandler RequestFocusEvent {
+            add { GLib.Signal.Lookup (this, "request-focus").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "request-focus").RemoveDelegate (value); }
+        }
+
+        // FIXME: need to define an delegate and args class
+
+        [GLib.Signal ("request-button-style")]
+        public event EventHandler RequestButtonStyleEvent {
+            add { GLib.Signal.Lookup (this, "request-button-style").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "request-button-style").RemoveDelegate (value); }
+        }
+
+        [GLib.Signal ("request-tooltip")]
+        public event EventHandler RequestTooltipEvent {
+            add { GLib.Signal.Lookup (this, "request-tooltip").AddDelegate (value); }
+            remove { GLib.Signal.Lookup (this, "request-tooltip").RemoveDelegate (value); }
+        }
     }
 }
diff --git a/src/Extensions/Banshee.Moblin/Mutter/PanelGtk.cs b/src/Extensions/Banshee.Moblin/Mutter/PanelGtk.cs
index 6e003ab..4ae1f6f 100644
--- a/src/Extensions/Banshee.Moblin/Mutter/PanelGtk.cs
+++ b/src/Extensions/Banshee.Moblin/Mutter/PanelGtk.cs
@@ -1,21 +1,21 @@
-// 
+//
 // PanelGtk.cs
-//  
+//
 // Author:
 //   Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Novell, Inc.
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -35,31 +35,31 @@ namespace Mutter
     {
         [DllImport ("libmoblin-panel-gtk")]
         private static extern IntPtr mpl_panel_gtk_get_type ();
-    
+
         public static new GLib.GType GType {
             get { return new GLib.GType (mpl_panel_gtk_get_type ()); }
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern IntPtr mpl_panel_gtk_new (string name, string tooltip, string stylesheet,
             string button_style, bool with_toolbar_service);
-        
+
         public PanelGtk (string name, string tooltip, string stylesheet,
             string button_style, bool with_toolbar_service) : base (IntPtr.Zero)
         {
             Raw = mpl_panel_gtk_new (name, tooltip, stylesheet, button_style, with_toolbar_service);
         }
-    
+
         public PanelGtk (IntPtr raw) : base (raw)
         {
         }
-    
+
         [DllImport ("libmoblin-panel-gtk")]
         private static extern IntPtr mpl_panel_gtk_get_window (IntPtr panel);
-    
-        // FIXME: can probably cache this
+
+        private Container container_window;
         public Container Window {
-            get { return new Container (mpl_panel_gtk_get_window (Handle)); }
+            get { return container_window ?? (container_window = new Container (mpl_panel_gtk_get_window (Handle))); }
         }
     }
 }
diff --git a/src/Extensions/Banshee.Moblin/Mutter/SetSizeHandler.cs b/src/Extensions/Banshee.Moblin/Mutter/SetSizeHandler.cs
new file mode 100644
index 0000000..a9c1159
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/Mutter/SetSizeHandler.cs
@@ -0,0 +1,42 @@
+//
+// SetSizeHandler.cs
+//
+// Author:
+//   Aaron Bockover <abockover at novell.com>
+//
+// Copyright 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Mutter
+{
+    public delegate void SetSizeHandler (object o, SetSizeArgs args);
+
+    public class SetSizeArgs : GLib.SignalArgs {
+        public uint Width {
+            get { return (uint)Args[0]; }
+        }
+
+        public uint Height {
+            get { return (uint)Args[1]; }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.Moblin/moblin-panel-media b/src/Extensions/Banshee.Moblin/moblin-panel-media
new file mode 100755
index 0000000..d65367f
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/moblin-panel-media
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+banshee-1 --hide --mutter-panel --redirect-log
diff --git a/src/Extensions/Banshee.Moblin/org.moblin.UX.Shell.Panels.media.service.in b/src/Extensions/Banshee.Moblin/org.moblin.UX.Shell.Panels.media.service.in
new file mode 100644
index 0000000..b706424
--- /dev/null
+++ b/src/Extensions/Banshee.Moblin/org.moblin.UX.Shell.Panels.media.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.moblin.UX.Shell.Panels.media
+Exec=@libexecdir@/moblin-panel-media
diff --git a/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs b/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs
index 739a5ef..555c63e 100644
--- a/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs
+++ b/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs
@@ -43,7 +43,7 @@ namespace Banshee.MultimediaKeys
     {
         private const string BusName = "org.gnome.SettingsDaemon";
         private const string ObjectPath = "/org/gnome/SettingsDaemon";
-        
+
         private delegate void MediaPlayerKeyPressedHandler (string application, string key);
 
         // GNOME 2.20
@@ -54,7 +54,7 @@ namespace Banshee.MultimediaKeys
             void ReleaseMediaPlayerKeys (string application);
             event MediaPlayerKeyPressedHandler MediaPlayerKeyPressed;
         }
-        
+
         // GNOME 2.22
         [Interface ("org.gnome.SettingsDaemon.MediaKeys")]
         private interface ISettingsDaemon222
@@ -63,23 +63,23 @@ namespace Banshee.MultimediaKeys
             void ReleaseMediaPlayerKeys (string application);
             event MediaPlayerKeyPressedHandler MediaPlayerKeyPressed;
         }
-        
+
         private ISettingsDaemon222 settings_daemon_222;
         private ISettingsDaemon220 settings_daemon_220;
-    
+
         public MultimediaKeysService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             // It's a common theme in GNOME for APIs to change every 6 months
-            // We are essentially an ISV, and actually care about backwards 
+            // We are essentially an ISV, and actually care about backwards
             // compatibility! Therefore, fall back to the interface for GNOME 2.20
             // if the GNOME 2.22 interface cannot be found.
             //
             // Additionally, there is a design limitation in Managed DBus that restricts
-            // it from flattening/following managed interfaces, therefore we must 
+            // it from flattening/following managed interfaces, therefore we must
             // explicitly handle two different GSD objects as if they had nothing in
             // common at this point. This at least will be fixed in Managed DBus.
             //
@@ -89,28 +89,28 @@ namespace Banshee.MultimediaKeys
             //    [Interface ("org.gnome.SettingsDaemon")] interface IGsd220 : IGsdBase { }
             //    [Interface ("org.gnome.SettingsDaemon.MediaKeys")] interface IGsd222 : IGsdBase { }
             //
-            //    IGsdBase gsd = bus.GetObject<IGsd222> (name, path_222) 
-            //    if (gsd == null) 
+            //    IGsdBase gsd = bus.GetObject<IGsd222> (name, path_222)
+            //    if (gsd == null)
             //        gsd = bus.GetObject<IGsd220> (name, path_220)
             //    gsd.Foo ();
             //
-            
+
             try {
-                settings_daemon_222 = Bus.Session.GetObject<ISettingsDaemon222> (BusName, 
+                settings_daemon_222 = Bus.Session.GetObject<ISettingsDaemon222> (BusName,
                     new ObjectPath (ObjectPath + "/MediaKeys"));
                 settings_daemon_222.GrabMediaPlayerKeys (Application.InternalName, 0);
                 settings_daemon_222.MediaPlayerKeyPressed += OnMediaPlayerKeyPressed;
-                
+
                 Log.Debug ("Using GNOME 2.22 API for Multimedia Keys");
             } catch {
                 settings_daemon_222 = null;
-                
+
                 try {
-                    settings_daemon_220 = Bus.Session.GetObject<ISettingsDaemon220> (BusName, 
+                    settings_daemon_220 = Bus.Session.GetObject<ISettingsDaemon220> (BusName,
                         new ObjectPath (ObjectPath));
                     settings_daemon_220.GrabMediaPlayerKeys (Application.InternalName, 0);
                     settings_daemon_220.MediaPlayerKeyPressed += OnMediaPlayerKeyPressed;
-                
+
                     Log.Debug ("Using GNOME 2.20 API for Multimedia keys");
                 } catch {
                     settings_daemon_220 = null;
@@ -118,7 +118,7 @@ namespace Banshee.MultimediaKeys
                 }
             }
         }
-  
+
         public void Dispose ()
         {
             if (settings_daemon_222 != null) {
@@ -126,20 +126,20 @@ namespace Banshee.MultimediaKeys
                 settings_daemon_222.ReleaseMediaPlayerKeys (Application.InternalName);
                 settings_daemon_222 = null;
             }
-            
+
             if (settings_daemon_220 != null) {
                 settings_daemon_220.MediaPlayerKeyPressed -= OnMediaPlayerKeyPressed;
                 settings_daemon_220.ReleaseMediaPlayerKeys (Application.InternalName);
                 settings_daemon_220 = null;
             }
         }
-        
+
         private void OnMediaPlayerKeyPressed (string application, string key)
         {
             if (application != Application.InternalName) {
                 return;
             }
-            
+
             switch (key) {
                 case "Play":
                     ServiceManager.PlayerEngine.TogglePlaying ();
@@ -155,7 +155,7 @@ namespace Banshee.MultimediaKeys
                     break;
             }
         }
-        
+
         string IService.ServiceName {
             get { return "MultimediaKeysService"; }
         }
diff --git a/src/Extensions/Banshee.MultimediaKeys/Makefile.in b/src/Extensions/Banshee.MultimediaKeys/Makefile.in
index fcf1f84..14490bb 100644
--- a/src/Extensions/Banshee.MultimediaKeys/Makefile.in
+++ b/src/Extensions/Banshee.MultimediaKeys/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -368,6 +377,7 @@ RESOURCES = Resources/Banshee.MultimediaKeys.addin.xml
 @ENABLE_GNOME_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_GNOME_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_GNOME_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_GNOME_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_GNOME_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -471,11 +481,12 @@ RESOURCES = Resources/Banshee.MultimediaKeys.addin.xml
 @ENABLE_GNOME_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_GNOME_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_GNOME_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_GNOME_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_GNOME_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_GNOME_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -493,6 +504,7 @@ RESOURCES = Resources/Banshee.MultimediaKeys.addin.xml
 @ENABLE_GNOME_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_GNOME_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_GNOME_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_GNOME_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_GNOME_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -522,6 +534,7 @@ RESOURCES = Resources/Banshee.MultimediaKeys.addin.xml
 @ENABLE_GNOME_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_GNOME_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_GNOME_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_GNOME_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_GNOME_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_GNOME_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_GNOME_TRUE at OUTPUT_FILES = \
@@ -542,14 +555,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.MultimediaKeys/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.MultimediaKeys/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.MultimediaKeys/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.MultimediaKeys/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -567,25 +580,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -615,13 +644,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -653,6 +686,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -675,6 +709,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -683,18 +719,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -755,7 +801,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_GNOME_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_GNOME_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_GNOME_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_GNOME_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_GNOME_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_GNOME_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_GNOME_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_GNOME_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -772,6 +818,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_GNOME_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_GNOME_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/GtkNotificationAreaBox.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/GtkNotificationAreaBox.cs
index 2c385b6..fae76e4 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/GtkNotificationAreaBox.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/GtkNotificationAreaBox.cs
@@ -41,44 +41,44 @@ namespace Banshee.NotificationArea
     public class GtkNotificationAreaBox : StatusIcon, INotificationAreaBox
     {
         public event EventHandler Disconnected;
-        
+
         public event EventHandler Activated {
             add { base.Activate += value; }
             remove { base.Activate -= value; }
         }
-        
+
         public event PopupMenuHandler PopupMenuEvent {
             add { base.PopupMenu += value; }
             remove { base.PopupMenu -= value; }
         }
-        
+
         public Widget Widget {
             get { return null; }
         }
-        
+
         public GtkNotificationAreaBox (BaseClientWindow window)
         {
             Visible = false;
             IconName = Banshee.ServiceStack.Application.IconName;
-            
+
             Tooltip = window.Title;
             window.TitleChanged += delegate { Tooltip = window.Title; };
         }
-        
+
         public void PositionMenu (Menu menu, out int x, out int y, out bool push_in)
         {
             StatusIcon.PositionMenu (menu, out x, out y, out push_in, Handle);
         }
-        
+
         public void OnPlayerEvent (PlayerEventArgs args)
         {
         }
-        
+
         public void Show ()
         {
             Visible = true;
         }
-        
+
         public void Hide ()
         {
             Visible = false;
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/INotificationAreaBox.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/INotificationAreaBox.cs
index b089886..02e66f8 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/INotificationAreaBox.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/INotificationAreaBox.cs
@@ -38,12 +38,12 @@ namespace Banshee.NotificationArea
         event EventHandler Disconnected;
         event EventHandler Activated;
         event PopupMenuHandler PopupMenuEvent;
-        
+
         void PositionMenu (Menu menu, out int x, out int y, out bool push_in);
         void OnPlayerEvent (PlayerEventArgs args);
-        
+
         Widget Widget { get; }
-        
+
         void Show ();
         void Hide ();
     }
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs
index 05eb469..4c34152 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/NotificationAreaService.cs
@@ -43,9 +43,10 @@ using Banshee.Gui;
 using Banshee.Collection.Gui;
 using Banshee.MediaEngine;
 
+using Hyena.Gui;
 using Hyena.Widgets;
 
-namespace Banshee.NotificationArea 
+namespace Banshee.NotificationArea
 {
     public class NotificationAreaService : IExtensionService
     {
@@ -54,70 +55,70 @@ namespace Banshee.NotificationArea
         private InterfaceActionService interface_action_service;
         private ArtworkManager artwork_manager_service;
         private bool disposed;
-        
+
         private Menu menu;
         private RatingMenuItem rating_menu_item;
         private BansheeActionGroup actions;
         private bool? actions_supported;
-        
+
         private int ui_manager_id;
-        
+
         private bool show_notifications;
         private string notify_last_title;
         private string notify_last_artist;
         private TrackInfo current_track;
         private Notification current_nf;
-    
+
         public NotificationAreaService ()
         {
         }
-        
+
         void IExtensionService.Initialize ()
         {
             elements_service = ServiceManager.Get<GtkElementsService> ();
             interface_action_service = ServiceManager.Get<InterfaceActionService> ();
-        
+
             if (!ServiceStartup ()) {
                 ServiceManager.ServiceStarted += OnServiceStarted;
             }
         }
-        
-        private void OnServiceStarted (ServiceStartedArgs args) 
+
+        private void OnServiceStarted (ServiceStartedArgs args)
         {
             if (args.Service is Banshee.Gui.InterfaceActionService) {
                 interface_action_service = (InterfaceActionService)args.Service;
             } else if (args.Service is GtkElementsService) {
                 elements_service = (GtkElementsService)args.Service;
             }
-                    
+
             ServiceStartup ();
         }
-        
+
         private bool ServiceStartup ()
         {
             if (elements_service == null || interface_action_service == null) {
                 return false;
             }
-            
+
             Initialize ();
-            
+
             ServiceManager.ServiceStarted -= OnServiceStarted;
             if (!BuildNotificationArea ()) {
                 Hyena.Log.Warning ("No available notification area drivers could be found.", false);
                 Dispose ();
                 return false;
             }
-            
+
             GLib.Timeout.Add (1000, delegate {
                 if (notif_area != null) {
                     notif_area.Show ();
                 }
                 return false;
             });
-            
+
             return true;
         }
-        
+
         private void Initialize ()
         {
             interface_action_service.GlobalActions.Add (new ActionEntry [] {
@@ -125,63 +126,63 @@ namespace Banshee.NotificationArea
                     Catalog.GetString ("_Close"), "<Control>W",
                     Catalog.GetString ("Close"), CloseWindow)
             });
-            
+
             actions = new BansheeActionGroup (interface_action_service, "NotificationArea");
             actions.Add (new ToggleActionEntry [] {
                 new ToggleActionEntry ("ToggleNotificationsAction", null,
                     Catalog.GetString ("_Show Notifications"), null,
                     Catalog.GetString ("Show notifications when item changes"), ToggleNotifications, ShowNotifications)
             });
-            
+
             interface_action_service.AddActionGroup (actions);
             ui_manager_id = (int)interface_action_service.UIManager.AddUiFromResource ("NotificationAreaMenu.xml");
-            
+
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
                PlayerEvent.StartOfStream |
                PlayerEvent.EndOfStream |
                PlayerEvent.TrackInfoUpdated |
                PlayerEvent.StateChange);
-            
+
             // Forcefully load this
             show_notifications = ShowNotifications;
         }
-        
+
         public void Dispose ()
         {
             if (disposed) {
                 return;
             }
-            
+
             if (current_nf != null) {
                 try {
                     current_nf.Close ();
                 } catch {}
             }
-                
+
             if (notif_area != null) {
                 notif_area.Dispose ();
                 notif_area = null;
             }
-            
+
             ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
-            
+
             elements_service.PrimaryWindowClose = null;
-            
+
             Gtk.Action close_action = interface_action_service.GlobalActions["CloseAction"];
             if (close_action != null) {
                 interface_action_service.GlobalActions.Remove (close_action);
             }
-            
+
             if (ui_manager_id >= 0) {
                 interface_action_service.RemoveActionGroup ("NotificationArea");
                 interface_action_service.UIManager.RemoveUi ((uint)ui_manager_id);
                 ui_manager_id = -1;
             }
-            
+
             actions = null;
             elements_service = null;
             interface_action_service = null;
-            
+
             disposed = true;
         }
 
@@ -195,8 +196,8 @@ namespace Banshee.NotificationArea
                 return actions_supported.Value;
             }
         }
-        
-        private bool BuildNotificationArea () 
+
+        private bool BuildNotificationArea ()
         {
             if (Environment.OSVersion.Platform == PlatformID.Unix) {
                 try {
@@ -204,28 +205,28 @@ namespace Banshee.NotificationArea
                 } catch {
                 }
             }
-            
+
             if (notif_area == null) {
                 #if HAVE_GTK_2_10
                 notif_area = new GtkNotificationAreaBox (elements_service.PrimaryWindow);
                 #endif
             }
-            
+
             if (notif_area == null) {
                 return false;
             }
-            
+
             notif_area.Disconnected += OnNotificationAreaDisconnected;
             notif_area.Activated += OnNotificationAreaActivated;
             notif_area.PopupMenuEvent += OnNotificationAreaPopupMenuEvent;
-            
+
             if (!QuitOnCloseSchema.Get ()) {
                 RegisterCloseHandler ();
             }
-            
+
             return true;
         }
-        
+
         private void DisposeNotificationArea ()
         {
             if (notif_area != null) {
@@ -234,16 +235,16 @@ namespace Banshee.NotificationArea
                 notif_area.PopupMenuEvent -= OnNotificationAreaPopupMenuEvent;
             }
         }
-        
+
         private void BuildContextMenu ()
         {
             if (menu != null) {
                 return;
             }
-            
+
             menu = (Menu)interface_action_service.UIManager.GetWidget("/NotificationAreaIconMenu");
             menu.Show ();
-            
+
             for (int i = 0; i < menu.Children.Length; i++) {
                 if (menu.Children[i].Name == "Previous") {
                     int j = i;
@@ -252,17 +253,17 @@ namespace Banshee.NotificationArea
                     if (repeat_group != null) {
                         menu.Insert (repeat_group.CreateSubmenu (), i++ + 2);
                     }
-                    
+
                     PlaybackShuffleActions shuffle_group = interface_action_service.FindActionGroup ("PlaybackShuffle")
                          as PlaybackShuffleActions;
                     if (shuffle_group != null) {
                         menu.Insert (shuffle_group.CreateSubmenu (), i++ + 2);
                     }
-                    
+
                     if (j != i) {
                         menu.Insert (new SeparatorMenuItem (), i++ + 2);
                     }
-                    
+
                     rating_menu_item = new RatingMenuItem ();
                     rating_menu_item.Activated += OnRatingChanged;
                     ToggleRatingMenuSensitive ();
@@ -271,39 +272,39 @@ namespace Banshee.NotificationArea
                 }
             }
         }
-        
+
         private void RegisterCloseHandler ()
         {
             if (elements_service.PrimaryWindowClose == null) {
                 elements_service.PrimaryWindowClose = OnPrimaryWindowClose;
             }
         }
-        
+
         private void UnregisterCloseHandler ()
         {
             if (elements_service.PrimaryWindowClose != null) {
                 elements_service.PrimaryWindowClose = null;
             }
         }
-        
+
         private bool OnPrimaryWindowClose ()
         {
             CloseWindow (null, null);
             return true;
         }
-        
+
         private void OnNotificationAreaDisconnected (object o, EventArgs args)
         {
             // Ensure we don't keep the destroyed reference around
             DisposeNotificationArea ();
             BuildNotificationArea ();
         }
-        
+
         private void OnNotificationAreaActivated (object o, EventArgs args)
         {
             elements_service.PrimaryWindow.ToggleVisibility ();
         }
-        
+
         private void OnNotificationAreaPopupMenuEvent (object o, PopupMenuArgs args)
         {
             BuildContextMenu ();
@@ -320,7 +321,7 @@ namespace Banshee.NotificationArea
 
             menu.Popup (null, null, notif_area.PositionMenu, 3, Gtk.Global.CurrentEventTime);
         }
-        
+
         private void CloseWindow (object o, EventArgs args)
         {
             try {
@@ -329,16 +330,16 @@ namespace Banshee.NotificationArea
                     if (image != null) {
                         image = image.ScaleSimple (42, 42, Gdk.InterpType.Bilinear);
                     }
-                    
+
                     Notification nf = new Notification (
-                        Catalog.GetString ("Still Running"), 
-                        Catalog.GetString ("Banshee was closed to the notification area. " + 
+                        Catalog.GetString ("Still Running"),
+                        Catalog.GetString ("Banshee was closed to the notification area. " +
                             "Use the <i>Quit</i> option to end your session."),
                         image, notif_area.Widget);
                     nf.Urgency = Urgency.Low;
                     nf.Timeout = 4500;
                     nf.Show ();
-                    
+
                     NotifyOnCloseSchema.Set (false);
                 }
             } catch {
@@ -351,8 +352,8 @@ namespace Banshee.NotificationArea
         {
             ShowNotifications = ((ToggleAction)actions["ToggleNotificationsAction"]).Active;
         }
-        
-        private void OnPlayerEvent (PlayerEventArgs args) 
+
+        private void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
                 case PlayerEvent.StartOfStream:
@@ -366,10 +367,10 @@ namespace Banshee.NotificationArea
                     ToggleRatingMenuSensitive ();
                     break;
             }
-            
+
             notif_area.OnPlayerEvent (args);
         }
-        
+
         private void OnRatingChanged (object o, EventArgs args)
         {
             TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
@@ -385,13 +386,13 @@ namespace Banshee.NotificationArea
                 ServiceManager.PlayerEngine.TrackInfoUpdated ();
             }
         }
-        
-        private void ToggleRatingMenuSensitive () 
+
+        private void ToggleRatingMenuSensitive ()
         {
             if (rating_menu_item == null) {
                 return;
             }
-            
+
             if (ServiceManager.PlayerEngine.CurrentTrack is DatabaseTrackInfo) {
                 rating_menu_item.Show ();
             } else {
@@ -402,18 +403,18 @@ namespace Banshee.NotificationArea
         private void ShowTrackNotification ()
         {
             // This has to happen before the next if, otherwise the last_* members aren't set correctly.
-            if (current_track == null || (notify_last_title == current_track.DisplayTrackTitle 
+            if (current_track == null || (notify_last_title == current_track.DisplayTrackTitle
                 && notify_last_artist == current_track.DisplayArtistName)) {
                 return;
             }
-            
+
             notify_last_title = current_track.DisplayTrackTitle;
             notify_last_artist = current_track.DisplayArtistName;
-            
+
             if (!show_notifications) {
                 return;
             }
-            
+
             foreach (var window in elements_service.ContentWindows) {
                 if (window.HasToplevelFocus) {
                     return;
@@ -428,35 +429,36 @@ namespace Banshee.NotificationArea
                 // This will be reached if no notification daemon is running
                 return;
             }
-            
-            string message = String.Format ("{0}\n<i>{1}</i>", 
-                GLib.Markup.EscapeText (current_track.DisplayTrackTitle),
-                GLib.Markup.EscapeText (current_track.DisplayArtistName));
-            
+
+            string message = GetByFrom (
+                current_track.ArtistName, current_track.DisplayArtistName,
+                current_track.AlbumTitle, current_track.DisplayAlbumTitle);
+
             if (artwork_manager_service == null) {
                 artwork_manager_service = ServiceManager.Get<ArtworkManager> ();
             }
-            
+
             Gdk.Pixbuf image = null;
-            
+
             if (artwork_manager_service != null) {
                 image = is_notification_daemon
                     ? artwork_manager_service.LookupScalePixbuf (current_track.ArtworkId, 42)
                     : artwork_manager_service.LookupPixbuf (current_track.ArtworkId);
             }
-            
+
             if (image == null) {
                 image = IconThemeUtils.LoadIcon (48, "audio-x-generic");
                 if (image != null) {
                     image.ScaleSimple (42, 42, Gdk.InterpType.Bilinear);
                 }
             }
-            
+
             try {
                 if (current_nf == null) {
-                    current_nf = new Notification (Catalog.GetString ("Now Playing"), 
+                    current_nf = new Notification (current_track.DisplayTrackTitle,
                         message, image, notif_area.Widget);
                 } else {
+                    current_nf.Summary = current_track.DisplayTrackTitle;
                     current_nf.Body = message;
                     current_nf.Icon = image;
                     current_nf.AttachToWidget (notif_area.Widget);
@@ -471,31 +473,74 @@ namespace Banshee.NotificationArea
                 Hyena.Log.Warning (Catalog.GetString ("Cannot show notification"), e.Message, false);
             }
         }
-        
+
+        private Cairo.Color TextLightColor {
+            get {
+                return Hyena.Gui.Theming.GtkTheme.GetCairoTextMidColor (notif_area.Widget);
+            }
+        }
+
+        private string MarkupFormat (string fmt, params string [] args)
+        {
+            string [] new_args = new string [args.Length + 2];
+            new_args[0] = String.Format ("<span color=\"{0}\" size=\"small\">",
+                CairoExtensions.ColorGetHex (TextLightColor, false));
+            new_args[1] = "</span>";
+
+            for (int i = 0; i < args.Length; i++) {
+                new_args[i + 2] = GLib.Markup.EscapeText (args[i]);
+            }
+
+            return String.Format (fmt, new_args);
+        }
+
+        private string GetByFrom (string artist, string display_artist, string album, string display_album)
+        {
+            bool has_artist = !String.IsNullOrEmpty (artist);
+            bool has_album = !String.IsNullOrEmpty (album);
+
+            string markup = null;
+            if (has_artist && has_album) {
+                // Translators: {0} and {1} are for markup so ignore them, {2} and {3}
+                // are Artist Name and Album Title, respectively;
+                // e.g. 'by Parkway Drive from Killing with a Smile'
+                markup = MarkupFormat (Catalog.GetString ("{0}by{1} {2}\n{0}from{1} {3}"), display_artist, display_album);
+            } else if (has_album) {
+                // Translators: {0} and {1} are for markup so ignore them, {2} is for Album Title;
+                // e.g. 'from Killing with a Smile'
+                markup = MarkupFormat (Catalog.GetString ("{0}from{1} {2}"), display_album);
+            } else {
+                // Translators: {0} and {1} are for markup so ignore them, {2} is for Artist Name;
+                // e.g. 'by Parkway Drive'
+                markup = MarkupFormat (Catalog.GetString ("{0}by{1} {2}"), display_artist);
+            }
+            return markup;
+        }
+
         private void OnSongSkipped (object o, ActionArgs args)
         {
             if (args.Action == "skip-song") {
                 ServiceManager.PlaybackController.Next ();
             }
         }
-        
+
         public bool ShowNotifications {
-            get { 
-                show_notifications = ShowNotificationsSchema.Get (); 
+            get {
+                show_notifications = ShowNotificationsSchema.Get ();
                 return show_notifications;
             }
-            
-            set { 
+
+            set {
                 ShowNotificationsSchema.Set (value);
                 show_notifications = value;
             }
         }
-        
+
         public bool QuitOnClose {
             get {
                 return QuitOnCloseSchema.Get ();
             }
-            
+
             set {
                 QuitOnCloseSchema.Set (value);
                 if (value) {
@@ -505,32 +550,32 @@ namespace Banshee.NotificationArea
                 }
             }
         }
-    
+
         string IService.ServiceName {
             get { return "NotificationAreaService"; }
         }
-        
+
         public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
             "plugins.notification_area", "enabled",
             true,
             "Plugin enabled",
             "Notification area plugin enabled"
         );
-                
+
         public static readonly SchemaEntry<bool> ShowNotificationsSchema = new SchemaEntry<bool> (
             "plugins.notification_area", "show_notifications",
             true,
             "Show notifications",
             "Show information notifications when item starts playing"
         );
-                
+
         public static readonly SchemaEntry<bool> NotifyOnCloseSchema = new SchemaEntry<bool> (
             "plugins.notification_area", "notify_on_close",
             true,
             "Show a notification when closing main window",
             "When the main window is closed, show a notification stating this has happened."
         );
-                
+
         public static readonly SchemaEntry<bool> QuitOnCloseSchema = new SchemaEntry<bool> (
             "plugins.notification_area", "quit_on_close",
             false,
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs
index 3dc1162..bee0ec9 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs
@@ -41,20 +41,20 @@ namespace Banshee.NotificationArea
     {
         private TrackInfoDisplay header;
         private ConnectedSeekSlider seek_slider;
-    
+
         public TrackInfoPopup () : base (Gtk.WindowType.Popup)
         {
             BorderWidth = 8;
             AppPaintable = true;
             Resizable = false;
             TypeHint = Gdk.WindowTypeHint.Notification;
-            
+
             VBox box = new VBox ();
             box.Spacing = 4;
 
             header = new ClassicTrackInfoDisplay ();
             header.SetSizeRequest (320, 64);
-            
+
             seek_slider = new ConnectedSeekSlider (SeekSliderLayout.Horizontal);
             seek_slider.StreamPositionLabel.FormatString = "<small>{0}</small>";
             seek_slider.LeftPadding = 0;
@@ -62,20 +62,20 @@ namespace Banshee.NotificationArea
 
             box.PackStart (header, true, true, 0);
             box.PackStart (seek_slider, false, false, 0);
-            
+
             Add (box);
             box.ShowAll ();
         }
-        
+
         public override void Dispose ()
         {
             header.Dispose ();
             base.Dispose ();
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
-            Gtk.Style.PaintFlatBox (Style, GdkWindow, StateType.Normal, ShadowType.Out, evnt.Area, this, "tooltip", 
+            Gtk.Style.PaintFlatBox (Style, GdkWindow, StateType.Normal, ShadowType.Out, evnt.Area, this, "tooltip",
                 0, 0, Allocation.Width, Allocation.Height);
             return base.OnExposeEvent (evnt);
         }
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationArea.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationArea.cs
index 1125119..fd2febf 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationArea.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationArea.cs
@@ -31,7 +31,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-// NOTE: throughout IntPtr is used for the Xlib long type, as this tends to 
+// NOTE: throughout IntPtr is used for the Xlib long type, as this tends to
 // have the correct width and does not require any configure checks.
 
 using System;
@@ -94,7 +94,7 @@ public class X11NotificationArea : Plug
 			ev.window = (IntPtr) Id;
 			ev.format = 8;
 			ev.message_type = message_data_atom;
-       
+
 			int len = Math.Min (arr.Length - index, 20);
 			memcpy (ref ev.data, (IntPtr)((int)unmanaged_arr + index), (IntPtr)len);
 		
@@ -254,7 +254,7 @@ public class X11NotificationArea : Plug
 	private FilterReturn ManagerFilter (IntPtr xevent, Event evnt)
 	{
 		XAnyEvent xev = (XAnyEvent) Marshal.PtrToStructure (xevent, typeof(XAnyEvent));
-   
+
 		if (xev.type == XEventName.ClientMessage){
 			XClientMessageEvent xclient = (XClientMessageEvent) Marshal.PtrToStructure (xevent, typeof(XClientMessageEvent));
 
@@ -277,7 +277,7 @@ public class X11NotificationArea : Plug
 				ManagerWindowDestroyed();
 			}
 		}
-   
+
 		return FilterReturn.Continue;
 	}
 
@@ -285,11 +285,11 @@ public class X11NotificationArea : Plug
 	{
 		if (manager_window != IntPtr.Zero) {
 			Gdk.Window gdkwin = Gdk.Window.ForeignNewForDisplay (Display, (uint) manager_window);
-       
+
 			if (gdkwin != null) {
 				gdkwin.RemoveFilter (filter);
 			}
-       
+
 			manager_window = IntPtr.Zero;
 			UpdateManagerWindow (true);
 		}
@@ -309,14 +309,14 @@ public class X11NotificationArea : Plug
 		}
 
 		display = gdk_x11_display_get_xdisplay (Display.Handle);
-   
+
 		gdk_error_trap_push ();
 		type = IntPtr.Zero;
-   
-		result = XGetWindowProperty (display, manager_window, orientation_atom, (IntPtr) 0, 
-					     (IntPtr) System.Int32.MaxValue, false, (IntPtr) XAtom.Cardinal, out type, out format, 
+
+		result = XGetWindowProperty (display, manager_window, orientation_atom, (IntPtr) 0,
+					     (IntPtr) System.Int32.MaxValue, false, (IntPtr) XAtom.Cardinal, out type, out format,
 					     out nitems, out bytes_after, out prop_return);
-   
+
 		error = gdk_error_trap_pop ();
 
 		if (error != 0 || result != 0) {
@@ -324,8 +324,8 @@ public class X11NotificationArea : Plug
 		}
 
 		if (type == (IntPtr) XAtom.Cardinal) {
-			orientation = ((SystemTrayOrientation) Marshal.ReadInt32 (prop_return) == SystemTrayOrientation.Horz) 
-				? Orientation.Horizontal 
+			orientation = ((SystemTrayOrientation) Marshal.ReadInt32 (prop_return) == SystemTrayOrientation.Horz)
+				? Orientation.Horizontal
 				: Orientation.Vertical;
 		}
 
@@ -371,14 +371,14 @@ public class X11NotificationArea : Plug
 	private extern static IntPtr XSelectInput (IntPtr display, IntPtr window, IntPtr mask);
 
 	[DllImport ("libX11.so.6")]
-	private extern static int XSendEvent (IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, 
+	private extern static int XSendEvent (IntPtr display, IntPtr window, bool propagate, IntPtr event_mask,
 					     ref XClientMessageEvent send_event);
 
 	[DllImport ("libX11.so.6")]
-	private extern static int XGetWindowProperty (IntPtr display, IntPtr w, IntPtr property, IntPtr long_offset, 
+	private extern static int XGetWindowProperty (IntPtr display, IntPtr w, IntPtr property, IntPtr long_offset,
 						     IntPtr long_length, bool deleteProp, IntPtr req_type,
-						     out IntPtr actual_type_return, out int actual_format_return, 
-						     out IntPtr nitems_return, out IntPtr bytes_after_return, 
+						     out IntPtr actual_type_return, out int actual_format_return,
+						     out IntPtr nitems_return, out IntPtr bytes_after_return,
 						     out IntPtr prop_return);
 
 	[Flags]
@@ -466,7 +466,7 @@ public class X11NotificationArea : Plug
 	}
 
 	[StructLayout(LayoutKind.Sequential)]
-	private struct XAnyEvent 
+	private struct XAnyEvent
 	{
 		internal XEventName    type;
 		internal IntPtr        serial;
@@ -476,7 +476,7 @@ public class X11NotificationArea : Plug
 	}
 
 	[StructLayout(LayoutKind.Sequential)]
-	private struct XPropertyEvent 
+	private struct XPropertyEvent
 	{
 		internal XEventName    type;
 		internal IntPtr        serial;
@@ -489,7 +489,7 @@ public class X11NotificationArea : Plug
 	}
 
 	[StructLayout(LayoutKind.Sequential)]
-	private struct XClientMessageEvent 
+	private struct XClientMessageEvent
 	{
 		internal XEventName     type;
 		internal IntPtr         serial;
@@ -498,9 +498,9 @@ public class X11NotificationArea : Plug
 		internal IntPtr         window;
 		internal IntPtr         message_type;
 		internal int            format;
-    
+
 		[StructLayout(LayoutKind.Sequential)]
-		internal struct DataUnion 
+		internal struct DataUnion
 		{
 			internal IntPtr ptr1;
 			internal IntPtr ptr2;
@@ -508,7 +508,7 @@ public class X11NotificationArea : Plug
 			internal IntPtr ptr4;
 			internal IntPtr ptr5;
 		}
-    
+
 		internal DataUnion      data;
 	}
 }
diff --git a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
index e51c28a..90f98ed 100644
--- a/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
+++ b/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
@@ -40,88 +40,88 @@ namespace Banshee.NotificationArea
 {
     public class X11NotificationAreaBox : X11NotificationArea, INotificationAreaBox
     {
-        private enum PanelOrientation { 
-            Horizontal, 
-            Vertical 
+        private enum PanelOrientation {
+            Horizontal,
+            Vertical
         }
-    
+
         private EventBox event_box;
         private Image icon;
-        
+
         private TrackInfoPopup popup;
         private bool can_show_popup = false;
         private bool cursor_over_trayicon = false;
         private bool hide_delay_started = false;
         private int panel_size;
-        
+
         public event EventHandler Disconnected;
         public event EventHandler Activated;
         public event PopupMenuHandler PopupMenuEvent;
-        
+
         public Widget Widget {
             get { return event_box; }
         }
-        
+
         public X11NotificationAreaBox () : base (Catalog.GetString ("Banshee"))
         {
             event_box = new EventBox ();
             Add (event_box);
             icon = new Image ();
-            
+
             // Load a 16x16-sized icon to ensure we don't end up with a 1x1 pixel.
             panel_size = 16;
             event_box.Add (icon);
-            
+
             event_box.ButtonPressEvent += OnButtonPressEvent;
             event_box.EnterNotifyEvent += OnEnterNotifyEvent;
             event_box.LeaveNotifyEvent += OnLeaveNotifyEvent;
             event_box.ScrollEvent += OnMouseScroll;
-            
+
             event_box.ShowAll ();
         }
-        
+
         public override void Dispose ()
         {
             HidePopup ();
-        
+
             event_box.ButtonPressEvent -= OnButtonPressEvent;
             event_box.EnterNotifyEvent -= OnEnterNotifyEvent;
             event_box.LeaveNotifyEvent -= OnLeaveNotifyEvent;
             event_box.ScrollEvent -= OnMouseScroll;
-        
+
             Destroy ();
         }
-        
-        public void PositionMenu (Menu menu, out int x, out int y, out bool push_in) 
+
+        public void PositionMenu (Menu menu, out int x, out int y, out bool push_in)
         {
             PositionWidget (menu, out x, out y, 0);
             push_in = true;
         }
-        
-        private bool PositionWidget (Widget widget, out int x, out int y, int yPadding) 
+
+        private bool PositionWidget (Widget widget, out int x, out int y, int yPadding)
         {
             int button_y, panel_width, panel_height;
             Gtk.Requisition requisition = widget.SizeRequest ();
-            
+
             event_box.GdkWindow.GetOrigin (out x, out button_y);
             (event_box.Toplevel as Gtk.Window).GetSize (out panel_width, out panel_height);
-            
+
             bool on_bottom = button_y + panel_height + requisition.Height >= event_box.Screen.Height;
 
             y = on_bottom
                 ? button_y - requisition.Height - yPadding
                 : button_y + panel_height + yPadding;
-                
+
             return on_bottom;
         }
-        
+
 #region Panel Icon Sizing
 
-        // This code has been shamelessly ripped off from 
+        // This code has been shamelessly ripped off from
         // Tomboy, the wonderful life organizer!
-        
+
         private void ConfigureIconSize ()
-        {   
+        {
             // For some reason, the first time we ask for the allocation,
             // it's a 1x1 pixel.  Prevent against this by returning a
             // reasonable default.  Setting the icon causes OnSizeAllocated
@@ -130,7 +130,7 @@ namespace Banshee.NotificationArea
             if (icon_size < 16) {
                 icon_size = 16;
             }
-            
+
             // Control specifically which icon is used at the smaller sizes
             // so that no scaling occurs. See bug #403500 for more info (--Boyd)
             if (icon_size <= 21) {
@@ -140,7 +140,7 @@ namespace Banshee.NotificationArea
             } else if (icon_size <= 47) {
                 icon_size = 32;
             }
-            
+
             icon.IconName = Banshee.ServiceStack.Application.IconName;
             icon.PixelSize = icon_size;
         }
@@ -149,7 +149,7 @@ namespace Banshee.NotificationArea
         {
             // Determine whether the tray is inside a horizontal or vertical
             // panel so the size of the icon can adjust correctly.
-        
+
             if (event_box.ParentWindow == null) {
                 return PanelOrientation.Horizontal;
             }
@@ -160,7 +160,7 @@ namespace Banshee.NotificationArea
             if (rect.Width < rect.Height) {
                 return PanelOrientation.Vertical;
             }
-            
+
             return PanelOrientation.Horizontal;
         }
 
@@ -168,7 +168,7 @@ namespace Banshee.NotificationArea
 
         protected override void OnSizeAllocated (Gdk.Rectangle rect)
         {
-            // Ignore the first allocation dimensions (typically 200x200) and use only 
+            // Ignore the first allocation dimensions (typically 200x200) and use only
             // the allocation's position and the default icon size for dimension (16x16).
             // A proper size request will be queued later through ConfigureIconSize ().
             // Fix for BGO #540885
@@ -177,45 +177,45 @@ namespace Banshee.NotificationArea
                 first_alloc = false;
                 return;
             }
-            
+
             base.OnSizeAllocated (rect);
-            
+
             if (GetPanelOrientation () == PanelOrientation.Horizontal) {
                 if (panel_size == Allocation.Height) {
                     return;
                 }
-                
+
                 panel_size = Allocation.Height;
             } else {
                 if (panel_size == Allocation.Width) {
                     return;
                 }
-                
+
                 panel_size = Allocation.Width;
             }
 
             ConfigureIconSize ();
         }
-        
+
 #endregion
-        
-        private void HidePopup () 
+
+        private void HidePopup ()
         {
             if (popup == null) {
                 return;
             }
-            
+
             popup.Hide ();
             popup.Dispose ();
             popup = null;
         }
-        
-        private void ShowPopup () 
+
+        private void ShowPopup ()
         {
             if (popup != null) {
                 return;
             }
-            
+
             popup = new TrackInfoPopup ();
             popup.EnterNotifyEvent += delegate {
                 hide_delay_started = false;
@@ -231,15 +231,15 @@ namespace Banshee.NotificationArea
 
             popup.Show ();
         }
-        
-        private void PositionPopup () 
+
+        private void PositionPopup ()
         {
             int x, y;
             Gtk.Requisition event_box_req = event_box.SizeRequest ();
             Gtk.Requisition popup_req = popup.SizeRequest ();
-            
+
             PositionWidget (popup, out x, out y, 5);
-            
+
             int monitor = event_box.Screen.GetMonitorAtPoint (x, y);
             var monitor_rect = event_box.Screen.GetMonitorGeometry(monitor);
 
@@ -250,16 +250,16 @@ namespace Banshee.NotificationArea
             } else if (x < monitor_rect.Left + 5) {
                 x = monitor_rect.Left + 5;
             }
-            
+
             popup.Move (x, y);
         }
-        
+
         private void OnButtonPressEvent (object o, ButtonPressEventArgs args)
         {
             if (args.Event.Type != Gdk.EventType.ButtonPress) {
                 return;
             }
-        
+
             switch (args.Event.Button) {
                 case 1:
                     if ((args.Event.State & Gdk.ModifierType.ControlMask) != 0) {
@@ -280,7 +280,7 @@ namespace Banshee.NotificationArea
                     break;
             }
         }
-        
+
         private void OnMouseScroll (object o, ScrollEventArgs args)
         {
             switch (args.Event.Direction) {
@@ -293,7 +293,7 @@ namespace Banshee.NotificationArea
                         ServiceManager.PlaybackController.Next ();
                     }
                     break;
-                    
+
                 case Gdk.ScrollDirection.Down:
                     if ((args.Event.State & Gdk.ModifierType.ControlMask) != 0) {
                         if (ServiceManager.PlayerEngine.Volume < (ushort)PlayerEngine.VolumeDelta) {
@@ -309,8 +309,8 @@ namespace Banshee.NotificationArea
                     break;
             }
         }
-        
-        private void OnEnterNotifyEvent (object o, EnterNotifyEventArgs args) 
+
+        private void OnEnterNotifyEvent (object o, EnterNotifyEventArgs args)
         {
             hide_delay_started = false;
             cursor_over_trayicon = true;
@@ -325,8 +325,8 @@ namespace Banshee.NotificationArea
                 });
             }
         }
-        
-        private void OnLeaveNotifyEvent (object o, LeaveNotifyEventArgs args) 
+
+        private void OnLeaveNotifyEvent (object o, LeaveNotifyEventArgs args)
         {
             // Give the user half a second to move the mouse cursor to the popup.
             if (!hide_delay_started) {
@@ -341,14 +341,14 @@ namespace Banshee.NotificationArea
                 });
             }
         }
-        
+
         public void OnPlayerEvent (PlayerEventArgs args)
         {
             switch (args.Event) {
                 case PlayerEvent.StartOfStream:
                     can_show_popup = true;
                     break;
-                    
+
                 case PlayerEvent.EndOfStream:
                     // only hide the popup when we don't play again after 250ms
                     GLib.Timeout.Add (250, delegate {
@@ -361,7 +361,7 @@ namespace Banshee.NotificationArea
                     break;
             }
         }
-        
+
         protected virtual void OnActivated ()
         {
             EventHandler handler = Activated;
@@ -369,7 +369,7 @@ namespace Banshee.NotificationArea
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnPopupMenuEvent ()
         {
             PopupMenuHandler handler = PopupMenuEvent;
@@ -377,16 +377,16 @@ namespace Banshee.NotificationArea
                 handler (this, new PopupMenuArgs ());
             }
         }
-        
+
         protected override bool OnDestroyEvent (Gdk.Event evnt)
         {
             bool result = base.OnDestroyEvent (evnt);
-            
+
             EventHandler handler = Disconnected;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
             }
-            
+
             return result;
         }
     }
diff --git a/src/Extensions/Banshee.NotificationArea/Makefile.in b/src/Extensions/Banshee.NotificationArea/Makefile.in
index 19531b7..06e65f5 100644
--- a/src/Extensions/Banshee.NotificationArea/Makefile.in
+++ b/src/Extensions/Banshee.NotificationArea/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -388,6 +397,7 @@ RESOURCES = \
 @ENABLE_OSX_FALSE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_OSX_FALSE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_OSX_FALSE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_OSX_FALSE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_OSX_FALSE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_OSX_FALSE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_OSX_FALSE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -491,11 +501,12 @@ RESOURCES = \
 @ENABLE_OSX_FALSE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_OSX_FALSE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_OSX_FALSE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_OSX_FALSE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_OSX_FALSE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_OSX_FALSE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_OSX_FALSE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -513,6 +524,7 @@ RESOURCES = \
 @ENABLE_OSX_FALSE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_OSX_FALSE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_OSX_FALSE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_OSX_FALSE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_OSX_FALSE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -542,6 +554,7 @@ RESOURCES = \
 @ENABLE_OSX_FALSE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_OSX_FALSE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_OSX_FALSE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_OSX_FALSE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_OSX_FALSE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_OSX_FALSE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_OSX_FALSE at OUTPUT_FILES = \
@@ -561,14 +574,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.NotificationArea/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.NotificationArea/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.NotificationArea/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.NotificationArea/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -586,25 +599,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -634,13 +663,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -672,6 +705,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -694,6 +728,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -702,18 +738,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -774,7 +820,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_OSX_FALSE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_OSX_FALSE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_OSX_FALSE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_OSX_FALSE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_OSX_FALSE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_OSX_FALSE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_OSX_FALSE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_OSX_FALSE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -791,6 +837,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_OSX_FALSE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_OSX_FALSE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.NotificationArea/Notifications/Notification.cs b/src/Extensions/Banshee.NotificationArea/Notifications/Notification.cs
index 87852a0..9f9d3b3 100644
--- a/src/Extensions/Banshee.NotificationArea/Notifications/Notification.cs
+++ b/src/Extensions/Banshee.NotificationArea/Notifications/Notification.cs
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2006 Sebastian Dröge <slomo at circular-chaos.org>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
diff --git a/src/Extensions/Banshee.NotificationArea/Notifications/Notifications.cs b/src/Extensions/Banshee.NotificationArea/Notifications/Notifications.cs
index 25ac1e1..7c7b042 100644
--- a/src/Extensions/Banshee.NotificationArea/Notifications/Notifications.cs
+++ b/src/Extensions/Banshee.NotificationArea/Notifications/Notifications.cs
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2006 Sebastian Dröge <slomo at circular-chaos.org>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.dll.config b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.dll.config
deleted file mode 100644
index ca9834e..0000000
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.dll.config
+++ /dev/null
@@ -1,3 +0,0 @@
-<configuration>
-  <dllmap dll="clutter-gtk" target="libclutter-gtk-0.8.so.0"/>
-</configuration>
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenAdapter.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenAdapter.cs
index de17bc5..63c5064 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenAdapter.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenAdapter.cs
@@ -39,7 +39,7 @@ namespace Banshee.NowPlaying
         private IFullscreenAdapter adapter;
         private bool probed = false;
         private bool first_fullscreen = false;
-        
+
         public void Fullscreen (Window window, bool fullscreen)
         {
             if (!first_fullscreen && !fullscreen) {
@@ -47,21 +47,21 @@ namespace Banshee.NowPlaying
             } else if (fullscreen) {
                 first_fullscreen = true;
             }
-        
+
             if (adapter != null) {
                 try {
                     adapter.Fullscreen (window, fullscreen);
                 } catch (Exception e) {
                     Log.Exception ("IFullscreenAdapter extension failed, so disabling", e);
                     DisposeAdapter ();
-                }   
-                
+                }
+
                 return;
             } else if (probed) {
                 DefaultFullscreen (window, fullscreen);
                 return;
             }
-            
+
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/NowPlaying/FullscreenAdapter")) {
                 try {
                     adapter = (IFullscreenAdapter)node.CreateInstance (typeof (IFullscreenAdapter));
@@ -71,17 +71,17 @@ namespace Banshee.NowPlaying
                     Log.Exception ("IFullscreenAdapter extension failed to load", e);
                 }
             }
-            
+
             probed = true;
             Fullscreen (window, fullscreen);
         }
-        
+
         public void Dispose ()
         {
             DisposeAdapter ();
             probed = false;
         }
-        
+
         private void DisposeAdapter ()
         {
             if (adapter != null) {
@@ -90,11 +90,11 @@ namespace Banshee.NowPlaying
                 } catch (Exception e) {
                     Log.Exception ("IFullscreenAdapter failed to dispose", e);
                 }
-                
+
                 adapter = null;
             }
         }
-        
+
         private void DefaultFullscreen (Window window, bool fullscreen)
         {
             if (fullscreen) {
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenControls.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenControls.cs
index a39a064..425d5b8 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenControls.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenControls.cs
@@ -1,4 +1,4 @@
-// 
+//
 // FullscreenControls.cs
 //
 // Authors:
@@ -40,32 +40,32 @@ namespace Banshee.NowPlaying
         private InterfaceActionService action_service;
         private ConnectedVolumeButton volume_button;
         private ConnectedSeekSlider slider;
-        
+
         public FullscreenControls (Window toplevel, InterfaceActionService actionService) : base (toplevel, 1)
         {
             action_service = actionService;
             AddAccelGroup (action_service.UIManager.AccelGroup);
             BuildInterface ();
         }
-        
+
         private void BuildInterface ()
         {
             HBox box = new HBox ();
-            
+
             volume_button = new ConnectedVolumeButton (true);
-            
+
             box.PackStart (action_service.PlaybackActions["PreviousAction"].CreateToolItem (), false, false, 0);
             box.PackStart (action_service.PlaybackActions["PlayPauseAction"].CreateToolItem (), false, false, 0);
             box.PackStart (new NextButton (action_service), false, false, 0);
             box.PackStart (new RepeatActionButton (true), false, false, 0);
             box.PackStart (slider = new ConnectedSeekSlider (SeekSliderLayout.Horizontal), true, true, 0);
             box.PackStart (volume_button, false, false, 0);
-            
+
             Button exit = new Button (Stock.LeaveFullscreen);
             exit.Relief = ReliefStyle.None;
             exit.Clicked += delegate { TransientFor.Hide (); };
             box.PackStart (exit, false, false, 0);
-            
+
             Add (box);
             box.ShowAll ();
         }
@@ -75,7 +75,7 @@ namespace Banshee.NowPlaying
             slider.Disconnect ();
             base.Destroy ();
         }
-        
+
         public bool Active {
             get { return volume_button.Active || IsActive; }
         }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
index 93dd048..f735ad6 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/FullscreenWindow.cs
@@ -1,4 +1,4 @@
-// 
+//
 // FullScreenWindow.cs
 //
 // Authors:
@@ -42,38 +42,38 @@ namespace Banshee.NowPlaying
         private Gtk.Window parent;
         private FullscreenControls controls;
         private InterfaceActionService action_service;
-        
+
         public FullscreenWindow (Window parent) : base (WindowType.Toplevel)
         {
             Title = parent.Title;
             AppPaintable = true;
-            
+
             this.parent = parent;
             this.action_service = ServiceManager.Get<InterfaceActionService> ();
-            
+
             AddAccelGroup (action_service.UIManager.AccelGroup);
-            
+
             SetupWidget ();
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             evnt.Window.DrawRectangle (Style.BlackGC, true, Allocation);
             return base.OnExposeEvent (evnt);
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
         {
             PlayerEngineService player = ServiceManager.PlayerEngine;
-            
+
             bool control = (evnt.State & Gdk.ModifierType.ShiftMask) != 0;
             bool shift = (evnt.State & Gdk.ModifierType.ControlMask) != 0;
             bool mod = control || shift;
-            
+
             uint fixed_seek = 15000; // 15 seconds
             uint fast_seek = player.Length > 0 ? (uint)(player.Length * 0.15) : fixed_seek; // 15% or fixed
             uint slow_seek = player.Length > 0 ? (uint)(player.Length * 0.05) : fixed_seek; // 5% or fixed
-            
+
             switch (evnt.Key) {
                 case Gdk.Key.F11:
                 case Gdk.Key.Escape:
@@ -103,22 +103,22 @@ namespace Banshee.NowPlaying
                     ShowControls ();
                     break;
             }
-            
+
             return base.OnKeyPressEvent (evnt);
         }
-        
+
 #region Widgetry and show/hide logic
-        
+
         private void SetupWidget ()
         {
             Deletable = false;
             TransientFor = null;
             Decorated = false;
             CanFocus = true;
-            
+
             ConfigureWindow ();
         }
-        
+
         private void ConfigureWindow ()
         {
             Gdk.Screen screen = Screen;
@@ -127,52 +127,52 @@ namespace Banshee.NowPlaying
             Move (bounds.X, 0);
             SetDefaultSize (bounds.Width, bounds.Height);
         }
-        
+
         protected override void OnRealized ()
         {
             Events |= Gdk.EventMask.PointerMotionMask;
-            
+
             base.OnRealized ();
-            
+
             Screen.SizeChanged += OnScreenSizeChanged;
         }
-        
+
         protected override void OnUnrealized ()
         {
             base.OnUnrealized ();
             Screen.SizeChanged -= OnScreenSizeChanged;
         }
-        
+
         protected override bool OnDeleteEvent (Gdk.Event evnt)
         {
             Hide ();
             return true;
         }
-        
+
         protected override void OnShown ()
         {
             base.OnShown ();
             if (Child != null) {
                 Child.Show ();
             }
-            
+
             OnHideCursorTimeout ();
             ConfigureWindow ();
             HasFocus = true;
             parent.AddNotification ("is-active", ParentActiveNotification);
         }
-        
+
         protected override void OnHidden ()
         {
             base.OnHidden ();
             DestroyControls ();
         }
-        
+
         private void OnScreenSizeChanged (object o, EventArgs args)
         {
             ConfigureWindow ();
         }
-        
+
         private void ParentActiveNotification (object o, GLib.NotifyArgs args)
         {
             // If our parent window is ever somehow activated while we are
@@ -189,7 +189,7 @@ namespace Banshee.NowPlaying
         }
 
 #endregion
-                                
+
 #region Control Window
 
         private void ShowControls ()
@@ -197,10 +197,10 @@ namespace Banshee.NowPlaying
             if (controls == null) {
                 controls = new FullscreenControls (this, action_service);
             }
-            
+
             controls.Show ();
         }
-        
+
         private void HideControls ()
         {
             if (controls != null) {
@@ -208,7 +208,7 @@ namespace Banshee.NowPlaying
                 QueueDraw ();
             }
         }
-        
+
         private void DestroyControls ()
         {
             if (controls != null) {
@@ -216,7 +216,7 @@ namespace Banshee.NowPlaying
                 controls = null;
             }
         }
-        
+
         private bool ControlsActive {
             get {
                 if (controls == null || !controls.Visible) {
@@ -224,38 +224,38 @@ namespace Banshee.NowPlaying
                 } else if (controls.Active) {
                     return true;
                 }
-                
+
                 int cursor_x, cursor_y;
                 int window_x, window_y;
-                
+
                 controls.GdkWindow.Screen.Display.GetPointer (out cursor_x, out cursor_y);
                 controls.GetPosition (out window_x, out window_y);
-                
-                Gdk.Rectangle box = new Gdk.Rectangle (window_x, window_y, 
+
+                Gdk.Rectangle box = new Gdk.Rectangle (window_x, window_y,
                     controls.Allocation.Width, controls.Allocation.Height);
-                
+
                 return box.Contains (cursor_x, cursor_y);
             }
         }
-     
+
 #endregion
-        
+
 #region Mouse Cursor Logic
 
         private const int CursorUpdatePositionDelay = 500;   // How long (ms) before the cursor position is updated
         private const int CursorHideDelay = 5000;            // How long (ms) to remain stationary before it hides
         private const int CursorShowMovementThreshold = 150; // How far (px) to move before it shows again
-        
+
         private uint hide_cursor_timeout_id;
         private uint cursor_update_position_timeout_id;
         private int hide_cursor_x;
         private int hide_cursor_y;
         private bool cursor_is_hidden = false;
-        
+
         protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt)
         {
             if (cursor_is_hidden) {
-                if (Math.Abs (hide_cursor_x - evnt.X) > CursorShowMovementThreshold || 
+                if (Math.Abs (hide_cursor_x - evnt.X) > CursorShowMovementThreshold ||
                     Math.Abs (hide_cursor_y - evnt.Y) > CursorShowMovementThreshold) {
                     ShowCursor ();
                     ShowControls ();
@@ -263,73 +263,73 @@ namespace Banshee.NowPlaying
                     if (cursor_update_position_timeout_id > 0) {
                         GLib.Source.Remove (cursor_update_position_timeout_id);
                     }
-                    
-                    cursor_update_position_timeout_id = GLib.Timeout.Add (CursorUpdatePositionDelay, 
+
+                    cursor_update_position_timeout_id = GLib.Timeout.Add (CursorUpdatePositionDelay,
                         OnCursorUpdatePositionTimeout);
-                }        
+                }
             } else if (!ControlsActive) {
                 if (hide_cursor_timeout_id > 0) {
                     GLib.Source.Remove (hide_cursor_timeout_id);
                 }
-                
+
                 hide_cursor_timeout_id = GLib.Timeout.Add (CursorHideDelay, OnHideCursorTimeout);
             }
-            
+
             return base.OnMotionNotifyEvent (evnt);
         }
-        
+
         private bool OnCursorUpdatePositionTimeout ()
         {
             UpdateHiddenCursorPosition ();
             cursor_update_position_timeout_id = 0;
             return false;
         }
-        
+
         private bool OnHideCursorTimeout ()
         {
             if (!ControlsActive) {
                 HideCursor ();
                 HideControls ();
             }
-            
+
             hide_cursor_timeout_id = 0;
             return false;
         }
-        
+
         private void UpdateHiddenCursorPosition ()
         {
             GetPointer (out hide_cursor_x, out hide_cursor_y);
         }
-        
+
         private void ShowCursor ()
         {
             cursor_is_hidden = false;
             GdkWindow.Cursor = null;
         }
-        
+
         private void HideCursor ()
         {
             if (GdkWindow == null) {
                 return;
             }
-            
+
             Gdk.Pixmap pixmap = Gdk.Pixmap.CreateBitmapFromData (GdkWindow, "0x0", 1, 1);
             if (pixmap == null) {
                 return;
             }
-            
+
             UpdateHiddenCursorPosition ();
             cursor_is_hidden = true;
-            
+
             Gdk.Color color = new Gdk.Color (0, 0, 0);
             Gdk.Cursor cursor = new Gdk.Cursor (pixmap, pixmap, color, color, 0, 0);
-            
+
             GdkWindow.Cursor = cursor;
-            
+
             pixmap.Dispose ();
-            cursor.Dispose ();  
+            cursor.Dispose ();
         }
-        
+
 #endregion
 
     }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
index 32d6c1a..0a14b5f 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingContents.cs
@@ -33,70 +33,74 @@ using Banshee.Gui.Widgets;
 
 namespace Banshee.NowPlaying
 {
-    public class NowPlayingContents : Table, IDisposable
+    public class NowPlayingContents : EventBox, IDisposable
     {
+        private Table table;
         private Widget video_display;
         private bool video_display_initial_shown = false;
-        
+
         private TrackInfoDisplay track_info_display;
-    
-        public NowPlayingContents () : base (1, 1, false)
+
+        public NowPlayingContents ()
         {
-            NoShowAll = true;
-        
+            VisibleWindow = false;
+            Child = table = new Table (1, 1, false) { Visible = true };
+
+            table.NoShowAll = true;
+
             video_display = new XOverlayVideoDisplay ();
 
             IVideoDisplay ivideo_display = video_display as IVideoDisplay;
             if (ivideo_display != null) {
                 ivideo_display.IdleStateChanged += OnVideoDisplayIdleStateChanged;
             }
-            
-            Attach (video_display, 0, 1, 0, 1, 
-                AttachOptions.Expand | AttachOptions.Fill, 
+
+            table.Attach (video_display, 0, 1, 0, 1,
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
-                
+
             track_info_display = new NowPlayingTrackInfoDisplay ();
-            Attach (track_info_display, 0, 1, 0, 1, 
-                AttachOptions.Expand | AttachOptions.Fill, 
+            table.Attach (track_info_display, 0, 1, 0, 1,
+                AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Expand | AttachOptions.Fill, 0, 0);
         }
-        
+
         public override void Dispose ()
         {
             IVideoDisplay ivideo_display = video_display as IVideoDisplay;
             if (ivideo_display != null) {
                 ivideo_display.IdleStateChanged -= OnVideoDisplayIdleStateChanged;
             }
-            
+
             if (video_display != null) {
                 video_display = null;
             }
-            
+
             base.Dispose ();
         }
-        
+
         protected override void OnShown ()
         {
             base.OnShown ();
-            
+
             // Ugly hack to ensure the video window is mapped/realized
             if (!video_display_initial_shown) {
                 video_display_initial_shown = true;
-                
+
                 if (video_display != null) {
                     video_display.Show ();
                 }
-                
-                GLib.Idle.Add (delegate { 
-                    CheckIdle (); 
+
+                GLib.Idle.Add (delegate {
+                    CheckIdle ();
                     return false;
                 });
                 return;
             }
-            
+
             CheckIdle ();
         }
-        
+
         protected override void OnHidden ()
         {
             base.OnHidden ();
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
index 2deaeac..a8e8966 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingInterface.cs
@@ -40,41 +40,50 @@ using Banshee.Sources.Gui;
 namespace Banshee.NowPlaying
 {
     public class NowPlayingInterface : VBox, ISourceContents
-    {   
+    {
         private NowPlayingSource source;
         private Hyena.Widgets.RoundedFrame frame;
         private Gtk.Window video_window;
         private FullscreenAdapter fullscreen_adapter;
         private ScreensaverManager screensaver;
         private NowPlayingContents contents;
-        
+
         public NowPlayingInterface ()
         {
             GtkElementsService service = ServiceManager.Get<GtkElementsService> ();
-            
+
             contents = new NowPlayingContents ();
-            
+            contents.ButtonPressEvent += (o, a) => {
+                if (a.Event.Type == Gdk.EventType.TwoButtonPress) {
+                    var iaservice = ServiceManager.Get<InterfaceActionService> ();
+                    var action = iaservice.ViewActions["FullScreenAction"] as Gtk.ToggleAction;
+                    if (action != null && action.Sensitive) {
+                        action.Active = !action.Active;
+                    }
+                }
+            };
+
             // This is my really sweet hack - it's where the video widget
             // is sent when the source is not active. This keeps the video
             // widget from being completely destroyed, causing problems with
             // its internal windowing and GstXOverlay. It's also conveniently
-            // the window that is used to do fullscreen video. Sweeeeeeeeeet. 
+            // the window that is used to do fullscreen video. Sweeeeeeeeeet.
             video_window = new FullscreenWindow (service.PrimaryWindow);
             video_window.Hidden += OnFullscreenWindowHidden;
             video_window.Realize ();
             video_window.Add (contents);
-            
+
             frame = new Hyena.Widgets.RoundedFrame ();
             frame.SetFillColor (new Cairo.Color (0, 0, 0));
             frame.DrawBorder = false;
             frame.Show ();
-            
+
             PackStart (frame, true, true, 0);
-            
+
             fullscreen_adapter = new FullscreenAdapter ();
             screensaver = new ScreensaverManager ();
         }
-        
+
         public override void Dispose ()
         {
             base.Dispose ();
@@ -88,7 +97,7 @@ namespace Banshee.NowPlaying
                 contents.Reparent (video_window);
             }
         }
-        
+
         private void MoveVideoInternal ()
         {
             if (contents.Parent != frame) {
@@ -96,13 +105,13 @@ namespace Banshee.NowPlaying
                 contents.Show ();
             }
         }
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
             MoveVideoInternal ();
         }
-        
+
         protected override void OnUnrealized ()
         {
             MoveVideoExternal (false);
@@ -125,12 +134,12 @@ namespace Banshee.NowPlaying
         internal void OverrideFullscreen ()
         {
             FullscreenHandler (false);
-            
-            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> (); 
+
+            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> ();
             if (service == null || service.ViewActions == null) {
                 return;
             }
-            
+
             previous_fullscreen_handler = service.ViewActions.Fullscreen;
             service.ViewActions.Fullscreen = FullscreenHandler;
             DisableFullscreenAction ();
@@ -139,15 +148,15 @@ namespace Banshee.NowPlaying
         internal void RelinquishFullscreen ()
         {
             FullscreenHandler (false);
-            
-            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> (); 
+
+            InterfaceActionService service = ServiceManager.Get<InterfaceActionService> ();
             if (service == null || service.ViewActions == null) {
                 return;
             }
-            
+
             service.ViewActions.Fullscreen = previous_fullscreen_handler;
         }
-        
+
         private void OnFullscreenWindowHidden (object o, EventArgs args)
         {
             MoveVideoInternal ();
@@ -168,11 +177,11 @@ namespace Banshee.NowPlaying
                 video_window.Hide ();
             }
         }
-        
+
 #endregion
-        
+
 #region ISourceContents
-        
+
         public bool SetSource (ISource src)
         {
             this.source = source as NowPlayingSource;
@@ -191,7 +200,7 @@ namespace Banshee.NowPlaying
         public Widget Widget {
             get { return this; }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs
index e34ddfe..d95eb81 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingSource.cs
@@ -44,23 +44,23 @@ namespace Banshee.NowPlaying
     {
         private TrackInfo transitioned_track;
         private NowPlayingInterface now_playing_interface;
-        
+
         public NowPlayingSource () : base ("now-playing", Catalog.GetString ("Now Playing"), 10, "now-playing")
         {
             now_playing_interface = new NowPlayingInterface ();
-        
+
             Properties.SetString ("Icon.Name", "applications-multimedia");
             Properties.Set<ISourceContents> ("Nereid.SourceContents", now_playing_interface);
             Properties.Set<bool> ("Nereid.SourceContents.HeaderVisible", false);
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
-            
+
             ServiceManager.SourceManager.AddSource (this);
-            
+
             ServiceManager.PlaybackController.Transition += OnPlaybackControllerTransition;
             ServiceManager.PlaybackController.TrackStarted += OnPlaybackControllerTrackStarted;
             ServiceManager.PlayerEngine.ConnectEvent (OnTrackInfoUpdated, PlayerEvent.TrackInfoUpdated);
         }
-        
+
         public void Dispose ()
         {
             ServiceManager.PlaybackController.Transition -= OnPlaybackControllerTransition;
@@ -73,26 +73,26 @@ namespace Banshee.NowPlaying
                 now_playing_interface = null;
             }
         }
-        
+
         private void OnTrackInfoUpdated (PlayerEventArgs args)
         {
             CheckForSwitch ();
         }
-        
+
         private void OnPlaybackControllerTrackStarted (object o, EventArgs args)
         {
             CheckForSwitch ();
         }
-        
+
         private void OnPlaybackControllerTransition (object o, EventArgs args)
         {
             transitioned_track = ServiceManager.PlaybackController.CurrentTrack;
         }
-        
+
         private void CheckForSwitch ()
         {
             TrackInfo current_track = ServiceManager.PlaybackController.CurrentTrack;
-            if (current_track != null && transitioned_track != current_track && 
+            if (current_track != null && transitioned_track != current_track &&
                 (current_track.MediaAttributes & TrackMediaAttributes.VideoStream) != 0) {
                 ServiceManager.SourceManager.SetActiveSource (this);
             }
@@ -101,7 +101,7 @@ namespace Banshee.NowPlaying
                 OnUserNotifyUpdated ();
             }
         }
-        
+
         public override void Activate ()
         {
             if (now_playing_interface != null) {
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingTrackInfoDisplay.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingTrackInfoDisplay.cs
index 92398b2..08bdd76 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingTrackInfoDisplay.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/NowPlayingTrackInfoDisplay.cs
@@ -41,15 +41,15 @@ namespace Banshee.NowPlaying
         private static Cairo.Color text_color = CairoExtensions.RgbToColor (0xffffff);
         private static Cairo.Color text_light_color = CairoExtensions.RgbToColor (0x777777);
         private static Gdk.Pixbuf idle_pixbuf;
-        
+
         public NowPlayingTrackInfoDisplay ()
         {
         }
-    
+
         protected NowPlayingTrackInfoDisplay (IntPtr native) : base (native)
         {
         }
-        
+
         protected override Cairo.Color BackgroundColor {
             get { return background_color; }
         }
@@ -61,23 +61,23 @@ namespace Banshee.NowPlaying
         protected override Cairo.Color TextLightColor {
             get { return text_light_color; }
         }
-        
+
         protected override bool CanRenderIdle {
             get { return true; }
         }
-        
+
         protected override void RenderIdle (Cairo.Context cr)
         {
             if (idle_pixbuf == null) {
                 idle_pixbuf = Gdk.Pixbuf.LoadFromResource ("idle-logo.png");
             }
-            
+
             if (idle_pixbuf == null) {
                 return;
             }
-            
+
             cr.Save ();
-            cr.Translate (Allocation.X + ((Allocation.Width - idle_pixbuf.Width) / 2), 
+            cr.Translate (Allocation.X + ((Allocation.Width - idle_pixbuf.Width) / 2),
                 Allocation.Y + ((Allocation.Height - idle_pixbuf.Height) / 2));
             Gdk.CairoHelper.SetSourcePixbuf (cr, idle_pixbuf, 0, 0);
             cr.Paint ();
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/OverlayWindow.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/OverlayWindow.cs
index 4f45e93..453588e 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/OverlayWindow.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/OverlayWindow.cs
@@ -1,4 +1,4 @@
-// 
+//
 // OverlayWindow.cs
 //
 // Authors:
@@ -37,50 +37,50 @@ namespace Banshee.NowPlaying
     public class OverlayWindow : Window
     {
         private Window toplevel;
-        
+
         private double x_align = 0.5;
         private double y_align = 1;
         private double width_scale;
         private bool composited;
-        
+
         public OverlayWindow (Window toplevel) : this (toplevel, 0.0)
         {
         }
-        
+
         public OverlayWindow (Window toplevel, double widthScale) : base (WindowType.Popup)
         {
             if (toplevel == null) {
                 throw new ArgumentNullException ("toplevel", "An overlay must have a parent window");
             }
-            
+
             if (width_scale < 0 || width_scale > 1) {
                 throw new ArgumentOutOfRangeException ("widthScale", "Must be between 0 and 1 inclusive");
             }
-        
+
             this.toplevel = toplevel;
             this.width_scale = widthScale;
-            
+
             Decorated = false;
             DestroyWithParent = true;
             AllowGrow = true;
             KeepAbove = true;
             TransientFor = toplevel;
-            
+
             toplevel.ConfigureEvent += OnToplevelConfigureEvent;
             toplevel.SizeAllocated += OnToplevelSizeAllocated;
         }
-        
+
         public bool CanHide {
             get { return false; }
         }
-        
+
         protected override void OnRealized ()
         {
             composited = CompositeUtils.IsComposited (Screen) && CompositeUtils.SetRgbaColormap (this);
             AppPaintable = composited;
-            
+
             base.OnRealized ();
-            
+
             ShapeWindow ();
             Relocate ();
         }
@@ -95,57 +95,57 @@ namespace Banshee.NowPlaying
         {
             return base.OnConfigureEvent (evnt);
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             if (Child != null) {
                 requisition = Child.SizeRequest ();
             }
-            
+
             if (width_scale > 0 && width_scale <= 1 && TransientFor != null) {
                 requisition.Width = (int)(TransientFor.Allocation.Width * width_scale);
             }
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             Relocate ();
             ShapeWindow ();
             QueueDraw ();
         }
-        
+
         private void OnToplevelConfigureEvent (object o, ConfigureEventArgs args)
         {
             Relocate ();
         }
-        
+
         private void OnToplevelSizeAllocated (object o, SizeAllocatedArgs args)
         {
             QueueResize ();
             Relocate ();
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (!composited || evnt.Window != GdkWindow) {
                 return base.OnExposeEvent (evnt);
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-            
+
             Gdk.Color color = Style.Background (State);
-            
+
             ShapeSurface (cr, new Cairo.Color (color.Red / (double) ushort.MaxValue,
-                color.Blue / (double) ushort.MaxValue, 
+                color.Blue / (double) ushort.MaxValue,
                 color.Green / (double) ushort.MaxValue,
                 0.85));
-            
+
             ((IDisposable)cr).Dispose ();
             return base.OnExposeEvent (evnt);
         }
-        
+
         protected virtual void ShapeSurface (Cairo.Context cr, Cairo.Color color)
         {
             cr.Operator = Cairo.Operator.Source;
@@ -158,29 +158,29 @@ namespace Banshee.NowPlaying
         private void ShapeWindow ()
         {
         }
-        
+
         private void Relocate ()
         {
             if (!IsRealized || !toplevel.IsRealized) {
                 return;
             }
-            
+
             int x, y;
-            
+
             toplevel.GdkWindow.GetOrigin (out x, out y);
-            
+
             int x_origin = x;
             int y_origin = y;
-            
+
             x += (int)(toplevel.Allocation.Width * x_align);
             y += (int)(toplevel.Allocation.Height * y_align);
-            
+
             x -= (int)(Allocation.Width * 0.5);
             y -= (int)(Allocation.Height * 0.5);
-            
+
             x = Math.Max (0, Math.Min (x, x_origin + toplevel.Allocation.Width - Allocation.Width));
             y = Math.Max (0, Math.Min (y, y_origin + toplevel.Allocation.Height - Allocation.Height));
-            
+
             Move (x, y);
         }
     }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/VideoDisplay.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/VideoDisplay.cs
index 050d513..3c5e1c8 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/VideoDisplay.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/VideoDisplay.cs
@@ -34,13 +34,13 @@ using Banshee.ServiceStack;
 using Banshee.Collection;
 
 namespace Banshee.NowPlaying
-{   
+{
     public abstract class VideoDisplay : Gtk.Widget, IVideoDisplay
     {
         private bool is_idle = true;
-        
+
         public event EventHandler IdleStateChanged;
-        
+
         public bool IsIdle {
             get { return is_idle; }
         }
@@ -50,50 +50,50 @@ namespace Banshee.NowPlaying
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent,
                 PlayerEvent.StartOfStream |
                 PlayerEvent.EndOfStream);
-            
+
             ToggleIdleVisibility ();
         }
 
         protected abstract Gdk.Window RenderWindow { get; }
-        
+
         protected abstract void ExposeVideo (Gdk.EventExpose evnt);
-        
+
         protected override void OnDestroyed ()
         {
             base.OnDestroyed ();
             ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
-            RenderWindow.DrawRectangle (Style.BlackGC, true, 
+            RenderWindow.DrawRectangle (Style.BlackGC, true,
                 new Gdk.Rectangle (0, 0, Allocation.Width, Allocation.Height));
-            
+
             if (RenderWindow == null || !RenderWindow.IsVisible) {
                 return true;
             }
-            
+
             if (!is_idle && ServiceManager.PlayerEngine.VideoDisplayContextType != VideoDisplayContextType.Unsupported) {
                 ExposeVideo (evnt);
             }
-            
+
             return true;
         }
-        
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             ToggleIdleVisibility ();
         }
-        
+
         private void ToggleIdleVisibility ()
         {
             TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
             is_idle = track == null || (track.MediaAttributes & TrackMediaAttributes.VideoStream) == 0;
             QueueDraw ();
-            
+
             OnIdleStateChanged ();
         }
-        
+
         protected virtual void OnIdleStateChanged ()
         {
             EventHandler handler = IdleStateChanged;
@@ -101,7 +101,7 @@ namespace Banshee.NowPlaying
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public new void QueueDraw ()
         {
             base.QueueDraw ();
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
index 521bed4..b0a4a87 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
@@ -33,10 +33,10 @@ using Banshee.ServiceStack;
 using Banshee.MediaEngine;
 
 namespace Banshee.NowPlaying
-{   
+{
     public class XOverlayVideoDisplay : VideoDisplay
     {
-        private Gdk.Window video_window;                
+        private Gdk.Window video_window;
         protected override Gdk.Window RenderWindow {
             get { return video_window; }
         }
@@ -45,20 +45,20 @@ namespace Banshee.NowPlaying
         {
             WidgetFlags = WidgetFlags.NoWindow;
         }
-        
+
         protected override void OnRealized ()
         {
             WidgetFlags |= WidgetFlags.Realized;
-            
+
             GdkWindow = Parent.GdkWindow;
-            
+
             if (video_window != null) {
                 video_window.Reparent (GdkWindow, 0, 0);
                 video_window.MoveResize (Allocation.X, Allocation.Y, Allocation.Width, Allocation.Height);
                 video_window.ShowUnraised ();
                 return;
             }
-            
+
             Gdk.WindowAttr attributes = new Gdk.WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
             attributes.X = 0;
@@ -69,30 +69,30 @@ namespace Banshee.NowPlaying
             attributes.Wclass = Gdk.WindowClass.InputOutput;
             attributes.Colormap = Colormap;
             attributes.EventMask = (int)(Gdk.EventMask.ExposureMask | Gdk.EventMask.VisibilityNotifyMask);
-            
-            Gdk.WindowAttributesType attributes_mask = 
-                Gdk.WindowAttributesType.X | 
-                Gdk.WindowAttributesType.Y | 
-                Gdk.WindowAttributesType.Visual | 
+
+            Gdk.WindowAttributesType attributes_mask =
+                Gdk.WindowAttributesType.X |
+                Gdk.WindowAttributesType.Y |
+                Gdk.WindowAttributesType.Visual |
                 Gdk.WindowAttributesType.Colormap;
-                
+
             video_window = new Gdk.Window (GdkWindow, attributes, attributes_mask);
             video_window.UserData = Handle;
-                        
+
             video_window.SetBackPixmap (null, false);
-            
+
             if (ServiceManager.PlayerEngine.VideoDisplayContextType == VideoDisplayContextType.GdkWindow) {
                 ServiceManager.PlayerEngine.VideoDisplayContext = video_window.Handle;
             } else {
                 ServiceManager.PlayerEngine.VideoDisplayContext = IntPtr.Zero;
             }
         }
-        
+
         protected override void OnUnrealized ()
         {
             video_window.Hide ();
             video_window.Reparent (null, 0, 0);
-            
+
             base.OnUnrealized ();
         }
 
@@ -101,36 +101,36 @@ namespace Banshee.NowPlaying
             base.OnMapped ();
             video_window.ShowUnraised ();
         }
-        
+
         protected override void OnUnmapped ()
         {
             video_window.Hide ();
             base.OnUnmapped ();
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             if (!IsRealized) {
                 return;
             }
-            
+
             Gdk.Rectangle rect = new Gdk.Rectangle (allocation.X, allocation.Y, allocation.Width, allocation.Height);
             video_window.MoveResize (rect);
-            
+
             base.OnSizeAllocated (allocation);
-            
+
             QueueDraw ();
         }
-        
+
         protected override bool OnConfigureEvent (Gdk.EventConfigure evnt)
         {
             if (video_window != null && ServiceManager.PlayerEngine.VideoDisplayContextType == VideoDisplayContextType.GdkWindow) {
                 ServiceManager.PlayerEngine.VideoExpose (video_window.Handle, true);
             }
-            
+
             return false;
         }
-        
+
         protected override void ExposeVideo (Gdk.EventExpose evnt)
         {
             if (ServiceManager.PlayerEngine.VideoDisplayContextType == VideoDisplayContextType.GdkWindow) {
diff --git a/src/Extensions/Banshee.NowPlaying/Makefile.am b/src/Extensions/Banshee.NowPlaying/Makefile.am
index d5b0a7d..8cb50c9 100644
--- a/src/Extensions/Banshee.NowPlaying/Makefile.am
+++ b/src/Extensions/Banshee.NowPlaying/Makefile.am
@@ -24,6 +24,3 @@ RESOURCES =  \
 
 include $(top_srcdir)/build/build.mk
 
-module_SCRIPTS += Banshee.NowPlaying.dll.config
-EXTRA_DIST += Banshee.NowPlaying.dll.config
-
diff --git a/src/Extensions/Banshee.NowPlaying/Makefile.in b/src/Extensions/Banshee.NowPlaying/Makefile.in
index 2f25c10..07413c9 100644
--- a/src/Extensions/Banshee.NowPlaying/Makefile.in
+++ b/src/Extensions/Banshee.NowPlaying/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -385,6 +394,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -488,11 +498,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -510,6 +521,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -539,6 +551,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -546,9 +559,8 @@ OUTPUT_FILES = \
 	$(ASSEMBLY_FILE).mdb
 
 moduledir = $(INSTALL_DIR_RESOLVED)
-module_SCRIPTS = $(OUTPUT_FILES) Banshee.NowPlaying.dll.config
-EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \
-	$(THEME_ICONS_SOURCE) Banshee.NowPlaying.dll.config
+module_SCRIPTS = $(OUTPUT_FILES)
+EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE)
 CLEANFILES = $(OUTPUT_FILES)
 DISTCLEANFILES = *.pidb
 MAINTAINERCLEANFILES = Makefile.in
@@ -559,14 +571,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.NowPlaying/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.NowPlaying/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.NowPlaying/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.NowPlaying/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -584,25 +596,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -632,13 +660,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -670,6 +702,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -690,6 +723,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -698,18 +733,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -770,7 +815,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -787,6 +832,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs
index 96e6e63..65db812 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/HeaderWidget.cs
@@ -32,6 +32,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 
+using Hyena;
 using Banshee.PlaybackController;
 using Banshee.Sources;
 
@@ -39,8 +40,8 @@ namespace Banshee.PlayQueue
 {
     public class HeaderWidget : HBox
     {
-        public event EventHandler<ModeChangedEventArgs> ModeChanged;
-        public event EventHandler<SourceChangedEventArgs> SourceChanged;
+        public event EventHandler<EventArgs<PlaybackShuffleMode>> ModeChanged;
+        public event EventHandler<EventArgs<DatabaseSource>> SourceChanged;
 
         private readonly List<Widget> sensitive_widgets = new List<Widget> ();
         private readonly Dictionary<string, PlaybackShuffleMode> modes = new Dictionary<string, PlaybackShuffleMode> {
@@ -66,7 +67,7 @@ namespace Banshee.PlayQueue
                 }
                 var handler = ModeChanged;
                 if (handler != null) {
-                    handler (this, new ModeChangedEventArgs (value));
+                    handler (this, new EventArgs<PlaybackShuffleMode> (value));
                 }
             };
 
@@ -78,7 +79,7 @@ namespace Banshee.PlayQueue
             source_combo_box.Changed += delegate {
                 var handler = SourceChanged;
                 if (handler != null) {
-                    handler (this, new SourceChangedEventArgs (source_combo_box.Source));
+                    handler (this, new EventArgs<DatabaseSource> (source_combo_box.Source));
                 }
             };
 
@@ -97,32 +98,4 @@ namespace Banshee.PlayQueue
             });
         }
     }
-
-    public sealed class ModeChangedEventArgs : EventArgs
-    {
-        private PlaybackShuffleMode value;
-
-        public ModeChangedEventArgs (PlaybackShuffleMode value)
-        {
-            this.value = value;
-        }
-
-        public PlaybackShuffleMode Value {
-            get { return this.value; }
-        }
-    }
-
-    public sealed class SourceChangedEventArgs : EventArgs
-    {
-        private ITrackModelSource value;
-
-        public SourceChangedEventArgs (ITrackModelSource value)
-        {
-            this.value = value;
-        }
-
-        public ITrackModelSource Value {
-            get { return this.value; }
-        }
-    }
 }
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs
index cac9f62..d806650 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueActions.cs
@@ -71,14 +71,14 @@ namespace Banshee.PlayQueue
                     Catalog.GetString ("Remove all tracks from the play queue"),
                     OnClearPlayQueue)
             );
-            
+
             Add (new ToggleActionEntry [] {
                 new ToggleActionEntry ("ClearPlayQueueOnQuitAction", null,
-                    Catalog.GetString ("Clear on Quit"), null, 
-                    Catalog.GetString ("Clear the play queue when quitting"), 
+                    Catalog.GetString ("Clear on Quit"), null,
+                    Catalog.GetString ("Clear the play queue when quitting"),
                     OnClearPlayQueueOnQuit, PlayQueueSource.ClearOnQuitSchema.Get ())
             });
-            
+
             AddUiFromFile ("GlobalUI.xml");
 
             playqueue.Updated += OnUpdated;
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
index aa48a36..85013fe 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
@@ -34,6 +34,7 @@ using System.Linq;
 
 using Mono.Unix;
 
+using Hyena;
 using Hyena.Collections;
 using Hyena.Data.Sqlite;
 
@@ -58,7 +59,8 @@ namespace Banshee.PlayQueue
 
         private ITrackModelSource prior_playback_source;
         private DatabaseTrackInfo current_track;
-        private long offset;
+        private Shuffler shuffler;
+        private long offset = -1;
         private TrackInfo prior_playback_track;
         private PlayQueueActions actions;
         private bool was_playing = false;
@@ -70,17 +72,17 @@ namespace Banshee.PlayQueue
 
         private PlaybackShuffleMode populate_mode = (PlaybackShuffleMode) PopulateModeSchema.Get ();
         private string populate_from_name = PopulateFromSchema.Get ();
-        private ITrackModelSource populate_from = null;
+        private DatabaseSource populate_from = null;
         private int played_songs_number = PlayedSongsNumberSchema.Get ();
         private int upcoming_songs_number = UpcomingSongsNumberSchema.Get ();
-        
+
         public PlayQueueSource () : base (Catalog.GetString ("Play Queue"), null)
         {
             BindToDatabase ();
             TypeUniqueId = DbId.ToString ();
             Initialize ();
             AfterInitialized ();
-            
+
             Order = 20;
             Properties.SetString ("Icon.Name", "source-playlist");
             Properties.SetString ("RemoveTracksActionLabel", Catalog.GetString ("Remove From Play Queue"));
@@ -92,11 +94,11 @@ namespace Banshee.PlayQueue
             ServiceManager.PlaybackController.TrackStarted += OnTrackStarted;
 
             ServiceManager.SourceManager.AddSource (this);
-            
+
             // TODO change this Gtk.Action code so that the actions can be removed.  And so this
             // class doesn't depend on Gtk/ThickClient.
             actions = new PlayQueueActions (this);
-            
+
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.SetString ("GtkActionPath", "/PlayQueueContextMenu");
 
@@ -105,16 +107,21 @@ namespace Banshee.PlayQueue
             ServiceManager.SourceManager.MusicLibrary.TracksDeleted += HandleTracksDeleted;
             ServiceManager.SourceManager.VideoLibrary.TracksChanged += HandleTracksChanged;
             ServiceManager.SourceManager.VideoLibrary.TracksDeleted += HandleTracksDeleted;
-            
+
             populate_from = ServiceManager.SourceManager.Sources.FirstOrDefault (
-                source => source.Name == populate_from_name) as ITrackModelSource;
+                source => source.Name == populate_from_name) as DatabaseSource;
             if (populate_from != null) {
                 populate_from.Reload ();
             }
 
             TrackModel.Reloaded += HandleReloaded;
 
-            Offset = CurrentOffsetSchema.Get ();
+            Offset = Math.Min (
+                CurrentOffsetSchema.Get (),
+                ServiceManager.DbConnection.Query<long> (@"
+                    SELECT MAX(ViewOrder)
+                    FROM CorePlaylistEntries
+                    WHERE PlaylistID = ?", DbId));
         }
 
         protected override void Initialize ()
@@ -125,20 +132,22 @@ namespace Banshee.PlayQueue
             header_widget = CreateHeaderWidget ();
             header_widget.ShowAll ();
 
+            shuffler = new Shuffler (UniqueId);
+
             Properties.Set<Gtk.Widget> ("Nereid.SourceContents.HeaderWidget", header_widget);
         }
-        
+
         public HeaderWidget CreateHeaderWidget ()
         {
             var header_widget = new HeaderWidget (populate_mode, populate_from_name);
-            header_widget.ModeChanged += delegate (object sender, ModeChangedEventArgs e) {
+            header_widget.ModeChanged += delegate (object sender, EventArgs<PlaybackShuffleMode> e) {
                 populate_mode = e.Value;
                 PopulateModeSchema.Set ((int) e.Value);
                 UpdatePlayQueue ();
                 OnUpdated ();
             };
 
-            header_widget.SourceChanged += delegate (object sender, SourceChangedEventArgs e) {
+            header_widget.SourceChanged += delegate (object sender, EventArgs<DatabaseSource> e) {
                 populate_from = e.Value;
                 if (populate_from == null) {
                     populate_from_name = String.Empty;
@@ -167,7 +176,7 @@ namespace Banshee.PlayQueue
         {
             EnqueueId (DatabaseTrackInfo.GetTrackIdForUri (uri), prepend, false);
         }
-        
+
         public void EnqueueTrack (TrackInfo track, bool prepend)
         {
             DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
@@ -177,7 +186,7 @@ namespace Banshee.PlayQueue
                 EnqueueUri (track.Uri.AbsoluteUri, prepend);
             }
         }
-        
+
         private void EnqueueId (int trackId, bool prepend, bool generated)
         {
             if (trackId <= 0) {
@@ -229,11 +238,11 @@ namespace Banshee.PlayQueue
             OnTracksAdded ();
             NotifyUser ();
         }
-        
+
         IDBusExportable IDBusExportable.Parent {
             get { return ServiceManager.SourceManager; }
         }
-        
+
         string IService.ServiceName {
             get { return "PlayQueue"; }
         }
@@ -297,6 +306,7 @@ namespace Banshee.PlayQueue
                 // mark the first added track as current.
                 if (index != -1 && view_order == current_view_order) {
                     SetCurrentTrack (TrackModel[index] as DatabaseTrackInfo);
+                    SetAsPlaybackSourceUnlessPlaying ();
                 }
                 return true;
             }
@@ -306,8 +316,25 @@ namespace Banshee.PlayQueue
         private void SetAsPlaybackSourceUnlessPlaying ()
         {
             if (current_track != null && ServiceManager.PlaybackController.Source != this) {
-                PriorSource = ServiceManager.PlaybackController.Source;
-                ServiceManager.PlaybackController.NextSource = this;
+                bool set_source = !ServiceManager.PlayerEngine.IsPlaying ();
+                if (!set_source) {
+                    long view_order = ServiceManager.DbConnection.Query<long> (@"
+                        SELECT ViewOrder
+                        FROM CorePlaylistEntries
+                        WHERE PlaylistID = ? AND EntryID = ?",
+                        DbId, Convert.ToInt64 (current_track.CacheEntryId));
+                    long nongenerated = ServiceManager.DbConnection.Query<long> (@"
+                        SELECT COUNT(*)
+                        FROM CorePlaylistEntries
+                        WHERE PlaylistID = ? AND ViewOrder >= ? AND Generated = 0",
+                        DbId, view_order);
+                    set_source = nongenerated > 0;
+                }
+
+                if (set_source) {
+                    PriorSource = ServiceManager.PlaybackController.Source;
+                    ServiceManager.PlaybackController.NextSource = this;
+                }
             }
         }
 
@@ -352,14 +379,14 @@ namespace Banshee.PlayQueue
                 Clear ();
             }
         }
-        
+
         private void BindToDatabase ()
         {
             int result = ServiceManager.DbConnection.Query<int> (
                 "SELECT PlaylistID FROM CorePlaylists WHERE Special = 1 AND Name = ? LIMIT 1",
                 special_playlist_name
             );
-            
+
             if (result != 0) {
                 DbId = result;
             } else {
@@ -455,6 +482,12 @@ namespace Banshee.PlayQueue
                         ServiceManager.PlaybackController.StopWhenFinished = true;
                     }
                 }
+                if (ServiceManager.PlaybackController.StopWhenFinished) {
+                    if (current_track != null && ServiceManager.PlayerEngine.CurrentTrack == current_track) {
+                        int index = TrackModel.IndexOf (current_track) + 1;
+                        SetCurrentTrack (index < Count ? TrackModel[index] as DatabaseTrackInfo : null);
+                    }
+                }
             } else if (args.Event == PlayerEvent.StartOfStream) {
                 if (TrackModel.IndexOf (ServiceManager.PlayerEngine.CurrentTrack) != -1) {
                     SetCurrentTrack (ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo);
@@ -488,7 +521,7 @@ namespace Banshee.PlayQueue
         {
             return ((IBasicPlaybackController)this).Next (false);
         }
-        
+
         bool IBasicPlaybackController.Next (bool restart)
         {
             if (current_track != null && ServiceManager.PlayerEngine.CurrentTrack == current_track) {
@@ -510,7 +543,7 @@ namespace Banshee.PlayQueue
             ServiceManager.PlayerEngine.OpenPlay (current_track);
             return true;
         }
-        
+
         bool IBasicPlaybackController.Previous (bool restart)
         {
             if (current_track != null && ServiceManager.PlayerEngine.CurrentTrack == current_track) {
@@ -522,7 +555,7 @@ namespace Banshee.PlayQueue
             }
             return true;
         }
-        
+
         private void UpdatePlayQueue ()
         {
             // Find the ViewOrder of the current_track.
@@ -568,17 +601,11 @@ namespace Banshee.PlayQueue
                 // Add songs from the selected source, skip if all tracks need to be populated.
                 bool skip = tracks_to_add == upcoming_songs_number;
                 for (int i = 0; i < tracks_to_add; i++) {
-                    var track = populate_from.TrackModel.GetRandom (
-                        source_set_at, populate_mode, false, skip && i == 0) as DatabaseTrackInfo;
+
+                    var track = populate_from.DatabaseTrackModel.GetRandom (
+                        source_set_at, populate_mode, false, skip && i == 0, shuffler) as DatabaseTrackInfo;
+
                     if (track != null) {
-                        track.LastPlayed = DateTime.Now;
-                        // track.Save() is quite slow, update LastPlayedStamp directly in the database.
-                        ServiceManager.DbConnection.Execute (@"
-                            UPDATE CoreTracks
-                            SET LastPlayedStamp = ?
-                            WHERE TrackID = ?",
-                            Hyena.DateTimeUtil.ToTimeT (track.LastPlayed), track.TrackId
-                        );
                         EnqueueId (track.TrackId, false, true);
                     }
                 }
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
index 1ae0725..756af51 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
@@ -63,6 +63,23 @@ namespace Banshee.PlayQueue
             store.Refresh ();
 
             SetActiveSource (source_name);
+
+            HasTooltip = true;
+            QueryTooltip += HandleQueryTooltip;
+        }
+
+        private void HandleQueryTooltip (object o, QueryTooltipArgs args)
+        {
+            var source = Source;
+            if (source != null && Child.Allocation.Width < Child.Requisition.Width) {
+                args.Tooltip.Text = source.Name;
+                args.RetVal = true;
+            }
+
+            // Work around ref counting SIGSEGV, see http://bugzilla.gnome.org/show_bug.cgi?id=478519#c9
+            if (args.Tooltip != null) {
+                args.Tooltip.Dispose ();
+            }
         }
 
         private void SetActiveSource (string name)
@@ -103,11 +120,11 @@ namespace Banshee.PlayQueue
             return TreeIter.Zero;
         }
 
-        public ITrackModelSource Source {
+        public DatabaseSource Source {
             get {
                 TreeIter iter;
                 if (GetActiveIter (out iter)) {
-                    return filter.GetValue(iter, 0) as ITrackModelSource;
+                    return filter.GetValue(iter, 0) as DatabaseSource;
                 }
                 return null;
             }
diff --git a/src/Extensions/Banshee.PlayQueue/Makefile.in b/src/Extensions/Banshee.PlayQueue/Makefile.in
index fafcb20..973acc4 100644
--- a/src/Extensions/Banshee.PlayQueue/Makefile.in
+++ b/src/Extensions/Banshee.PlayQueue/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -379,6 +388,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -482,11 +492,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -504,6 +515,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -533,6 +545,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -552,14 +565,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.PlayQueue/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.PlayQueue/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.PlayQueue/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.PlayQueue/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -577,25 +590,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -625,13 +654,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -663,6 +696,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -683,6 +717,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -691,18 +727,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -763,7 +809,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -780,6 +826,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration.addin.xml b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration.addin.xml
index 04087ff..1002c00 100644
--- a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration.addin.xml
+++ b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration.addin.xml
@@ -4,10 +4,10 @@
     version="1.0"
     compatVersion="1.0"
     copyright="Licensed under the MIT X11 license."
-    name="Importers for Amarok and Rhythmbox"
+    name="Importers for Amarok, Rhythmbox and iTunes"
     category="Core"
-    description="Import your Amarok or Rhythmbox music library"
-    author="Paul Lange, Sebastian Dröge"
+    description="Import your Amarok, Rhythmbox or iTunes music library"
+    author="Paul Lange, Sebastian Dröge, Scott Peterson, Alexander Kojevnikov"
     url="http://banshee-project.org/"
     defaultEnabled="true">
 
@@ -18,6 +18,7 @@
   <Extension path="/Banshee/Library/ImportSource">
     <ImportSource class="Banshee.PlayerMigration.RhythmboxPlayerImportSource"/>
     <ImportSource class="Banshee.PlayerMigration.AmarokPlayerImportSource"/>
+    <ImportSource class="Banshee.PlayerMigration.ItunesPlayerImportSource"/>
   </Extension>
 
 </Addin>
diff --git a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
index 89c7e87..417fa20 100644
--- a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
+++ b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
@@ -58,7 +58,7 @@ namespace Banshee.PlayerMigration
                     "Unable to open Amarok database: {0}", e.Message));
                 return;
             }
-            
+
             int count = 0;
             try {
                 count = conn.Query<int> ("SELECT COUNT(*) FROM tags");
@@ -86,7 +86,7 @@ namespace Banshee.PlayerMigration
                        AND tags.genre = genre.id
                        AND tags.year = year.id"
                 );
-                
+
                 HyenaSqliteCommand stats_cmd = new HyenaSqliteCommand (@"
                                                      SELECT DISTINCT (rating+rating%2)/2, playcounter, createdate, accessdate
                                                      FROM   statistics
@@ -103,7 +103,7 @@ namespace Banshee.PlayerMigration
 
                      try {
                          string path = (string) reader[1];
-                         
+
                          SafeUri uri = null;
                          if (path.StartsWith ("./")) {
                              uri = new SafeUri (path.Substring (1));
@@ -116,7 +116,7 @@ namespace Banshee.PlayerMigration
                          string title = (string) reader[2];
                          string artist = (string) reader[3];
                          //Console.WriteLine ("Amarok import has {0}/{1} - {2}", artist, title, uri);
-                         
+
                          // the following fields are not critical and can be skipped if something goes wrong
                          int rating = 0, playcount = 0;
                          long created = 0, accessed = 0;
@@ -135,14 +135,14 @@ namespace Banshee.PlayerMigration
                          } catch (Exception) {}
 
                          UpdateUserJob (processed, count, artist, title);
-                     
+
                          try {
                              DatabaseTrackInfo track = import_manager.ImportTrack (uri);
-                            
+
                              if (track == null) {
                                  throw new Exception (String.Format (Catalog.GetString ("Unable to import track: {0}"), uri.AbsoluteUri));
                              }
-                            
+
                              if (rating > 0 || playcount > 0 || created > 0 || accessed > 0) {
                                  track.Rating = rating;
                                  track.PlayCount = playcount;
@@ -162,7 +162,7 @@ namespace Banshee.PlayerMigration
                  }
                  reader.Close ();
                  import_manager.NotifyAllSources ();
-                 
+
                  // TODO migrating more than the podcast subscriptions (eg whether to auto sync them etc) means 1) we need to have those features
                  // and 2) we need to depend on Migo and/or the Podcast extension
                  DBusCommandService cmd_service = ServiceManager.Get<DBusCommandService> ();
@@ -171,7 +171,7 @@ namespace Banshee.PlayerMigration
                          cmd_service.PushFile (podcast_url.Replace ("http:", "feed:"));
                      }
                  }
-                 
+
             } catch (Exception e) {
                 Hyena.Log.Exception (e);
                 LogError (amarok_db_path, Catalog.GetString ("Importing from Amarok failed"));
@@ -179,11 +179,11 @@ namespace Banshee.PlayerMigration
                 conn.Dispose ();
             }
         }
-        
+
         public override bool CanImport {
             get { return Banshee.IO.File.Exists (new SafeUri (amarok_db_path)); }
         }
-        
+
         public override string Name {
             get { return Catalog.GetString ("Amarok"); }
         }
@@ -191,7 +191,7 @@ namespace Banshee.PlayerMigration
         public override string [] IconNames {
             get { return new string [] { "system-search" }; }
         }
-        
+
         public override int SortOrder {
             get { return 40; }
         }
diff --git a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs
new file mode 100644
index 0000000..2d25d26
--- /dev/null
+++ b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs
@@ -0,0 +1,217 @@
+//
+// ItunesPlayerImportDialogs.cs
+//
+// Author:
+//   Scott Peterson <lunchtimemama at gmail.com>
+//
+// Copyright (C) 2007 Scott Peterson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using Gtk;
+using Mono.Unix;
+
+using Banshee.Base;
+
+namespace Banshee.PlayerMigration
+{
+    public class ItunesImportDialog : Dialog
+    {
+        private string library_uri;
+        protected readonly Button import_button;
+        protected readonly CheckButton ratings;
+        protected readonly CheckButton stats;
+        protected readonly CheckButton playlists;
+
+        public string LibraryUri
+        {
+            get { return library_uri; }
+        }
+
+        public bool Ratings
+        {
+            get { return ratings.Active; }
+        }
+        public bool Stats
+        {
+            get { return stats.Active; }
+        }
+        public bool Playliststs
+        {
+            get { return playlists.Active; }
+        }
+
+        public ItunesImportDialog () : base ()
+        {
+            // TODO add Help button and dialog/tooltip
+
+            Title = Catalog.GetString ("iTunes Importer");
+            Resizable = false;
+            VBox.BorderWidth = 8;
+            VBox.Spacing = 8;
+
+            Button cancel_button = new Button (Stock.Cancel);
+            cancel_button.Clicked += delegate { Respond (ResponseType.Cancel); };
+            cancel_button.ShowAll ();
+            AddActionWidget (cancel_button, ResponseType.Cancel);
+            cancel_button.CanDefault = true;
+            cancel_button.GrabFocus ();
+            DefaultResponse = ResponseType.Cancel;
+
+            import_button = new Button ();
+            import_button.Label = Catalog.GetString ("_Import");
+            import_button.UseUnderline = true;
+            import_button.Image = Image.NewFromIconName (Stock.Open, IconSize.Button);
+            import_button.Clicked += delegate { Respond (ResponseType.Ok); };
+            import_button.ShowAll ();
+            AddActionWidget (import_button, ResponseType.Ok);
+
+            VBox vbox = new VBox ();
+            ratings = new CheckButton (Catalog.GetString ("Import song ratings"));
+            ratings.Active = true;
+            vbox.PackStart (ratings);
+            stats = new CheckButton (Catalog.GetString ("Import play statistics (playcount, etc.)"));
+            stats.Active = true;
+            vbox.PackStart (stats);
+            playlists = new CheckButton (Catalog.GetString ("Import playlists"));
+            playlists.Active = true;
+            vbox.PackStart (playlists);
+
+            PackCheckboxes (vbox);
+
+            VBox.ShowAll ();
+        }
+
+        protected virtual void PackCheckboxes (VBox vbox)
+        {
+            string possible_location = System.IO.Path.Combine (System.IO.Path.Combine(
+                Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "iTunes"),
+                ItunesPlayerImportSource.LibraryFilename);
+
+            if (Banshee.IO.File.Exists (new SafeUri (possible_location))) {
+                library_uri = possible_location;
+            } else {
+                HBox hbox = new HBox ();
+                hbox.Spacing = 8;
+                Image image = new Image (IconTheme.Default.LoadIcon ("gtk-open", 18, 0));
+                hbox.PackStart (image);
+                Label label1 = new Label ();
+                label1.Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText(
+                    String.Format( Catalog.GetString (@"Locate your ""{0}"" file..."),
+                    ItunesPlayerImportSource.LibraryFilename)));
+                label1.SetAlignment (0.0f, 0.5f);
+                hbox.PackStart (label1);
+                Button browse_button = new Button (hbox);
+                browse_button.Clicked += OnBrowseButtonClicked;
+                VBox.PackStart (browse_button);
+
+                ratings.Sensitive = stats.Sensitive = playlists.Sensitive = import_button.Sensitive = false;
+            }
+
+            VBox.PackStart (vbox);
+        }
+
+        private void OnBrowseButtonClicked (object o, EventArgs args)
+        {
+            Button browse_button = o as Button;
+            using(FileChooserDialog file_chooser = new FileChooserDialog(
+                String.Format (Catalog.GetString (@"Locate ""{0}"""), ItunesPlayerImportSource.LibraryFilename),
+                this, FileChooserAction.Open,
+                Stock.Cancel, ResponseType.Cancel,
+                Stock.Open, ResponseType.Ok)) {
+
+                FileFilter filter = new FileFilter ();
+                filter.AddPattern ("*" + ItunesPlayerImportSource.LibraryFilename);
+                filter.Name = ItunesPlayerImportSource.LibraryFilename;
+                file_chooser.AddFilter (filter);
+                if (file_chooser.Run () == (int)ResponseType.Ok) {
+                    browse_button.Sensitive = false;
+                    ratings.Sensitive = stats.Sensitive = playlists.Sensitive = import_button.Sensitive = true;
+                    library_uri = file_chooser.Filename;
+                }
+                file_chooser.Destroy ();
+            }
+        }
+    }
+
+    public class ItunesMusicDirectoryDialog : Dialog
+    {
+        private FileChooserWidget chooser;
+
+        public string UserMusicDirectory {
+            get { return chooser.Filename; }
+        }
+
+        public ItunesMusicDirectoryDialog (string itunes_music_directory) : base ()
+        {
+            Title = Catalog.GetString ("Locate iTunes Music Directory");
+            HeightRequest = 650;
+            WidthRequest = 814;
+
+            Button cancel_button = new Button (Stock.Cancel);
+            cancel_button.Clicked += delegate { Respond (ResponseType.Cancel); };
+            cancel_button.ShowAll ();
+            AddActionWidget (cancel_button, ResponseType.Cancel);
+            cancel_button.CanDefault = true;
+            cancel_button.GrabFocus ();
+
+            Button ok_button = new Button (Stock.Ok);
+            ok_button.Clicked += delegate { Respond (ResponseType.Ok); };
+            ok_button.ShowAll ();
+            AddActionWidget (ok_button, ResponseType.Ok);
+
+            VBox vbox = new VBox ();
+            vbox.BorderWidth = 8;
+            vbox.Spacing = 10;
+
+            HBox hbox = new HBox ();
+            hbox.Spacing = 10;
+
+            Image image = new Image (Stock.DialogWarning, IconSize.Dialog);
+            hbox.PackStart (image, false, true, 0);
+
+            Label message = new Label ();
+            message.Markup = String.Format ("<b>{0}</b>", GLib.Markup.EscapeText(
+                String.Format (Catalog.GetString(
+                    "The iTunes library refers to your music directory as \"{0}\" but " +
+                    "Banshee was not able to infer the location of this directory. Please locate it."),
+                itunes_music_directory)));
+            message.Justify = Justification.Left;
+            message.WidthRequest = 750;
+            message.LineWrap = true;
+            hbox.PackStart (message, true, true, 0);
+
+            vbox.PackStart (hbox, false, true, 0);
+
+            chooser = new FileChooserWidget (FileChooserAction.SelectFolder);
+            chooser.ShowAll ();
+            vbox.PackStart (chooser, true, true, 0);
+
+            VBox.PackStart (vbox);
+
+            DefaultResponse = ResponseType.Cancel;
+
+            VBox.ShowAll ();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs
new file mode 100644
index 0000000..39bd1ef
--- /dev/null
+++ b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/ItunesPlayerImportSource.cs
@@ -0,0 +1,818 @@
+//
+// ItunesPlayerImportSource.cs
+//
+// Authors:
+//   Scott Peterson <lunchtimemama at gmail.com>
+//   Alexander Kojevnikov <alexander at kojevnikov.com>
+//
+// Copyright (C) 2007 Scott Peterson
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using System.Xml;
+using Mono.Unix;
+using Gtk;
+
+using Banshee.Base;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.IO;
+using Banshee.Library;
+using Banshee.Playlist;
+using Banshee.ServiceStack;
+using Banshee.Sources;
+using Banshee.Widgets;
+using Hyena.Data.Sqlite;
+
+namespace Banshee.PlayerMigration
+{
+    public sealed class ItunesPlayerImportSource : ThreadPoolImportSource
+    {
+        // This is its own class so that we don't always load this stuff into memory
+        private class ItunesImportData
+        {
+            public string library_uri, default_query, local_prefix, fallback_dir;
+            public string[] query_dirs;
+            public bool get_ratings, get_stats, get_playlists, user_provided_prefix, empty_library;
+            public int total_songs, total_processed;
+            public Dictionary<int, int> track_ids = new Dictionary<int, int> (); // key=itunes_id, value=banshee_id
+        }
+
+        private readonly object mutex = new object ();
+        private volatile bool ok;
+
+        public const string LibraryFilename = "iTunes Music Library.xml";
+
+        public override string Name {
+            get { return Catalog.GetString ("iTunes Media Player"); }
+        }
+
+        public override bool CanImport {
+            get { return true; }
+        }
+
+        private ItunesImportData data;
+
+        protected override bool ConfirmImport ()
+        {
+            if (data == null) {
+                data = new ItunesImportData ();
+                var dialog = new ItunesImportDialog ();
+                if (!HandleImportDialog (dialog, delegate { data.library_uri = dialog.LibraryUri; })) {
+                    data = null;
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        private delegate void ImportDialogHandler (ItunesImportDialog dialog);
+
+        private bool HandleImportDialog (ItunesImportDialog dialog, ImportDialogHandler code)
+        {
+            try {
+                if (dialog.Run () == (int)ResponseType.Ok) {
+                    if(code != null) {
+                        code (dialog);
+                    }
+                    data.get_ratings = dialog.Ratings;
+                    data.get_stats = dialog.Stats;
+                    data.get_playlists = dialog.Playliststs;
+                } else {
+                    return false;
+                }
+            } finally {
+                dialog.Destroy ();
+                dialog.Dispose ();
+            }
+
+            if (String.IsNullOrEmpty (data.library_uri)) {
+                return false;
+            }
+
+            // Make sure the library version is supported (version 1.1)
+            string message = null;
+            bool prompt = false;
+            using (var xml_reader = new XmlTextReader (data.library_uri))
+            {
+                xml_reader.ReadToFollowing ("key");
+                do {
+                    xml_reader.Read ();
+                    string key = xml_reader.ReadContentAsString ();
+                    if (key == "Major Version" || key == "Minor Version") {
+                        xml_reader.Read ();
+                        xml_reader.Read ();
+                        if(xml_reader.ReadContentAsString () != "1") {
+                            message = Catalog.GetString (
+                                "Banshee is not familiar with this version of the iTunes library format." +
+                                " Importing may or may not work as expected, or at all. Would you like to attempt to import anyway?");
+                            prompt = true;
+                            break;
+                        }
+                    }
+                } while (xml_reader.ReadToNextSibling ("key"));
+            }
+
+            if (prompt) {
+                bool proceed = false;
+                using (var message_dialog = new MessageDialog (null, 0, MessageType.Question, ButtonsType.YesNo, message)) {
+                    if (message_dialog.Run () == (int)ResponseType.Yes) {
+                        proceed = true;
+                    }
+                    message_dialog.Destroy ();
+                }
+                if (!proceed) {
+                    LogError (data.library_uri, "Unsupported version");
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        protected override void ImportCore ()
+        {
+            try {
+                CountSongs ();
+                data.empty_library = ServiceManager.SourceManager.MusicLibrary.TrackModel.Count == 0;
+
+                var import_manager = ServiceManager.Get<LibraryImportManager> ();
+                using (var xml_reader = new XmlTextReader (data.library_uri)) {
+                    ProcessLibraryXml (import_manager, xml_reader);
+                }
+                import_manager.NotifyAllSources ();
+            } finally {
+                data = null;
+            }
+        }
+
+        private void CountSongs ()
+        {
+            using (var xml_reader = new XmlTextReader (data.library_uri)) {
+                xml_reader.ReadToDescendant("dict");
+                xml_reader.ReadToDescendant("dict");
+                xml_reader.ReadToDescendant("dict");
+                do {
+                    data.total_songs++;
+                } while (xml_reader.ReadToNextSibling ("dict"));
+            }
+        }
+
+        private void ProcessLibraryXml (LibraryImportManager import_manager, XmlReader xml_reader)
+        {
+            while (xml_reader.ReadToFollowing ("key") && !CheckForCanceled ()) {
+                xml_reader.Read ();
+                string key = xml_reader.ReadContentAsString ();
+                xml_reader.Read ();
+                xml_reader.Read ();
+
+                switch (key) {
+                case "Music Folder":
+                    if (!ProcessMusicFolderPath (xml_reader.ReadContentAsString ())) {
+                        return;
+                    }
+                    break;
+                case "Tracks":
+                    ProcessSongs (import_manager, xml_reader.ReadSubtree ());
+                    break;
+                case "Playlists":
+                    if (data.get_playlists) {
+                        ProcessPlaylists (xml_reader.ReadSubtree ());
+                    }
+                    break;
+                }
+            }
+        }
+
+        private bool ProcessMusicFolderPath(string path)
+        {
+            string[] itunes_music_uri_parts = ConvertToLocalUriFormat (path).Split (Path.DirectorySeparatorChar);
+            string[] library_uri_parts = Path.GetDirectoryName (data.library_uri).Split (Path.DirectorySeparatorChar);
+
+            string itunes_dir_name = library_uri_parts[library_uri_parts.Length - 1];
+            int i = 0;
+            bool found = false;
+
+            for (i = itunes_music_uri_parts.Length - 1; i >= 0; i--) {
+                if (itunes_music_uri_parts[i] == itunes_dir_name) {
+                    found = true;
+                    break;
+                }
+            }
+
+            if (!found) {
+                var builder = new StringBuilder (path.Length - 17);
+                for (int j = 3; j < itunes_music_uri_parts.Length; j++) {
+                    string part = itunes_music_uri_parts[j];
+                    builder.Append (part);
+                    if (part.Length > 0) {
+                        builder.Append (Path.DirectorySeparatorChar);
+                    }
+                }
+
+                string local_path = builder.ToString ();
+
+                System.Threading.Monitor.Enter (mutex);
+
+                ThreadAssist.ProxyToMain (delegate {
+                    System.Threading.Monitor.Enter (mutex);
+                    using (var dialog = new ItunesMusicDirectoryDialog (local_path)) {
+                        if (dialog.Run () == (int)ResponseType.Ok) {
+                            data.local_prefix = dialog.UserMusicDirectory;
+                            data.user_provided_prefix = true;
+                            data.default_query = local_path;
+                            ok = true;
+                        } else {
+                            ok = false;
+                        }
+                        dialog.Destroy ();
+                        System.Threading.Monitor.Pulse (mutex);
+                        System.Threading.Monitor.Exit (mutex);
+                    }
+                });
+
+                System.Threading.Monitor.Wait (mutex);
+                System.Threading.Monitor.Exit (mutex);
+
+                if (ok) {
+                    return true;
+                } else {
+                    LogError (data.library_uri, "Unable to locate iTunes directory from iTunes URI");
+                    return false;
+                }
+            }
+
+            string[] tmp_query_dirs = new string[itunes_music_uri_parts.Length];
+            string upstream_uri;
+            string tmp_upstream_uri = null;
+            int step = 0;
+            string root = Path.GetPathRoot (data.library_uri);
+            bool same_root = library_uri_parts[0] == root.Split (Path.DirectorySeparatorChar)[0];
+            do {
+                upstream_uri = tmp_upstream_uri;
+                tmp_upstream_uri = root;
+                for (int j = same_root ? 1 : 0; j < library_uri_parts.Length - step - 1; j++) {
+                    tmp_upstream_uri = Path.Combine (tmp_upstream_uri, library_uri_parts[j]);
+                }
+                tmp_upstream_uri = Path.Combine (tmp_upstream_uri, itunes_music_uri_parts[i - step]);
+                data.fallback_dir = tmp_query_dirs[step] = itunes_music_uri_parts[i - step];
+                step++;
+            } while (Banshee.IO.Directory.Exists (tmp_upstream_uri));
+            if (upstream_uri == null) {
+                LogError (data.library_uri, "Unable to resolve iTunes URIs to local URIs");
+                return false;
+            }
+            data.query_dirs = new string[step - 2];
+            data.default_query = string.Empty;
+
+            for (int j = step - 2; j >= 0; j--) {
+                if (j > 0) {
+                    data.query_dirs[j - 1] = tmp_query_dirs[j];
+                }
+                data.default_query += tmp_query_dirs[j] + Path.DirectorySeparatorChar;
+
+            }
+
+            data.local_prefix = string.Empty;
+            for (int j = 0; j <= library_uri_parts.Length - step; j++) {
+                data.local_prefix += library_uri_parts[j] + Path.DirectorySeparatorChar;
+            }
+
+            return true;
+        }
+
+        private void ProcessSongs (LibraryImportManager import_manager, XmlReader xml_reader)
+        {
+            using (xml_reader) {
+                xml_reader.ReadToFollowing ("dict");
+                while (xml_reader.ReadToFollowing ("dict") && !CheckForCanceled ()) {
+                    ProcessSong (import_manager, xml_reader.ReadSubtree ());
+                }
+            }
+        }
+
+        private void ProcessPlaylists (XmlReader xml_reader)
+        {
+            using (xml_reader) {
+                while(xml_reader.ReadToFollowing ("dict") && !CheckForCanceled ()) {
+                    ProcessPlaylist (xml_reader.ReadSubtree ());
+                }
+            }
+        }
+
+        private void ProcessSong (LibraryImportManager import_manager, XmlReader xml_reader)
+        {
+            data.total_processed++;
+
+            var itunes_id = 0;
+            var title = String.Empty;
+            var title_sort = String.Empty;
+            var genre = String.Empty;
+            var artist = String.Empty;
+            var artist_sort = String.Empty;
+            var album_artist = String.Empty;
+            var album_artist_sort = String.Empty;
+            var composer = String.Empty;
+            var album = String.Empty;
+            var album_sort = String.Empty;
+            var grouping = String.Empty;
+            var year = 0;
+            var rating = 0;
+            var play_count = 0;
+            var track_number = 0;
+            var date_added = DateTime.Now;
+            var last_played = DateTime.MinValue;
+
+            SafeUri uri = null;
+
+            using (xml_reader) {
+                while (xml_reader.ReadToFollowing ("key")) {
+                    xml_reader.Read();
+                    string key = xml_reader.ReadContentAsString ();
+                    xml_reader.Read ();
+                    xml_reader.Read ();
+
+                    try {
+                        switch (key) {
+                        case "Track ID":
+                            itunes_id = Int32.Parse (xml_reader.ReadContentAsString ());
+                            break;
+                        case "Name":
+                            title = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Sort Name":
+                            title_sort = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Genre":
+                            genre = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Artist":
+                            artist = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Sort Artist":
+                            artist_sort = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Album Artist":
+                            album_artist = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Sort Album Artist":
+                            album_artist_sort = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Composer":
+                            composer = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Album":
+                            album = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Sort Album":
+                            album_sort = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Grouping":
+                            grouping = xml_reader.ReadContentAsString ();
+                            break;
+                        case "Year":
+                            year = Int32.Parse (xml_reader.ReadContentAsString ());
+                            break;
+                        case "Rating":
+                            rating = Int32.Parse (xml_reader.ReadContentAsString ()) / 20;
+                            break;
+                        case "Play Count":
+                            play_count = Int32.Parse (xml_reader.ReadContentAsString ());
+                            break;
+                        case "Track Number":
+                            track_number = Int32.Parse (xml_reader.ReadContentAsString ());
+                            break;
+                        case "Date Added":
+                            date_added = DateTime.Parse (xml_reader.ReadContentAsString (),
+                                DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal);
+                            break;
+                        case "Play Date UTC":
+                            last_played = DateTime.Parse (xml_reader.ReadContentAsString (),
+                                DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal);
+                            break;
+                        case "Location":
+                            uri = ConvertToLocalUri (xml_reader.ReadContentAsString ());
+                            break;
+                        }
+                    } catch {
+                    }
+                }
+            }
+
+            if (uri == null) {
+                return;
+            }
+
+            UpdateUserJob (data.total_processed, data.total_songs, artist, title);
+
+            try {
+                DatabaseTrackInfo track = import_manager.ImportTrack (uri);
+
+                if (track == null) {
+                    LogError (SafeUri.UriToFilename (uri), Catalog.GetString ("Unable to import song."));
+                    return;
+                }
+
+                if (!String.IsNullOrEmpty (title)) {
+                    track.TrackTitle = title;
+                }
+                if (!String.IsNullOrEmpty (title_sort)) {
+                    track.TrackTitleSort = title_sort;
+                }
+                if (!String.IsNullOrEmpty (artist)) {
+                    track.ArtistName = artist;
+                }
+                if (!String.IsNullOrEmpty (artist_sort)) {
+                    track.ArtistNameSort = artist_sort;
+                }
+                if (!String.IsNullOrEmpty (genre)) {
+                    track.Genre = genre;
+                }
+                if (!String.IsNullOrEmpty (album_artist)) {
+                    track.AlbumArtist = album_artist;
+                }
+                if (!String.IsNullOrEmpty (album_artist_sort)) {
+                    track.AlbumArtistSort = album_artist_sort;
+                }
+                if (!String.IsNullOrEmpty (composer)) {
+                    track.Composer = composer;
+                }
+                if (!String.IsNullOrEmpty (album)) {
+                    track.AlbumTitle = album;
+                }
+                if (!String.IsNullOrEmpty (album_sort)) {
+                    track.AlbumTitleSort = album_sort;
+                }
+                if (!String.IsNullOrEmpty (grouping)) {
+                    track.Grouping = grouping;
+                }
+                if (year > 0) {
+                    track.Year = year;
+                }
+                if (data.get_ratings && rating > 0 && rating <= 5) {
+                    track.Rating = rating;
+                }
+                if (data.get_stats && play_count > 0) {
+                    track.PlayCount = play_count;
+                }
+                if (track_number > 0) {
+                    track.TrackNumber = track_number;
+                }
+                if (data.get_stats) {
+                    track.DateAdded = date_added;
+                }
+                if (data.get_stats && last_played > DateTime.MinValue) {
+                    track.LastPlayed = last_played;
+                }
+
+                data.track_ids.Add (itunes_id, track.TrackId);
+
+                track.Save (false);
+            } catch (Exception e) {
+                LogError (SafeUri.UriToFilename (uri), e);
+            }
+        }
+
+        private void ProcessPlaylist (XmlReader xml_reader)
+        {
+            string name = string.Empty;
+            bool skip = false;
+            bool processed = false;
+
+            using (xml_reader) {
+                while (xml_reader.ReadToFollowing ("key")) {
+                    xml_reader.Read ();
+                    string key = xml_reader.ReadContentAsString ();
+                    xml_reader.Read ();
+
+                    switch (key) {
+                    case "Name":
+                        xml_reader.Read ();
+                        name = xml_reader.ReadContentAsString ();
+                        if (name == "Library" ||
+                            name == "Music Videos" ||
+                            name == "Audiobooks" ||
+                            name == "Music" ||
+                            name == "Movies" ||
+                            name == "Party Shuffle" ||
+                            name == "Podcasts" ||
+                            name == "Party Shuffle" ||
+                            name == "Purchased Music" ||
+                            name == "Genius" ||
+                            name == "TV Shows") {
+                            skip = true;
+                        }
+                        break;
+                    case "Smart Info":
+                        skip = true;
+                        break;
+                    case "Smart Criteria":
+                        skip = true;
+                        break;
+                    case "Playlist Items":
+                        xml_reader.Read ();
+                        if(!skip) {
+                            ProcessPlaylist (name, xml_reader.ReadSubtree ());
+                            processed = true;
+                        }
+                        break;
+                    }
+                }
+            }
+
+            // Empty playlist
+            if (!processed && !skip) {
+                ProcessPlaylist (name, null);
+            }
+        }
+
+        private void ProcessPlaylist (string name, XmlReader xml_reader)
+        {
+            UpdateUserJob (1, 1, Catalog.GetString("Playlists"), name);
+
+            ProcessRegularPlaylist (name, xml_reader);
+            if (xml_reader != null) {
+                xml_reader.Close ();
+            }
+        }
+
+        private void ProcessRegularPlaylist (string name, XmlReader xml_reader)
+        {
+            var playlist_source = new PlaylistSource (name, ServiceManager.SourceManager.MusicLibrary);
+            playlist_source.Save ();
+            ServiceManager.SourceManager.MusicLibrary.AddChildSource (playlist_source);
+
+            // Get the songs in the playlists
+            if (xml_reader != null) {
+                while (xml_reader.ReadToFollowing ("integer") && !CheckForCanceled ()) {
+                    xml_reader.Read ();
+                    int itunes_id = Int32.Parse (xml_reader.ReadContentAsString ());
+                    int track_id;
+                    if (data.track_ids.TryGetValue (itunes_id, out track_id)) {
+                        try {
+                            ServiceManager.DbConnection.Execute (
+                                "INSERT INTO CorePlaylistEntries (PlaylistID, TrackID) VALUES (?, ?)",
+                                playlist_source.DbId, track_id);
+                        } catch {
+                        }
+                    }
+                }
+                playlist_source.Reload ();
+                playlist_source.NotifyUser ();
+            }
+        }
+
+        private SafeUri ConvertToLocalUri (string raw_uri)
+        {
+            if (raw_uri == null) {
+                return null;
+            }
+
+            string uri = ConvertToLocalUriFormat (raw_uri);
+            int index = uri.IndexOf (data.default_query);
+
+            if (data.user_provided_prefix && index != -1) {
+                index += data.default_query.Length;
+            } else if (index == -1 && data.query_dirs.Length > 0) {
+                int count = 0;
+                string path = data.query_dirs[data.query_dirs.Length - 1];
+                do {
+                    for (int k = data.query_dirs.Length - 2; k >= count; k--) {
+                        path = Path.Combine (path, data.query_dirs[k]);
+                    }
+                    index = uri.IndexOf (path);
+                    count++;
+                } while(index == -1 && count < data.query_dirs.Length);
+                if (index == -1) {
+                    index = uri.IndexOf(data.fallback_dir);
+                    if (index != -1) {
+                        index += data.fallback_dir.Length + 1;
+                    }
+                }
+            }
+
+            if (index == -1) {
+                if (data.empty_library) {
+                    LogError (uri, "Unable to map iTunes URI to local URI");
+                }
+                return null;
+            }
+            SafeUri safe_uri = CreateSafeUri (Path.Combine(
+                data.local_prefix, uri.Substring (index, uri.Length - index)), data.empty_library);
+
+            if (safe_uri == null && !data.empty_library) {
+                string local_uri = string.Empty;
+                string lower_uri = raw_uri.ToLower (CultureInfo.InvariantCulture);
+                int i = lower_uri.Length;
+                while (true) {
+                    i = lower_uri.LastIndexOf (Path.DirectorySeparatorChar, i - 1);
+                    if (i == -1) {
+                        break;
+                    }
+                    try {
+                        using (var reader = ServiceManager.DbConnection.Query (String.Format (
+                            @"SELECT Uri FROM CoreTracks WHERE lower(Uri) LIKE ""%{0}""", lower_uri.Substring (i + 1)))) {
+                            bool found = false;
+                            local_uri = string.Empty;
+                            while (reader.Read ()) {
+                                if (found) {
+                                    local_uri = string.Empty;
+                                    break;
+                                }
+                                found = true;
+                                local_uri = (string)reader[0];
+                            }
+                            if (!found || local_uri.Length > 0) {
+                                break;
+                            }
+                        }
+                    } catch {
+                        break;
+                    }
+                }
+                if (local_uri.Length > 0) {
+                    safe_uri = CreateSafeUri (local_uri, true);
+                } else {
+                    LogError (uri, "Unable to map iTunes URI to local URI");
+                }
+            }
+
+            return safe_uri;
+        }
+
+        private SafeUri CreateSafeUri (string uri, bool complain)
+        {
+            SafeUri safe_uri;
+            try {
+                safe_uri = new SafeUri (uri);
+            } catch {
+                if (complain) {
+                    LogError (uri, "URI is not a local file path");
+                }
+                return null;
+            }
+
+            safe_uri = FindFile (safe_uri);
+            if (safe_uri == null) {
+                if (complain) {
+                    LogError (uri, "File does not exist");
+                }
+                return null;
+            }
+
+            return safe_uri;
+        }
+
+        // URIs are UTF-8 percent-encoded. Deconding with System.Web.HttpServerUtility
+        // involves too much overhead, so we do it cheap here.
+        private static string ConvertToLocalUriFormat (string input)
+        {
+            var builder = new StringBuilder (input.Length);
+            byte[] buffer = new byte[2];
+            bool using_buffer = false;
+            for (int i = 0; i < input.Length; i++) {
+                // If it's a '%', treat the two subsiquent characters as a UTF-8 byte in hex.
+                if (input[i] == '%') {
+                    byte code = Byte.Parse (input.Substring(i + 1, 2),
+                        System.Globalization.NumberStyles.HexNumber);
+                    // If it's a non-ascii character, or there are already some non-ascii
+                    // characters in the buffer, then queue it for UTF-8 decoding.
+                    if (using_buffer || (code & 0x80) != 0) {
+                        if (using_buffer) {
+                            if (buffer[1] == 0) {
+                                buffer[1] = code;
+                            } else {
+                                byte[] new_buffer = new byte[buffer.Length + 1];
+                                for (int j = 0; j < buffer.Length; j++) {
+                                    new_buffer[j] = buffer[j];
+                                }
+                                buffer = new_buffer;
+                                buffer[buffer.Length - 1] = code;
+                            }
+                        } else {
+                            buffer[0] = code;
+                            using_buffer = true;
+                        }
+                    }
+                        // If it's a lone ascii character, there's no need for fancy UTF-8 decoding.
+                    else {
+                        builder.Append ((char)code);
+                    }
+                    i += 2;
+                } else {
+                    // If we have something in the buffer, decode it.
+                    if (using_buffer) {
+                        builder.Append (Encoding.UTF8.GetString (buffer));
+                        if (buffer.Length > 2) {
+                            buffer = new byte[2];
+                        } else {
+                            buffer[1] = 0;
+                        }
+                        using_buffer = false;
+                    }
+                    // And add our regular characters and convert to local directory separator char.
+                    if (input[i] == '/') {
+                        builder.Append (Path.DirectorySeparatorChar);
+                    } else {
+                        builder.Append (input[i]);
+                    }
+                }
+            }
+            return builder.ToString ();
+        }
+
+        private static SafeUri FindFile (SafeUri uri)
+        {
+            // URIs kept by iTunes often contain characters in a case different from the actual
+            // files and directories. This method tries to find the real file URI.
+
+            if (Banshee.IO.File.Exists (uri)) {
+                return uri;
+            }
+
+            string path = uri.AbsolutePath;
+            string file = Path.GetFileName (path);
+            string directory = Path.GetDirectoryName (path);
+            directory = FindDirectory (directory);
+            if (directory == null) {
+                return null;
+            }
+
+            uri = new SafeUri (Path.Combine (directory, file), false);
+            if (Banshee.IO.File.Exists (uri)) {
+                return uri;
+            }
+
+            foreach (string item in Banshee.IO.Directory.GetFiles (directory)) {
+                string name = Path.GetFileName (item);
+                if (0 != String.Compare (file, name, true)) {
+                    continue;
+                }
+                return new SafeUri (Path.Combine (directory, name), false);
+            }
+
+            return null;
+        }
+
+        private static string FindDirectory (string directory)
+        {
+            if (Banshee.IO.Directory.Exists (directory)) {
+                return directory;
+            }
+
+            string current = Path.GetFileName (directory);
+            directory = Path.GetDirectoryName (directory);
+            if (String.IsNullOrEmpty (directory)) {
+                return null;
+            }
+
+            directory = FindDirectory (directory);
+            if (String.IsNullOrEmpty (directory)) {
+                return null;
+            }
+
+            foreach (string item in Banshee.IO.Directory.GetDirectories (directory)) {
+                string name = Path.GetFileName (item);
+                if (0 != String.Compare (current, name, true)) {
+                    continue;
+                }
+                return Path.Combine (directory, name);
+            }
+
+            return null;
+        }
+
+        public override string [] IconNames {
+            get { return new string [] { "itunes", "system-search" }; }
+        }
+
+        public override int SortOrder {
+            get { return 40; }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
index a3aecfa..6c5ee94 100644
--- a/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
+++ b/src/Extensions/Banshee.PlayerMigration/Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
@@ -83,7 +83,7 @@ namespace Banshee.PlayerMigration
                 LogError (SafeUri.UriToFilename (db_uri), "Unable to open Rhythmbox library.");
                 return;
             }
-            
+
             count = db_root.ChildNodes.Count;
             processed = 0;
 
@@ -106,7 +106,7 @@ namespace Banshee.PlayerMigration
             }
 
             XmlElement playlists_root = null;
-            
+
             if (playlists_available) {
                 if (IsValidXmlDocument (rhythmbox_playlists_uri)) {
                     Stream stream_playlists = Banshee.IO.File.OpenRead (rhythmbox_playlists_uri);
@@ -114,7 +114,7 @@ namespace Banshee.PlayerMigration
                     xml_doc_playlists.Load (stream_playlists);
                     playlists_root = xml_doc_playlists.DocumentElement;
                     stream_playlists.Close ();
- 
+
                     if (playlists_root == null || !playlists_root.HasChildNodes || playlists_root.Name != "rhythmdb-playlists") {
                         playlists_available = false;
                     } else {
@@ -129,7 +129,7 @@ namespace Banshee.PlayerMigration
             ImportSongs (import_manager, db_root.SelectNodes ("/rhythmdb/entry[@type='song']"));
 
             //ImportPodcasts (import_manager, db_root.SelectNodes ("/rhythmdb/entry[@type='podcast-post']"));
-            
+
             if (playlists_available) {
                 ImportStaticPlaylists(playlists_root.SelectNodes ("/rhythmdb-playlists/playlist[@type='static']"));
             }
@@ -162,7 +162,7 @@ namespace Banshee.PlayerMigration
                 }
 
                 processed++;
-                    
+
                 string title = String.Empty,
                        genre = String.Empty,
                        artist = String.Empty,
@@ -222,7 +222,7 @@ namespace Banshee.PlayerMigration
                         // parsing InnerText failed
                     }
                 }
-                
+
                 if (uri == null) {
                     continue;
                 }
@@ -231,7 +231,7 @@ namespace Banshee.PlayerMigration
 
                 try {
                     DatabaseTrackInfo track = manager.ImportTrack (uri);
-                    
+
                     if (track == null) {
                         LogError (SafeUri.UriToFilename (uri), Catalog.GetString ("Unable to import song."));
                         continue;
@@ -244,11 +244,11 @@ namespace Banshee.PlayerMigration
                     track.TrackNumber = track_number;
                     track.Year = year;
                     track.DateAdded = date_added;
-                    
+
                     track.Rating = (rating >= 0 && rating <= 5) ? rating : 0;
                     track.PlayCount = (play_count >= 0) ? play_count : 0;
                     track.LastPlayed = last_played;
-                    
+
                     track.Save (false);
                 } catch (Exception e) {
                     LogError (SafeUri.UriToFilename (uri), e);
@@ -267,7 +267,7 @@ namespace Banshee.PlayerMigration
                 }
 
                 processed++;
-                    
+
                 string title = String.Empty, feed = String.Empty;
                 SafeUri uri = null;
 
@@ -292,7 +292,7 @@ namespace Banshee.PlayerMigration
                         // parsing InnerText failed
                     }
                 }
-                
+
                 if (uri == null) {
                     continue;
                 }
@@ -301,16 +301,16 @@ namespace Banshee.PlayerMigration
 
                 try {
                     DatabaseTrackInfo track = manager.ImportTrack (uri);
-                    
+
                     if (track == null) {
                         LogError (SafeUri.UriToFilename (uri), Catalog.GetString ("Unable to import podcast."));
                         continue;
                     }
-                    
+
                     track.TrackTitle = title;
                     track.AlbumTitle = feed;
                     track.Genre = "Podcast";
-                    
+
                     track.Save (false);
                 } catch (Exception e) {
                     LogError (SafeUri.UriToFilename (uri), e);
@@ -326,34 +326,34 @@ namespace Banshee.PlayerMigration
                 }
 
                 processed++;
-                
+
                 try {
                     string title = String.Empty;
                     if (list.HasAttribute ("name")) {
                         title = list.GetAttribute ("name");
                     }
-                    
+
                     UpdateUserJob (processed, count, "", title);
-        
+
                     PlaylistSource playlist = new PlaylistSource (title, ServiceManager.SourceManager.MusicLibrary);
                     playlist.Save ();
                     ServiceManager.SourceManager.MusicLibrary.AddChildSource (playlist);
-        
-                    
+
+
                     HyenaSqliteCommand insert_command = new HyenaSqliteCommand (String.Format (
                         @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID) VALUES ({0}, ?)", playlist.DbId));
-        
+
                     foreach (XmlElement entry in list.ChildNodes) {
                         if (entry.Name != "location") {
                             continue;
                         }
-                        
+
                         int track_id = ServiceManager.SourceManager.MusicLibrary.GetTrackIdForUri (entry.InnerText);
                         if (track_id > 0) {
                             ServiceManager.DbConnection.Execute (insert_command, track_id);
                         }
                     }
-                            
+
                     playlist.Reload ();
                     playlist.NotifyUser ();
                 } catch (Exception e) {
@@ -361,11 +361,11 @@ namespace Banshee.PlayerMigration
                 }
             }
         }
-        
+
         public override bool CanImport {
             get { return Banshee.IO.File.Exists (rhythmbox_db_uri) || Banshee.IO.File.Exists (rhythmbox_db_uri_old); }
         }
-        
+
         public override string Name {
             get { return Catalog.GetString ("Rhythmbox Music Player"); }
         }
@@ -373,7 +373,7 @@ namespace Banshee.PlayerMigration
         public override string [] IconNames {
             get { return new string [] { "rhythmbox", "system-search" }; }
         }
-        
+
         public override int SortOrder {
             get { return 40; }
         }
diff --git a/src/Extensions/Banshee.PlayerMigration/Makefile.am b/src/Extensions/Banshee.PlayerMigration/Makefile.am
index 384723a..cbc8fa0 100644
--- a/src/Extensions/Banshee.PlayerMigration/Makefile.am
+++ b/src/Extensions/Banshee.PlayerMigration/Makefile.am
@@ -5,10 +5,11 @@ INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 
 SOURCES =  \
 	Banshee.PlayerMigration/AmarokPlayerImportSource.cs \
+	Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs \
+	Banshee.PlayerMigration/ItunesPlayerImportSource.cs \
 	Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
 
-RESOURCES =  \
-	Banshee.PlayerMigration.addin.xml
+RESOURCES = Banshee.PlayerMigration.addin.xml
 
 include $(top_srcdir)/build/build.mk
 
diff --git a/src/Extensions/Banshee.PlayerMigration/Makefile.in b/src/Extensions/Banshee.PlayerMigration/Makefile.in
index 15e4c34..5b8704a 100644
--- a/src/Extensions/Banshee.PlayerMigration/Makefile.in
+++ b/src/Extensions/Banshee.PlayerMigration/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -347,11 +356,11 @@ LINK = $(REF_EXTENSION_PLAYER_MIGRATION) $(am__append_1)
 INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 SOURCES = \
 	Banshee.PlayerMigration/AmarokPlayerImportSource.cs \
+	Banshee.PlayerMigration/ItunesPlayerImportDialogs.cs \
+	Banshee.PlayerMigration/ItunesPlayerImportSource.cs \
 	Banshee.PlayerMigration/RhythmboxPlayerImportSource.cs
 
-RESOURCES = \
-	Banshee.PlayerMigration.addin.xml
-
+RESOURCES = Banshee.PlayerMigration.addin.xml
 
 # Initializers
 MONO_BASE_PATH = 
@@ -373,6 +382,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -476,11 +486,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -498,6 +509,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -527,6 +539,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -546,14 +559,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.PlayerMigration/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.PlayerMigration/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.PlayerMigration/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.PlayerMigration/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -571,25 +584,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -619,13 +648,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -657,6 +690,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -677,6 +711,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -685,18 +721,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -757,7 +803,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -774,6 +820,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/DownloadStatusFilterModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/DownloadStatusFilterModel.cs
index dffd532..dd3135f 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/DownloadStatusFilterModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/DownloadStatusFilterModel.cs
@@ -56,17 +56,17 @@ namespace Banshee.Podcasting.Gui
             Selection.Clear (false);
             Selection.QuietSelect (0);
         }
-        
+
         public override void Reload (bool notify)
         {
             if (notify)
                 OnReloaded ();
         }
-        
+
         public override void Clear ()
         {
         }
-        
+
         public override DownloadedStatusFilter this [int index] {
             get {
                 switch (index) {
@@ -77,7 +77,7 @@ namespace Banshee.Podcasting.Gui
                 }
             }
         }
-        
+
         public override int Count {
             get { return 3; }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
index d3d980e..2ce6110 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -43,27 +43,27 @@ namespace Banshee.Podcasting.Gui
 {
     public class PodcastFeedModel : DatabaseFilterListModel<Feed, Feed>
     {
-        public PodcastFeedModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
+        public PodcastFeedModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid)
             : base ("podcast", Catalog.GetString ("Podcast"), source, trackModel, connection, Feed.Provider, new Feed (null, FeedAutoDownload.None), uuid)
         {
             ReloadFragmentFormat = @"
                 FROM PodcastSyndications WHERE FeedID IN
                     (SELECT DISTINCT PodcastSyndications.FeedID FROM PodcastItems, CoreTracks, PodcastEnclosures, PodcastSyndications, CoreCache{0}
-                        WHERE PodcastSyndications.FeedID = PodcastItems.FeedID AND 
+                        WHERE PodcastSyndications.FeedID = PodcastItems.FeedID AND
                           PodcastItems.ItemID = CoreTracks.ExternalID AND PodcastEnclosures.ItemID = PodcastItems.ItemID AND
                           CoreCache.ModelID = {1} AND CoreCache.ItemId = {2} {3})
                     ORDER BY lower(Title)";
         }
-        
+
         public override string FilterColumn {
             get { return Feed.Provider.PrimaryKey; }
         }
-        
+
         protected override string ItemToFilterValue (object item)
         {
             return (item != select_all_item && item is Feed) ? (item as Feed).DbId.ToString () : null;
         }
-        
+
         public override void UpdateSelectAllItem (long count)
         {
             select_all_item.Title = String.Format (Catalog.GetString ("All Podcasts ({0})"), count);
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
index 9863da6..22a5e50 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -53,11 +53,11 @@ using Banshee.Podcasting.Data;
 using Migo.Syndication;
 
 namespace Banshee.Podcasting.Gui
-{ 
+{
     public class PodcastSource : Banshee.Library.LibrarySource
     {
         private PodcastFeedModel feed_model;
-        
+
         public override string DefaultBaseDirectory {
             get {
                 // HACK there isn't an XDG_PODCASTS_DIR; propose it?
@@ -80,7 +80,11 @@ namespace Banshee.Podcasting.Gui
         public override bool CanDeleteTracks {
             get { return false; }
         }
-        
+
+        public override bool CanShuffle {
+            get { return false; }
+        }
+
         public PodcastFeedModel FeedModel {
             get { return feed_model; }
         }
@@ -101,16 +105,16 @@ namespace Banshee.Podcasting.Gui
             TrackModel.Reloaded += OnReloaded;
 
             Properties.SetString ("Icon.Name", "podcast");
-            
+
             Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
             Properties.Set<bool> ("ActiveSourceUIResourcePropagate", true);
             Properties.Set<System.Reflection.Assembly> ("ActiveSourceUIResource.Assembly", typeof(PodcastSource).Assembly);
-            
+
             Properties.SetString ("GtkActionPath", "/PodcastSourcePopup");
 
             Properties.Set<ISourceContents> ("Nereid.SourceContents", new PodcastSourceContents ());
             Properties.Set<bool> ("Nereid.SourceContentsPropagate", true);
-            
+
             Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
                     <column-controller>
                       <add-all-defaults />
@@ -159,7 +163,7 @@ namespace Banshee.Podcasting.Gui
                 Catalog.GetString ("Downloaded"), Catalog.GetString ("Description")
             ));
         }
-        
+
 #endregion
 
         private object GetPodcastInfoObject (DatabaseTrackInfo track)
@@ -171,7 +175,7 @@ namespace Banshee.Podcasting.Gui
         {
             return PodcastService.ArtworkIdFor (PodcastTrackInfo.From (track).Feed);
         }
-        
+
         protected override bool HasArtistAlbum {
             get { return false; }
         }
@@ -214,12 +218,12 @@ namespace Banshee.Podcasting.Gui
             if (episode != null) {
                 if (episode.Uri.IsFile)
                     base.DeleteTrack (track);
-                
+
                 episode.Delete ();
                 episode.Item.Delete (false);
             }
         }*/
-        
+
         /*protected override void AddTrack (DatabaseTrackInfo track)
         {
             // TODO
@@ -227,11 +231,11 @@ namespace Banshee.Podcasting.Gui
             // considered a Podcast item
             base.AddTrack (track);
         }*/
-        
+
         public override bool ShowBrowser {
             get { return true; }
         }
-        
+
         /*public override IEnumerable<SmartPlaylistDefinition> DefaultSmartPlaylists {
             get { return default_smart_playlists; }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
index ad92b35..923f472 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  PodcastItem.cs
  *
  *  Copyright (C) 2008 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -43,20 +43,20 @@ using Banshee.Collection.Database;
 
 using Migo.Syndication;
 
-namespace Banshee.Podcasting.Data 
+namespace Banshee.Podcasting.Data
 {
     public enum PodcastItemActivity : int {
         Downloading = 0,
-        DownloadPending = 1,        
+        DownloadPending = 1,
         DownloadFailed = 2,
-        DownloadPaused = 3,        
+        DownloadPaused = 3,
         //NewPodcastItem = 4,
         //Video = 5,
         Downloaded = 6,
         None = 7
     }
 
-    public class PodcastTrackInfo
+    public class PodcastTrackInfo : IPodcastInfo
     {
         public static PodcastTrackInfo From (TrackInfo track)
         {
@@ -80,8 +80,7 @@ namespace Banshee.Podcasting.Data
                 }
             }
         }
-        
-        private int position;
+
         private DatabaseTrackInfo track;
 
 #region Properties
@@ -93,7 +92,7 @@ namespace Banshee.Podcasting.Data
         public Feed Feed {
             get { return Item.Feed; }
         }
-        
+
         private FeedItem item;
         public FeedItem Item {
             get {
@@ -104,7 +103,7 @@ namespace Banshee.Podcasting.Data
             }
             set { item = value; track.ExternalId = value.DbId; }
         }
-        
+
         public DateTime PublishedDate {
             get { return Item.PubDate; }
         }
@@ -112,24 +111,19 @@ namespace Banshee.Podcasting.Data
         public string Description {
             get { return Item.StrippedDescription; }
         }
-        
+
         public bool IsNew {
             get { return !Item.IsRead; }
         }
-        
+
         public bool IsDownloaded {
             get { return !String.IsNullOrEmpty (Enclosure.LocalPath); }
         }
-        
-        public int Position {
-            get { return position; }
-            set { position = value; }
-        }
 
         public DateTime ReleaseDate {
             get { return Item.PubDate; }
         }
-        
+
         public FeedEnclosure Enclosure {
             get { return (Item == null) ? null : Item.Enclosure; }
         }
@@ -139,21 +133,21 @@ namespace Banshee.Podcasting.Data
                 switch (Item.Enclosure.DownloadStatus) {
                 case FeedDownloadStatus.Downloaded:
                     return PodcastItemActivity.Downloaded;
-               
+
                 case FeedDownloadStatus.DownloadFailed:
                     return PodcastItemActivity.Downloaded;
-                    
+
                 case FeedDownloadStatus.Downloading:
                     return PodcastItemActivity.Downloading;
-                    
+
                 case FeedDownloadStatus.Pending:
                     return PodcastItemActivity.DownloadPending;
-                    
+
                 case FeedDownloadStatus.Paused:
                     return PodcastItemActivity.DownloadPaused;
 
                 default:
-                    return PodcastItemActivity.None;   
+                    return PodcastItemActivity.None;
                 }
             }
         }
@@ -161,12 +155,12 @@ namespace Banshee.Podcasting.Data
 #endregion
 
 #region Constructors
-    
+
         public PodcastTrackInfo (DatabaseTrackInfo track) : base ()
         {
             this.track = track;
         }
-        
+
         public PodcastTrackInfo (DatabaseTrackInfo track, FeedItem feed_item) : this (track)
         {
             Item = feed_item;
@@ -188,9 +182,9 @@ namespace Banshee.Podcasting.Data
                     pi.Item.IsRead = true;
                     pi.Item.Save ();
                 }
-            }   
+            }
         }
-        
+
         public void SyncWithFeedItem ()
         {
             //Console.WriteLine ("Syncing item, enclosure == null? {0}", Item.Enclosure == null);
@@ -206,7 +200,7 @@ namespace Banshee.Podcasting.Data
             track.FileSize = Item.Enclosure.FileSize;
             track.LicenseUri = Item.LicenseUri;
             track.Uri = new Banshee.Base.SafeUri (Item.Enclosure.LocalPath ?? Item.Enclosure.Url);
-            
+
             if (!String.IsNullOrEmpty (Item.Enclosure.LocalPath)) {
                 try {
                     TagLib.File file = Banshee.Streaming.StreamTagger.ProcessUri (track.Uri);
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
index fc87e52..3884a50 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
@@ -73,7 +73,7 @@ namespace Banshee.Podcasting.Gui
                 ? GetSort ("PublishedDate", false)
                 : GetSort (SortColumn.SortKey, SortColumn.SortType == Hyena.Data.SortType.Ascending);
         }
-        
+
         public override void UpdateUnfilteredAggregates ()
         {
             HyenaSqliteCommand count_command = new HyenaSqliteCommand (String.Format (
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs
index 47a2ace..895c9c2 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs
@@ -56,17 +56,17 @@ namespace Banshee.Podcasting.Gui
             Selection.Clear (false);
             Selection.QuietSelect (1);
         }
-        
+
         public override void Reload (bool notify)
         {
             if (notify)
                 OnReloaded ();
         }
-        
+
         public override void Clear ()
         {
         }
-        
+
         public override OldNewFilter this [int index] {
             get {
                 switch (index) {
@@ -77,7 +77,7 @@ namespace Banshee.Podcasting.Gui
                 }
             }
         }
-        
+
         public override int Count {
             get { return 3; }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
index 8ad2648..562e7ba 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
@@ -49,7 +49,7 @@ namespace Banshee.Podcasting.Gui
         public ColumnCellDownloadStatus () : base (null, true)
         {
         }
-    
+
         protected override string GetText (object obj)
         {
             DownloadedStatusFilter val = (DownloadedStatusFilter) obj;
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs
index af13ce2..169d8b1 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcast.cs
@@ -48,124 +48,124 @@ namespace Banshee.Podcasting.Gui
     {
         private static int image_spacing = 4;
         private static int image_size = 48;
-        
+
         // TODO replace this w/ new icon installation etc
-        private static ImageSurface default_cover_image 
+        private static ImageSurface default_cover_image
             = PixbufImageSurface.Create (IconThemeUtils.LoadIcon (image_size, "podcast"));
-        
+
         private ArtworkManager artwork_manager;
 
         public ColumnCellPodcast () : base (null, true)
         {
             artwork_manager = ServiceManager.Get<ArtworkManager> ();
         }
-    
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             if (BoundObject == null) {
                 return;
             }
-            
+
             if (!(BoundObject is Feed)) {
                 throw new InvalidCastException("ColumnCellPodcast can only bind to Feed objects");
             }
-            
+
             Feed feed = (Feed)BoundObject;
-            
+
             bool is_default = false;
-            ImageSurface image = artwork_manager == null ? null 
+            ImageSurface image = artwork_manager == null ? null
                 : artwork_manager.LookupScaleSurface (PodcastService.ArtworkIdFor (feed), image_size, true);
-            
+
             if (image == null) {
                 image = default_cover_image;
                 is_default = true;
             }
-            
+
             // int image_render_size = is_default ? image.Height : (int)cellHeight - 8;
             int image_render_size = image_size;
             int x = image_spacing;
             int y = ((int)cellHeight - image_render_size) / 2;
 
-            ArtworkRenderer.RenderThumbnail (context.Context, image, false, x, y, 
+            ArtworkRenderer.RenderThumbnail (context.Context, image, false, x, y,
                 image_render_size, image_render_size, !is_default, context.Theme.Context.Radius);
-                
+
             int fl_width = 0, fl_height = 0, sl_width = 0, sl_height = 0;
             Cairo.Color text_color = context.Theme.Colors.GetWidgetColor (GtkColorClass.Text, state);
             text_color.A = 0.75;
-            
+
             Pango.Layout layout = context.Layout;
             layout.Width = (int)((cellWidth - cellHeight - x - 10) * Pango.Scale.PangoScale);
             layout.Ellipsize = Pango.EllipsizeMode.End;
             layout.FontDescription.Weight = Pango.Weight.Bold;
-            
+
             // Compute the layout sizes for both lines for centering on the cell
             int old_size = layout.FontDescription.Size;
-            
+
             layout.SetText (feed.Title ?? String.Empty);
             layout.GetPixelSize (out fl_width, out fl_height);
-            
+
             if (feed.DbId > 0) {
                 layout.FontDescription.Weight = Pango.Weight.Normal;
                 layout.FontDescription.Size = (int)(old_size * Pango.Scale.Small);
                 layout.FontDescription.Style = Pango.Style.Italic;
-                
+
                 if (feed.LastDownloadTime == DateTime.MinValue) {
                     layout.SetText (Catalog.GetString ("Never updated"));
                 } else if (feed.LastDownloadTime.Date == DateTime.Now.Date) {
                     layout.SetText (String.Format (Catalog.GetString ("Updated at {0}"), feed.LastDownloadTime.ToShortTimeString ()));
                 } else {
                     layout.SetText (String.Format (Catalog.GetString ("Updated {0}"), Hyena.Query.RelativeTimeSpanQueryValue.RelativeToNow (feed.LastDownloadTime).ToUserQuery ()));
-                }    
+                }
                 layout.GetPixelSize (out sl_width, out sl_height);
             }
-            
+
             // Calculate the layout positioning
             x = ((int)cellHeight - x) + 10;
             y = (int)((cellHeight - (fl_height + sl_height)) / 2);
-            
+
             // Render the second line first since we have that state already
             if (feed.DbId > 0) {
                 context.Context.MoveTo (x, y + fl_height);
                 context.Context.Color = text_color;
                 PangoCairoHelper.ShowLayout (context.Context, layout);
             }
-            
+
             // Render the first line, resetting the state
             layout.SetText (feed.Title ?? String.Empty);
             layout.FontDescription.Weight = Pango.Weight.Bold;
             layout.FontDescription.Size = old_size;
             layout.FontDescription.Style = Pango.Style.Normal;
-            
+
             layout.SetText (feed.Title ?? String.Empty);
-            
+
             context.Context.MoveTo (x, y);
             text_color.A = 1;
             context.Context.Color = text_color;
             PangoCairoHelper.ShowLayout (context.Context, layout);
         }
-        
+
         public int ComputeRowHeight (Widget widget)
         {
             int height;
             int text_w, text_h;
-            
+
             Pango.Layout layout = new Pango.Layout (widget.PangoContext);
             layout.FontDescription = widget.PangoContext.FontDescription.Copy ();
-            
+
             layout.FontDescription.Weight = Pango.Weight.Bold;
             layout.SetText ("W");
             layout.GetPixelSize (out text_w, out text_h);
             height = text_h;
-            
+
             layout.FontDescription.Weight = Pango.Weight.Normal;
             layout.FontDescription.Size = (int)(layout.FontDescription.Size * Pango.Scale.Small);
             layout.FontDescription.Style = Pango.Style.Italic;
             layout.SetText ("W");
             layout.GetPixelSize (out text_w, out text_h);
             height += text_h;
-            
+
             layout.Dispose ();
-            
+
             return (height < image_size ? image_size : height) + 6;
         }
     }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
index 6e849de..792fc48 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
@@ -28,6 +28,7 @@
 
 using System;
 using Gtk;
+using Mono.Unix;
 
 using Hyena.Data.Gui;
 using Banshee.Gui;
@@ -43,42 +44,44 @@ namespace Banshee.Podcasting.Gui
         public ColumnCellPodcastStatusIndicator (string property) : base (property)
         {
         }
-        
+
         public ColumnCellPodcastStatusIndicator (string property, bool expand) : base (property, expand)
         {
         }
-        
+
         protected override int PixbufCount {
             get { return base.PixbufCount + 2; }
         }
-        
+
         protected override void LoadPixbufs ()
         {
             base.LoadPixbufs ();
-            
+
             // Downloading
             Pixbufs[base.PixbufCount + 0] = IconThemeUtils.LoadIcon (PixbufSize, "document-save", "go-bottom");
-            
+            StatusNames[base.PixbufCount + 0] = Catalog.GetString ("Downloading");
+
             // Podcast is Downloaded
             Pixbufs[base.PixbufCount + 1] = IconThemeUtils.LoadIcon (PixbufSize, "podcast-new");
+            StatusNames[base.PixbufCount + 1] = Catalog.GetString ("New");
         }
-        
+
         protected override int GetIconIndex (TrackInfo track)
         {
             PodcastTrackInfo podcast = PodcastTrackInfo.From (track);
             if (track == null) {
                 return -1;
             }
-            
+
             switch (podcast.Activity) {
                 case PodcastItemActivity.Downloading:
-                case PodcastItemActivity.DownloadPending: 
+                case PodcastItemActivity.DownloadPending:
                     return base.PixbufCount + 0;
                 default:
                     return podcast.IsDownloaded ? base.PixbufCount + 1 : -1;
             }
         }
-        
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             PodcastTrackInfo podcast = PodcastTrackInfo.From (BoundTrack);
@@ -87,7 +90,7 @@ namespace Banshee.Podcasting.Gui
                     context.Opaque = false;
                 }
             }
-            
+
             base.Render (context, state, cellWidth, cellHeight);
         }
     }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
index a747b94..2c41d64 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
@@ -49,7 +49,7 @@ namespace Banshee.Podcasting.Gui
         public ColumnCellUnheard () : base (null, true)
         {
         }
-    
+
         protected override string GetText (object obj)
         {
             OldNewFilter val = (OldNewFilter) obj;
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadManagerInterface.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadManagerInterface.cs
index 368b2e2..3265dad 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadManagerInterface.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadManagerInterface.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  DownloadManagerInterface.cs
  *
  *  Copyright (C) 2008 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -38,88 +38,88 @@ using System.Threading;
 
 namespace Banshee.Podcasting.Gui
 {
-    public class DownloadManagerInterface : IDisposable 
+    public class DownloadManagerInterface : IDisposable
     {
         private DownloadManager manager;
-        private DownloadUserJob downloadJob;        
-        //private DownloadManagerSource downloadSource;        
-        
-        private readonly object sync = new object ();        
-        
+        private DownloadUserJob downloadJob;
+        //private DownloadManagerSource downloadSource;
+
+        private readonly object sync = new object ();
+
         public DownloadManagerInterface (DownloadManager manager)
         {
             if (manager == null) {
                 throw new ArgumentNullException ("manager");
             }
-            
-            this.manager = manager;            
+
+            this.manager = manager;
         }
-        
+
         public void Dispose ()
         {
             lock (sync) {
                 if (manager != null) {
-                    manager.Group.Started -= OnManagerStartedHandler;   
-                    manager.Group.Stopped -= OnManagerStoppedHandler;  
+                    manager.Group.Started -= OnManagerStartedHandler;
+                    manager.Group.Stopped -= OnManagerStoppedHandler;
                     manager.Group.ProgressChanged -= OnManagerProgressChangedHandler;
-                    manager.Group.StatusChanged -= OnManagerStatusChangedHandler; 
-                    
+                    manager.Group.StatusChanged -= OnManagerStatusChangedHandler;
+
                     manager = null;
                 }
             }
 
-            Gtk.Application.Invoke (delegate {                                
+            Gtk.Application.Invoke (delegate {
                 lock (sync) {
                     if (downloadJob != null) {
                         downloadJob.CancelRequested -= OnCancelRequested;
                         downloadJob.Finish ();
-                        downloadJob = null;   
-                        //SourceManager.RemoveSource (downloadSource);   
-                        //downloadSource = null;                    
-                    }        
+                        downloadJob = null;
+                        //SourceManager.RemoveSource (downloadSource);
+                        //downloadSource = null;
+                    }
                 }
-            });            
+            });
         }
-        
+
         public void Initialize ()
         {
-            //downloadSource = new DownloadManagerSource (manager);                        
-            manager.Group.Started += OnManagerStartedHandler;   
-            manager.Group.Stopped += OnManagerStoppedHandler;  
+            //downloadSource = new DownloadManagerSource (manager);
+            manager.Group.Started += OnManagerStartedHandler;
+            manager.Group.Stopped += OnManagerStoppedHandler;
             manager.Group.ProgressChanged += OnManagerProgressChangedHandler;
             manager.Group.StatusChanged += OnManagerStatusChangedHandler;
         }
 
         private void OnManagerStartedHandler (object sender, EventArgs e)
         {
-            Gtk.Application.Invoke (delegate {                                
+            Gtk.Application.Invoke (delegate {
                 lock (sync) {
                     if (downloadJob == null) {
-                        //SourceManager.AddSource (downloadSource);                                       
-                        
+                        //SourceManager.AddSource (downloadSource);
+
                         downloadJob = new DownloadUserJob ();
-                        downloadJob.CancelRequested += OnCancelRequested;  
+                        downloadJob.CancelRequested += OnCancelRequested;
                         downloadJob.Register ();
-                    }        
+                    }
                 }
-            });                
-        }          
-        
+            });
+        }
+
         private void OnManagerStoppedHandler (object sender, EventArgs e)
         {
-            Gtk.Application.Invoke (delegate {            
+            Gtk.Application.Invoke (delegate {
                 lock (sync) {
-                    if (downloadJob != null) {                        
+                    if (downloadJob != null) {
                         downloadJob.CancelRequested -= OnCancelRequested;
                         downloadJob.Finish ();
-                        downloadJob = null;   
-                        //SourceManager.RemoveSource (downloadSource);                                                            
+                        downloadJob = null;
+                        //SourceManager.RemoveSource (downloadSource);
                     }
                 }
             });
-        } 
+        }
 
-        private void OnManagerProgressChangedHandler (object sender, 
+        private void OnManagerProgressChangedHandler (object sender,
                                                       ProgressChangedEventArgs e)
         {
             Application.Invoke (delegate {
@@ -128,26 +128,26 @@ namespace Banshee.Podcasting.Gui
                         downloadJob.UpdateProgress (e.ProgressPercentage);
                     }
                 }
-            });                                
-        }   
+            });
+        }
 
-        private void OnManagerStatusChangedHandler (object sender, 
+        private void OnManagerStatusChangedHandler (object sender,
                                                     GroupStatusChangedEventArgs e)
         {
             DownloadGroupStatusChangedEventArgs args = e as DownloadGroupStatusChangedEventArgs;
-            
-            Application.Invoke (delegate {            
+
+            Application.Invoke (delegate {
                 lock (sync) {
                     if (downloadJob != null) {
                         downloadJob.UpdateStatus (args.RunningTasks, args.RemainingTasks, args.CompletedTasks, args.BytesPerSecond);
                     }
-                }             
-            });            
-        }         
-        
+                }
+            });
+        }
+
         private void OnCancelRequested (object sender, EventArgs e)
         {
             manager.Group.CancelAsync ();
-        }          
-    }   
+        }
+    }
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs
index db1977e..4cc6013 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -35,26 +35,26 @@ using Banshee.ServiceStack;
 
 namespace Banshee.Podcasting.Gui
 {
-    public class DownloadUserJob : UserJob 
+    public class DownloadUserJob : UserJob
     {
         private bool disposed = false;
         private bool canceled = false;
         private bool cancelRequested = false;
-        
+
         private readonly object sync = new object ();
 
         public DownloadUserJob () : base (Catalog.GetString ("Downloads"), String.Empty, String.Empty)
         {
             CancelRequested += OnCancelRequested;
-            
+
             Title = Catalog.GetString ("Downloading Podcast(s)");
-            Status = Catalog.GetString ("Initializing...");           
+            Status = Catalog.GetString ("Initializing...");
             CancelMessage = Catalog.GetString ("Cancel all podcast downloads?");
 
             this.IconNames = new string[1] {
                 Stock.Network
             };
-            
+
             CanCancel = true;
         }
 
@@ -66,24 +66,24 @@ namespace Banshee.Podcasting.Gui
                 } else if (cancelRequested) {
                     throw new InvalidOperationException ("Cannot dispose object while canceling.");
                 } else {
-                    disposed = true;   
+                    disposed = true;
                 }
-                
-                CancelRequested -= OnCancelRequested;                
+
+                CancelRequested -= OnCancelRequested;
             }
         }
-        
+
         private bool SetCanceled ()
         {
             bool ret = false;
-            
+
             lock (sync) {
                 if (!cancelRequested && !canceled && !disposed) {
                     CanCancel = false;
                     ret = cancelRequested = true;
                 }
             }
-            
+
             return ret;
         }
 
@@ -92,24 +92,24 @@ namespace Banshee.Podcasting.Gui
             if (progress < 0 || progress > 100) {
                 throw new ArgumentException ("progress:  Must be between 0 and 100.");
             }
-            
+
             lock (sync) {
                 if (canceled || cancelRequested || disposed) {
                     return;
                 }
-                
-                Progress = (double) progress / 100;                            
+
+                Progress = (double) progress / 100;
             }
         }
-        
+
         public void UpdateStatus (int downloading, int remaining, int completed, long bytesPerSecond)
         {
             if (downloading < 0) {
-                throw new ArgumentException ("downloading:  Must be positive.");                
+                throw new ArgumentException ("downloading:  Must be positive.");
             } else if (bytesPerSecond < 0) {
                 bytesPerSecond = 0;
             }
-            
+
             lock (sync) {
                 if (canceled || cancelRequested || disposed) {
                     return;
@@ -123,12 +123,12 @@ namespace Banshee.Podcasting.Gui
 
                 Status = String.Format (fmt, downloading, (bytesPerSecond / 1024), total);
             }
-        }   
-        
+        }
+
         private void OnCancelRequested (object sender, EventArgs e)
         {
             if (SetCanceled ()) {
-                lock (sync)  {            
+                lock (sync)  {
                     Progress = 0.0;
                     Title = Catalog.GetString ("Canceling Downloads");
                     Status = Catalog.GetString (
@@ -138,7 +138,7 @@ namespace Banshee.Podcasting.Gui
                     cancelRequested = false;
                     canceled = true;
                 }
-            }           
+            }
         }
     }
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/FilterableListModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/FilterableListModel.cs
index b0b11c1..b92ec9a 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/FilterableListModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/FilterableListModel.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Reflection;
 
@@ -36,11 +36,11 @@ using System.Collections.ObjectModel;
 using Hyena.Data;
 using Hyena.Collections;
 using Banshee.Collection;
- 
+
 namespace Banshee.Podcasting.Gui
-{           
-    // It would be cool to move the filtering functionality to an external class 
-    // that could be applied to models directly, or chained together before being applied. 
+{
+    // It would be cool to move the filtering functionality to an external class
+    // that could be applied to models directly, or chained together before being applied.
     /*public class FilterableListModel<T> : ListModel<T>
     {
         private Predicate<T> filter;
@@ -58,7 +58,7 @@ namespace Banshee.Podcasting.Gui
         protected override List<T> List {
             get { lock (SyncRoot) { return filteredList ?? base.List; } }
         }
-        
+
         public FilterableListModel ()
         {
         }
@@ -68,7 +68,7 @@ namespace Banshee.Podcasting.Gui
             lock (SyncRoot) {
                 base.List.Clear ();
                 filteredList = null;
-                
+
                 OnCleared ();
             }
         }
@@ -83,7 +83,7 @@ namespace Banshee.Podcasting.Gui
 
         public override void Add (IEnumerable<T> fe)
         {
-            lock (SyncRoot) {            
+            lock (SyncRoot) {
                 base.List.AddRange (fe);
                 UpdateFilter ();
             }
@@ -91,7 +91,7 @@ namespace Banshee.Podcasting.Gui
 
         public override bool Contains (T item)
         {
-            lock (SyncRoot) {        
+            lock (SyncRoot) {
                 return IndexOf (item) != -1;
             }
         }
@@ -100,19 +100,19 @@ namespace Banshee.Podcasting.Gui
         {
             lock (SyncRoot) {
                 if (filter != null) {
-                    filteredList = base.List.FindAll (filter);                   
+                    filteredList = base.List.FindAll (filter);
                 } else {
                     filteredList = null;
                 }
-                
+
                 Sort ();
-                Reload ();                   
-            }                    
+                Reload ();
+            }
         }
 
         public override void Remove (T item)
         {
-            lock (SyncRoot) {            
+            lock (SyncRoot) {
                 base.List.Remove (item);
                 UpdateFilter ();
             }
@@ -120,34 +120,34 @@ namespace Banshee.Podcasting.Gui
 
         public override void Remove (IEnumerable<T> fe)
         {
-            lock (SyncRoot) {        
+            lock (SyncRoot) {
                 foreach (T f in fe) {
                     base.List.Remove (f);
                 }
-                
+
                 UpdateFilter ();
             }
         }
 
         public override T this[int index] {
-            get { 
-                lock (SyncRoot) {                
+            get {
+                lock (SyncRoot) {
                     return (index < Count) ? List[index] : default (T);
                 }
             }
         }
 
-        public override int Count { 
-            get { 
-                lock (SyncRoot) { 
-                    return List.Count; 
+        public override int Count {
+            get {
+                lock (SyncRoot) {
+                    return List.Count;
                 }
             }
         }
-        
+
         public override int IndexOf (T item)
         {
-            lock (SyncRoot) {            
+            lock (SyncRoot) {
                 return List.IndexOf (item);
             }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/ListModel.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/ListModel.cs
index 66750a0..8897001 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/ListModel.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/Models/ListModel.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Reflection;
 
@@ -36,29 +36,29 @@ using System.Collections.ObjectModel;
 using Hyena.Data;
 using Hyena.Collections;
 using Banshee.Collection;
- 
+
 namespace Banshee.Podcasting.Gui
-{        
+{
     public abstract class SortTypeComparer<T> : IComparer<T>
     {
         private readonly SortType type;
-        
+
         public SortType SortType {
             get { return type; }
         }
-        
+
         public SortTypeComparer (SortType type)
         {
             this.type = type;
         }
-        
+
         public abstract int Compare (T lhs, T rhs);
     }
 
     /*public class ListModel<T> : BansheeListModel<T>, ISortable
     {
         private ISortableColumn sortColumn;
-        
+
         private List<T> list = new List<T> ();
         private readonly object sync;
 
@@ -69,7 +69,7 @@ namespace Banshee.Podcasting.Gui
         protected virtual List<T> List {
             get { return list; }
         }
-        
+
         public override Selection Selection {
             get { lock (sync) { return selection; } }
         }
@@ -80,13 +80,13 @@ namespace Banshee.Podcasting.Gui
 
         public virtual ISortableColumn SortColumn {
             get { return sortColumn; }
-            protected set { sortColumn = value; }            
-        }      
-        
+            protected set { sortColumn = value; }
+        }
+
         public ListModel ()
         {
             selection = new Selection ();
-            sync = ((ICollection)list).SyncRoot;    
+            sync = ((ICollection)list).SyncRoot;
         }
 
         public override void Clear ()
@@ -96,7 +96,7 @@ namespace Banshee.Podcasting.Gui
                 OnCleared ();
             }
         }
-        
+
         public override void Reload ()
         {
             OnReloaded ();
@@ -113,16 +113,16 @@ namespace Banshee.Podcasting.Gui
 
         public virtual void Add (IEnumerable<T> fe)
         {
-            lock (sync) {            
+            lock (sync) {
                 list.AddRange (fe);
-                Sort ();                
-                Reload ();         
+                Sort ();
+                Reload ();
             }
         }
 
         public virtual bool Contains (T item)
         {
-            lock (sync) {        
+            lock (sync) {
                 return IndexOf (item) != -1;
             }
         }
@@ -132,29 +132,29 @@ namespace Banshee.Podcasting.Gui
             lock (sync) { return new ReadOnlyCollection<T> (list); }
         }
 
-        public virtual ReadOnlyCollection<T> CopySelectedItems () 
+        public virtual ReadOnlyCollection<T> CopySelectedItems ()
         {
             List<T> items = null;
-            
+
             lock (sync) {
                 ModelSelection<T> selected = SelectedItems;
-                
+
                 if (selected.Count > 0) {
                     items = new List<T> (selected.Count);
-                    
+
                     foreach (T t in selected) {
-                        items.Add (t);   
+                        items.Add (t);
                     }
                 }
             }
 
-            return (items != null) ? 
+            return (items != null) ?
                 new ReadOnlyCollection<T> (items) : null;
         }
 
         public virtual void Remove (T item)
         {
-            lock (sync) {            
+            lock (sync) {
                 list.Remove (item);
                 Sort ();
                 Reload ();
@@ -163,46 +163,46 @@ namespace Banshee.Podcasting.Gui
 
         public virtual void Remove (IEnumerable<T> fe)
         {
-            lock (sync) {        
+            lock (sync) {
                 foreach (T f in fe) {
                     list.Remove (f);
                 }
-                
+
                 Sort ();
-                Reload ();      
+                Reload ();
             }
         }
 
         public override T this[int index] {
-            get { 
-                lock (sync) {                
+            get {
+                lock (sync) {
                     return (index < list.Count) ? list[index] : default (T);
                 }
             }
         }
 
-        public override int Count { 
-            get { 
-                lock (sync) { 
-                    return list.Count; 
+        public override int Count {
+            get {
+                lock (sync) {
+                    return list.Count;
                 }
             }
         }
-        
+
         public virtual int IndexOf (T item)
         {
-            lock (sync) {            
+            lock (sync) {
                 return list.IndexOf (item);
             }
         }
-        
+
         public virtual void Sort ()
-        {       
-        }        
-        
+        {
+        }
+
         public virtual void Sort (ISortableColumn column)
         {
-            lock (sync) {                
+            lock (sync) {
                 if (column == SortColumn) {
                     column.SortType = (column.SortType == SortType.Ascending) ?
                         SortType.Descending : SortType.Ascending;
@@ -211,7 +211,7 @@ namespace Banshee.Podcasting.Gui
                 }
 
                 Sort ();
-            }         
+            }
         }
     }*/
 }
\ No newline at end of file
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
index 1a137e1..00fd7a3 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
@@ -57,61 +57,61 @@ namespace Banshee.Podcasting.Gui
     {
         private uint actions_id;
         private DatabaseSource last_source;
-        
+
         public PodcastActions (PodcastSource source) : base (ServiceManager.Get<InterfaceActionService> (), "Podcast")
         {
             AddImportant (
                 new ActionEntry (
                     "PodcastUpdateAllAction", Stock.Refresh,
                      Catalog.GetString ("Check for New Episodes"), null,//"<control><shift>U",
-                     Catalog.GetString ("Refresh All Podcasts"), 
+                     Catalog.GetString ("Refresh All Podcasts"),
                      OnPodcastUpdateAll
                 ),
                 new ActionEntry (
                     "PodcastAddAction", Stock.Add,
-                     Catalog.GetString ("Subscribe to Podcast..."),"<control><shift>F", 
+                     Catalog.GetString ("Subscribe to Podcast..."),"<control><shift>F",
                      Catalog.GetString ("Subscribe to a new podcast"),
                      OnPodcastAdd
-                )         
+                )
             );
-            
+
             Add (
-                new ActionEntry("PodcastFeedPopupAction", null, 
+                new ActionEntry("PodcastFeedPopupAction", null,
                     String.Empty, null, null, OnFeedPopup),
-                    
+
                 new ActionEntry (
                     "PodcastDeleteAction", Stock.Delete,
                      Catalog.GetString ("Unsubscribe and Delete"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastDelete
                 ),
                 new ActionEntry (
                     "PodcastUpdateFeedAction", Stock.Refresh,
                      Catalog.GetString ("Check for New Episodes"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastUpdate
                 ),
                 new ActionEntry (
                     "PodcastDownloadAllAction", Stock.Save,
                      Catalog.GetString ("Download All Episodes"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastDownloadAllEpisodes
                 ),
                 new ActionEntry (
                     "PodcastHomepageAction", Stock.JumpTo,
                      Catalog.GetString ("Visit Podcast Homepage"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastHomepage
                 ),
                 new ActionEntry (
                     "PodcastPropertiesAction", Stock.Properties,
                      Catalog.GetString ("Properties"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastProperties
                 ),
                 new ActionEntry (
                     "PodcastItemMarkNewAction", null,
-                     Catalog.GetString ("Mark as New"), 
+                     Catalog.GetString ("Mark as New"),
                      null, String.Empty,
                      OnPodcastItemMarkNew
                 ),
@@ -124,37 +124,37 @@ namespace Banshee.Podcasting.Gui
                     "PodcastItemDownloadAction", Stock.Save,
                      /* Translators: this is a verb used as a button name, not a noun*/
                      Catalog.GetString ("Download Podcast(s)"),
-                     "<control><shift>D", String.Empty, 
+                     "<control><shift>D", String.Empty,
                      OnPodcastItemDownload
                 ),
                 new ActionEntry (
                     "PodcastItemCancelAction", Stock.Cancel,
                      Catalog.GetString ("Cancel Download"),
-                     "<control><shift>C", String.Empty, 
+                     "<control><shift>C", String.Empty,
                      OnPodcastItemCancel
                 ),
                 new ActionEntry (
                     "PodcastItemDeleteFileAction", Stock.Remove,
                      Catalog.GetString ("Remove Downloaded File(s)"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastItemDeleteFile
                 ),
                 new ActionEntry (
                     "PodcastItemLinkAction", Stock.JumpTo,
                      Catalog.GetString ("Visit Website"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastItemLink
                 ),
                 new ActionEntry (
                     "PodcastItemPropertiesAction", Stock.Properties,
                      Catalog.GetString ("Properties"),
-                     null, String.Empty, 
+                     null, String.Empty,
                      OnPodcastItemProperties
                 )
             );
 
             this["PodcastAddAction"].ShortLabel = Catalog.GetString ("Subscribe to Podcast");
-            
+
             actions_id = Actions.UIManager.AddUiFromResource ("GlobalUI.xml");
             Actions.AddActionGroup (this);
 
@@ -170,7 +170,7 @@ namespace Banshee.Podcasting.Gui
         }
 
 #region State Event Handlers
-        
+
         private void HandleActiveSourceChanged (SourceEventArgs args)
         {
             if (last_source != null) {
@@ -244,7 +244,7 @@ namespace Banshee.Podcasting.Gui
                 );
             }
         }
-        
+
         private void UpdateFeedActions ()
         {
             if (IsPodcastSource) {
@@ -263,7 +263,7 @@ namespace Banshee.Podcasting.Gui
                 );
             }
         }
-        
+
         private void SubscribeToPodcast (Uri uri, FeedAutoDownload syncPreference)
         {
             FeedsManager.Instance.FeedManager.CreateFeed (uri.ToString (), syncPreference);
@@ -276,7 +276,7 @@ namespace Banshee.Podcasting.Gui
 
 #endregion
 
-                
+
 #region Action Handlers
 
         private void OnFeedPopup (object o, EventArgs args)
@@ -289,24 +289,24 @@ namespace Banshee.Podcasting.Gui
         }
 
         private void RunSubscribeDialog ()
-        {        
+        {
             Uri feedUri = null;
             FeedAutoDownload syncPreference;
-            
+
             PodcastSubscribeDialog subscribeDialog = new PodcastSubscribeDialog ();
-            
+
             ResponseType response = (ResponseType) subscribeDialog.Run ();
             syncPreference = subscribeDialog.SyncPreference;
-            
+
             subscribeDialog.Destroy ();
 
             if (response == ResponseType.Ok) {
                 string url = subscribeDialog.Url.Trim ().Trim ('/');
-                
+
                 if (String.IsNullOrEmpty (subscribeDialog.Url)) {
                     return;
                 }
-                
+
 				if (!TryParseUrl (url, out feedUri)) {
                     HigMessageDialog.RunHigMessageDialog (
                         null,
@@ -317,19 +317,19 @@ namespace Banshee.Podcasting.Gui
                         Catalog.GetString ("Podcast URL is invalid.")
                     );
 				} else {
-				    SubscribeToPodcast (feedUri, syncPreference); 
+				    SubscribeToPodcast (feedUri, syncPreference);
 				}
-            }        
+            }
         }
-        
-        /*private void RunConfirmDeleteDialog (bool feed, 
-                                             int selCount, 
-                                             out bool delete, 
+
+        /*private void RunConfirmDeleteDialog (bool feed,
+                                             int selCount,
+                                             out bool delete,
                                              out bool deleteFiles)
         {
-            
+
             delete = false;
-            deleteFiles = false;        
+            deleteFiles = false;
             string header = null;
             int plural = (feed | (selCount > 1)) ? 2 : 1;
 
@@ -338,27 +338,27 @@ namespace Banshee.Podcasting.Gui
             } else {
                 header = Catalog.GetPluralString ("Delete episode?", "Delete episodes?", selCount);
             }
-                
+
             HigMessageDialog md = new HigMessageDialog (
                 ServiceManager.Get<GtkElementsService> ("GtkElementsService").PrimaryWindow,
-                DialogFlags.DestroyWithParent, 
+                DialogFlags.DestroyWithParent,
                 MessageType.Question,
-                ButtonsType.None, header, 
+                ButtonsType.None, header,
                 Catalog.GetPluralString (
                     "Would you like to delete the associated file?",
-                    "Would you like to delete the associated files?", plural                
+                    "Would you like to delete the associated files?", plural
                 )
             );
-            
+
             md.AddButton (Stock.Cancel, ResponseType.Cancel, true);
             md.AddButton (
                 Catalog.GetPluralString (
                     "Keep File", "Keep Files", plural
                 ), ResponseType.No, false
             );
-            
+
             md.AddButton (Stock.Delete, ResponseType.Yes, false);
-            
+
             try {
                 switch ((ResponseType)md.Run ()) {
                 case ResponseType.Yes:
@@ -367,12 +367,12 @@ namespace Banshee.Podcasting.Gui
                 case ResponseType.No:
                     delete = true;
                     break;
-                }                
+                }
             } finally {
                 md.Destroy ();
-            }       
+            }
         }*/
-        
+
 		private bool TryParseUrl (string url, out Uri uri)
 		{
 			uri = null;
@@ -381,35 +381,35 @@ namespace Banshee.Podcasting.Gui
             try {
                 uri = new Uri (url);
 				
-				if (uri.Scheme == Uri.UriSchemeHttp || 
+				if (uri.Scheme == Uri.UriSchemeHttp ||
 				    uri.Scheme == Uri.UriSchemeHttps) {
 					ret = true;
 				}
             } catch {}
-            
+
             return ret;			
 		}
 
         /*private void OnFeedSelectionChangedHandler (object sender, EventArgs e)
         {
             lock (sync) {
-                if (!disposed || disposing) {              
+                if (!disposed || disposing) {
                     if (source.FeedModel.SelectedItems.Count == 0) {
                         source.FeedModel.Selection.Select (0);
                     }
-                    
+
                     if (source.FeedModel.Selection.Contains (0)) {
                         itemModel.FilterOnFeed (Feed.All);
                     } else {
                         itemModel.FilterOnFeeds (source.FeedModel.CopySelectedItems ());
                     }
-                    
+
                     itemModel.Selection.Clear ();
                 }
             }
         }
-        
-        private void OnPodcastItemRowActivatedHandler (object sender, 
+
+        private void OnPodcastItemRowActivatedHandler (object sender,
                                                        RowActivatedArgs<PodcastItem> e)
         {
             lock (sync) {
@@ -426,21 +426,21 @@ namespace Banshee.Podcasting.Gui
         {
             RunSubscribeDialog ();
         }
-        
+
         private void OnPodcastUpdate (object sender, EventArgs e)
         {
             foreach (Feed feed in ActiveFeedModel.SelectedItems) {
                 feed.Update ();
             }
-        }        
-        
+        }
+
         private void OnPodcastUpdateAll (object sender, EventArgs e)
         {
             foreach (Feed feed in Feed.Provider.FetchAll ()) {
                 feed.Update ();
             }
-        }      
-        
+        }
+
         private void OnPodcastDelete (object sender, EventArgs e)
         {
             foreach (Feed feed in ActiveFeedModel.SelectedItems) {
@@ -449,7 +449,7 @@ namespace Banshee.Podcasting.Gui
                 }
             }
         }
-        
+
         private void OnPodcastDownloadAllEpisodes (object sender, EventArgs e)
         {
             foreach (Feed feed in ActiveFeedModel.SelectedItems) {
@@ -474,8 +474,8 @@ namespace Banshee.Podcasting.Gui
             Feed feed = ActiveFeedModel.FocusedItem;
             if (feed != null && !String.IsNullOrEmpty (feed.Link)) {
                 Banshee.Web.Browser.Open (feed.Link);
-            }   
-        }   
+            }
+        }
 
         private void OnPodcastProperties (object sender, EventArgs e)
         {
@@ -483,33 +483,33 @@ namespace Banshee.Podcasting.Gui
             if (feed != null) {
                 new PodcastFeedPropertiesDialog (feed).Run ();
             }
-        }  
+        }
 
         private void OnPodcastItemProperties (object sender, EventArgs e)
         {
                 /*ReadOnlyCollection<PodcastItem> items = itemModel.CopySelectedItems ();
-                
+
                 if (items != null && items.Count == 1) {
                     new PodcastPropertiesDialog (items[0]).Run ();
-                } */                
-        } 
+                } */
+        }
 
         private void OnPodcastItemMarkNew (object sender, EventArgs e)
         {
             MarkPodcastItemSelection (false);
         }
-        
+
         private void OnPodcastItemMarkOld (object sender, EventArgs e)
         {
             MarkPodcastItemSelection (true);
-        }     
-        
-        private void MarkPodcastItemSelection (bool markRead) 
+        }
+
+        private void MarkPodcastItemSelection (bool markRead)
         {
             TrackInfo new_selection_track = ActiveDbSource.TrackModel [ActiveDbSource.TrackModel.Selection.LastIndex + 1];
-            
+
             PodcastService.IgnoreItemChanges = true;
-            
+
             bool any = false;
             foreach (PodcastTrackInfo track in PodcastTrackInfo.From (GetSelectedItems ())) {
                 if (track.Item.IsRead != markRead) {
@@ -523,12 +523,12 @@ namespace Banshee.Podcasting.Gui
                     any = true;
                 }
             }
-            
+
             PodcastService.IgnoreItemChanges = false;
-            
+
             if (any) {
                 ActiveDbSource.Reload ();
-                
+
                 // If we just removed all of the selected items from our view, we should select the
                 // item after the last removed item
                 if (ActiveDbSource.TrackModel.Selection.Count == 0 && new_selection_track != null) {
@@ -541,29 +541,28 @@ namespace Banshee.Podcasting.Gui
                 }
             }
         }
-        
+
         private void OnPodcastItemCancel (object sender, EventArgs e)
         {
             /*
-                if (!disposed || disposing) {                    
+                if (!disposed || disposing) {
                     ReadOnlyCollection<PodcastItem> items = itemModel.CopySelectedItems ();
 
                     if (items != null) {
                         foreach (PodcastItem pi in items) {
                             pi.Enclosure.CancelAsyncDownload ();
                         }
-                    }                
+                    }
                 }*/
-        }        
-        
+        }
+
         private void OnPodcastItemDownload (object sender, EventArgs e)
         {
             foreach (PodcastTrackInfo pi in PodcastTrackInfo.From (GetSelectedItems ())) {
-                if (pi.Enclosure.DownloadStatus != FeedDownloadStatus.Downloaded)
-                    pi.Enclosure.AsyncDownload ();
+                pi.Enclosure.AsyncDownload ();
             }
         }
-        
+
         private void OnPodcastItemLink (object sender, EventArgs e)
         {
             PodcastTrackInfo track = PodcastTrackInfo.From (ActiveDbSource.TrackModel.FocusedItem);
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs
index f2f3cd6..82574c9 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastEpisodePage.cs
@@ -55,7 +55,7 @@ namespace Banshee.Podcasting.Gui
             ShadowType = ShadowType.None;
             HscrollbarPolicy = PolicyType.Never;
             VscrollbarPolicy = PolicyType.Automatic;
-            
+
             box = new VBox ();
             box.BorderWidth = 6;
             box.Spacing = 12;
@@ -64,15 +64,15 @@ namespace Banshee.Podcasting.Gui
             box.PackStart (author,      false, false, 0);
             box.PackStart (published,   false, false, 0);
             box.PackStart (description, true, true, 0);
-            
+
             AddWithViewport (box);
             ShowAll ();
         }
-        
+
         public void Initialize (TrackEditorDialog dialog)
         {
         }
-        
+
         public void LoadTrack (EditorTrackInfo track)
         {
             BorderWidth = 2;
@@ -100,23 +100,23 @@ namespace Banshee.Podcasting.Gui
                 GLib.Markup.EscapeText (info)
             );
         }
-        
+
         public int Order {
             get { return 40; }
         }
-        
+
         public string Title {
             get { return Catalog.GetString ("Episode Details"); }
         }
-        
-        public PageType PageType { 
+
+        public PageType PageType {
             get { return PageType.View; }
         }
-        
-        public Gtk.Widget TabWidget { 
+
+        public Gtk.Widget TabWidget {
             get { return null; }
         }
-        
+
         public Gtk.Widget Widget {
             get { return this; }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastFeedView.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastFeedView.cs
index 6455c1b..9ef40e7 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastFeedView.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastFeedView.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections.ObjectModel;
 
@@ -54,11 +54,11 @@ namespace Banshee.Podcasting.Gui
             ColumnCellPodcast renderer = new ColumnCellPodcast ();
             column_controller.Add (new Column ("Podcast", renderer, 1.0));
             //column_controller.Add (new Column (null, "Activity", new FeedActivityColumnCell ("Activity"), 0.00, true, 26, 26));
-            
+
             ColumnController = column_controller;
             RowHeightProvider = renderer.ComputeRowHeight;
         }
-        
+
         protected override bool OnPopupMenu ()
         {
             ServiceManager.Get<InterfaceActionService> ().FindAction ("Podcast.PodcastFeedPopupAction").Activate ();
@@ -69,55 +69,55 @@ namespace Banshee.Podcasting.Gui
     /*public class PodcastFeedView : ListView<Feed>
     {
         private ColumnController columnController;
-        
+
         public PodcastFeedView () : base ()
         {
             columnController = new ColumnController ();
-            
+
             SortableColumn podcastFeedTitleColumn = new SortableColumn (
-                    Catalog.GetString ("Podcasts"), 
-                    new ColumnCellText ("Title", true), 0.97, 
+                    Catalog.GetString ("Podcasts"),
+                    new ColumnCellText ("Title", true), 0.97,
                     PodcastSortKeys.Title, true
-            );         
+            );
 
             columnController.AddRange (
                 new Column (null, "Activity", new FeedActivityColumnCell ("Activity"), 0.00, true, 26, 26),
-                podcastFeedTitleColumn                
+                podcastFeedTitleColumn
             );
-            
+
             RulesHint = true;
             podcastFeedTitleColumn.SortType = Hyena.Data.SortType.Descending;
-            columnController.DefaultSortColumn = podcastFeedTitleColumn;            
+            columnController.DefaultSortColumn = podcastFeedTitleColumn;
             ColumnController = columnController;
-        }    
-        
+        }
+
         private Menu allPopup;
         private Menu popupMenu;
         private MenuItem homepageItem;
         private MenuItem propertiesItem;
         private MenuItem updateAllItem;
-        
+
         protected override bool OnPopupMenu ()
         {
             if (popupMenu == null) {
                 UIManager uiManager = ServiceManager.Get<InterfaceActionService> ().UIManager;
-                
+
                 allPopup = uiManager.GetWidget ("/PodcastSourcePopup") as Menu;
                 popupMenu = uiManager.GetWidget ("/PodcastFeedViewPopup") as Menu;
-                
+
                 updateAllItem = uiManager.GetWidget ("/PodcastFeedViewPopup/PodcastUpdateAll") as MenuItem;
                 propertiesItem = uiManager.GetWidget ("/PodcastFeedViewPopup/PodcastProperties") as MenuItem;
                 homepageItem = uiManager.GetWidget ("/PodcastFeedViewPopup/PodcastHomepage") as MenuItem;
             }
-            
+
             Menu popup;
             PodcastFeedModel model = Model as PodcastFeedModel;
-            
+
             ReadOnlyCollection<Feed> feeds = model.CopySelectedItems ();
-            
+
             if (feeds.Count == 0) {
-                popup = allPopup;         
-            } else { 
+                popup = allPopup;
+            } else {
                 if (feeds.Count > 1) {
                     homepageItem.Hide ();
                     propertiesItem.Hide ();
@@ -125,7 +125,7 @@ namespace Banshee.Podcasting.Gui
                     homepageItem.Show ();
                     propertiesItem.Show ();
                 }
-                
+
                 popup = popupMenu;
             }
 
@@ -133,6 +133,6 @@ namespace Banshee.Podcasting.Gui
 
             popup.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
             return true;
-        } 
+        }
     }*/
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
index 6825962..175db08 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
@@ -5,33 +5,33 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections.ObjectModel;
 
 using Gtk;
 using Mono.Unix;
- 
+
 using Hyena.Data;
 using Hyena.Data.Gui;
 
@@ -50,92 +50,92 @@ namespace Banshee.Podcasting.Gui
     /*public class PodcastItemView : ListView<TrackInfo>
     {
         private PersistentColumnController columnController;
-        
+
         public PodcastItemView () : base ()
         {
             columnController = new PersistentColumnController ("plugins.podcasting.item_view_columns");
-            
+
             SortableColumn podcastTitleSortColumn = new SortableColumn (
-                Catalog.GetString ("Podcast"), 
-                new ColumnCellText ("AlbumTitle", true), 0.35, 
+                Catalog.GetString ("Podcast"),
+                new ColumnCellText ("AlbumTitle", true), 0.35,
                 PodcastItemSortKeys.PodcastTitle, true
             );
-            
+
             columnController.AddRange (
-                new Column (null, Catalog.GetString ("Activity"), new PodcastItemActivityColumn ("Activity"), 0.00, true, 26, 26),            
+                new Column (null, Catalog.GetString ("Activity"), new PodcastItemActivityColumn ("Activity"), 0.00, true, 26, 26),
                 new SortableColumn (Catalog.GetString ("Title"), new ColumnCellText ("TrackTitle", true), 0.30, PodcastItemSortKeys.Title, true),
                 podcastTitleSortColumn,
                 new SortableColumn (Catalog.GetString ("Date"), new ColumnCellDateTime ("ReleaseDate", false), 0.5, PodcastItemSortKeys.PubDate, true)
             );
-            
+
             podcastTitleSortColumn.SortType = Hyena.Data.SortType.Descending;
             columnController.DefaultSortColumn = podcastTitleSortColumn;
-            
+
             ColumnController = columnController;
             columnController.Load ();
-            
+
             RulesHint = true;
-        }  
-        
+        }
+
         private Menu popupMenu;
-        private MenuItem cancelItem;       
-        private MenuItem downloadItem;       
-        private MenuItem linkItem;            
+        private MenuItem cancelItem;
+        private MenuItem downloadItem;
+        private MenuItem linkItem;
         private MenuItem propertiesItem;
-        
+
         private MenuItem markNewItem;
         private MenuItem markOldItem;
-        
+
         protected override bool OnPopupMenu ()
         {
             if (popupMenu == null) {
                 UIManager uiManager = ServiceManager.Get<InterfaceActionService> ().UIManager;
-                
+
                 popupMenu = uiManager.GetWidget ("/PodcastItemViewPopup") as Menu;
-                
+
                 cancelItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemCancel") as MenuItem;
-                downloadItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemDownload") as MenuItem; 
-                
+                downloadItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemDownload") as MenuItem;
+
                 propertiesItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemProperties") as MenuItem;
-                linkItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemLink") as MenuItem;                
-            
+                linkItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemLink") as MenuItem;
+
                 markNewItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemMarkNew") as MenuItem;
-                markOldItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemMarkOld") as MenuItem;              
+                markOldItem = uiManager.GetWidget ("/PodcastItemViewPopup/PodcastItemMarkOld") as MenuItem;
             }
-            
+
             DatabaseTrackListModel model = Model as DatabaseTrackListModel;
-            
-            bool showCancel = false;            
+
+            bool showCancel = false;
             bool showDownload = false;
-            
+
             bool showMarkNew = false;
             bool showMarkOld = false;
-            
+
             ModelSelection<Banshee.Collection.TrackInfo> items = model.SelectedItems;
-            
+
             foreach (PodcastTrackInfo i in items) {
                 if (showCancel && showDownload && showMarkNew && showMarkOld) {
                     break;
                 } else if (!showDownload &&
                     i.Activity == PodcastItemActivity.None ||
-                    i.Activity == PodcastItemActivity.DownloadFailed                     
+                    i.Activity == PodcastItemActivity.DownloadFailed
                 ) {
                     showDownload = true;
                 } else if (!showCancel &&
                     i.Activity == PodcastItemActivity.Downloading ||
                     i.Activity == PodcastItemActivity.DownloadPending ||
-                    i.Activity == PodcastItemActivity.DownloadPaused                     
+                    i.Activity == PodcastItemActivity.DownloadPaused
                 ) {
                     showCancel = true;
                 }/* else if ((!showMarkNew || !showMarkOld)) {
                     if (i.New) {
                         showMarkOld = true;
-                    } else { 
+                    } else {
                         showMarkNew = true;
                     }
                 }*/
             /*}
-            
+
             if (items.Count > 1) {
                 linkItem.Hide ();
                 propertiesItem.Hide ();
@@ -143,15 +143,15 @@ namespace Banshee.Podcasting.Gui
                 linkItem.Show ();
                 propertiesItem.Show ();
             }
-            
+
             if (showCancel) {
                 cancelItem.Show ();
             } else {
                 cancelItem.Hide ();
-            }            
-            
+            }
+
             if (showDownload) {
-                downloadItem.Show ();   
+                downloadItem.Show ();
             } else {
                 downloadItem.Hide ();
             }
@@ -159,17 +159,17 @@ namespace Banshee.Podcasting.Gui
             if (showMarkNew) {
                 markNewItem.Show ();
             } else {
-                markNewItem.Hide ();            
+                markNewItem.Hide ();
             }
 
             if (showMarkOld) {
                 markOldItem.Show ();
             } else {
-                markOldItem.Hide ();            
+                markOldItem.Hide ();
             }
 
             popupMenu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime);
-            
+
             return true;
         }
     }*/
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
index 1d168b5..3a30d04 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs
@@ -7,21 +7,21 @@
 /*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs
index 81e0672..823b7be 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs
@@ -7,21 +7,21 @@
 /*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -49,9 +49,9 @@ namespace Banshee.Podcasting.Gui
             {
                 throw new ArgumentNullException ("pi");
             }
-            
-            this.pi = pi;            
-            
+
+            this.pi = pi;
+
             Title = track.TrackTitle;
             BuildWindow ();
             //IconThemeUtils.SetWindowIcon (this);
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
index afecbce..02ef1e6 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -46,7 +46,7 @@ namespace Banshee.Podcasting.Gui
     {
         private Entry url_entry;
         private Gtk.AccelGroup accelGroup;
-        private SyncPreferenceComboBox syncCombo;        
+        private SyncPreferenceComboBox syncCombo;
 
         public string Url {
             get { return url_entry.Text; }
@@ -78,11 +78,11 @@ namespace Banshee.Podcasting.Gui
             box.Spacing = 12;
 
             Image image = new Image (IconThemeUtils.LoadIcon (48, "podcast"));
-            
+
             image.Yalign = 0.0f;
-            
+
             box.PackStart(image, false, true, 0);
-            
+
             VBox contentBox = new VBox();
             contentBox.Spacing = 12;
 
@@ -91,7 +91,7 @@ namespace Banshee.Podcasting.Gui
                 "<big><b>{0}</b></big>",
                 GLib.Markup.EscapeText (Catalog.GetString ("Subscribe to New Podcast"))
             );
-            
+
             header.Justify = Justification.Left;
             header.SetAlignment (0.0f, 0.0f);
 
@@ -99,7 +99,7 @@ namespace Banshee.Podcasting.Gui
             message.Markup = Catalog.GetString (
                 "Please enter the URL of the podcast to which you would like to subscribe."
             );
-            
+
             message.Wrap = true;
 
             VBox sync_vbox = new VBox ();
@@ -111,7 +111,7 @@ namespace Banshee.Podcasting.Gui
             Label sync_text = new Label (
                 Catalog.GetString ("When new episodes are available:  ")
             );
-            
+
             sync_text.SetAlignment (0.0f, 0.0f);
             sync_text.Justify = Justification.Left;
 
@@ -142,7 +142,7 @@ namespace Banshee.Podcasting.Gui
             table.RowSpacing = 6;
             table.ColumnSpacing = 12;
 
-            table.Attach ( 
+            table.Attach (
                 new Label (Catalog.GetString ("URL:")), 0, 1, 0, 1,
                 AttachOptions.Shrink, AttachOptions.Shrink, 0, 0
             );
@@ -150,7 +150,7 @@ namespace Banshee.Podcasting.Gui
             table.Attach (
                 url_entry, 1, 2, 0, 1,
                 AttachOptions.Expand | AttachOptions.Fill,
-                AttachOptions.Shrink, 0, 0            
+                AttachOptions.Shrink, 0, 0
             );
 
             table.Attach (
@@ -168,7 +168,7 @@ namespace Banshee.Podcasting.Gui
 
             AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, true);
             AddButton (Catalog.GetString ("Subscribe"), ResponseType.Ok, true);
-            
+
             box.ShowAll ();
             VBox.Add (box);
         }
@@ -185,7 +185,7 @@ namespace Banshee.Podcasting.Gui
                 DefaultResponse = response;
 
                 button.AddAccelerator (
-                    "activate", accelGroup, 
+                    "activate", accelGroup,
                     (uint) Gdk.Key.Escape, 0, Gtk.AccelFlags.Visible
                 );
             }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs
index 3a3c4b6..7d8bc8d 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Dialog/SyncPreferenceComboBox.cs
@@ -8,24 +8,24 @@
 /*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using Gtk;
 using System;
 using Mono.Unix;
@@ -43,7 +43,7 @@ namespace Banshee.Podcasting.Gui
             Catalog.GetString ("Let me decide which episodes to download")
         };
 
-        public FeedAutoDownload ActiveSyncPreference 
+        public FeedAutoDownload ActiveSyncPreference
         {
             get { return (FeedAutoDownload) Active; }
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
index 66a6a60..813b44d 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
@@ -5,32 +5,32 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
-using Gtk; 
- 
-using Hyena.Data; 
+using Gtk;
+
+using Hyena.Data;
 using Hyena.Data.Gui;
 
 using Migo.Syndication;
@@ -57,7 +57,7 @@ namespace Banshee.Podcasting.Gui
         private PodcastFeedView feed_view;
         private PodcastUnheardFilterView unheard_view;
         private DownloadStatusFilterView download_view;
-        
+
         public PodcastSourceContents () : base ("podcast")
         {
         }
@@ -69,7 +69,7 @@ namespace Banshee.Podcasting.Gui
             SetupFilterView (download_view = new DownloadStatusFilterView ());
             SetupFilterView (feed_view = new PodcastFeedView ());
         }
-        
+
         protected override void ClearFilterSelections ()
         {
             if (feed_view.Model != null) {
@@ -95,11 +95,11 @@ namespace Banshee.Podcasting.Gui
             if (track_source == null) {
                 return false;
             }
-            
+
             this.source = source;
-            
+
             SetModel (track_view, track_source.TrackModel);
-            
+
             foreach (IListModel model in track_source.CurrentFilters) {
                 if (model is PodcastFeedModel)
                     SetModel (feed_view, (model as IListModel<Feed>));
@@ -110,7 +110,7 @@ namespace Banshee.Podcasting.Gui
                 else
                     Hyena.Log.DebugFormat ("PodcastContents got non-feed filter model: {0}", model);
             }
-            
+
             track_view.HeaderVisible = true;
             //Console.WriteLine ("PSC.set_source 2");
             return true;
@@ -130,16 +130,16 @@ namespace Banshee.Podcasting.Gui
 
         #endregion
 
-        #region ITrackModelSourceContents implementation 
-        
+        #region ITrackModelSourceContents implementation
+
         public IListView<TrackInfo> TrackView {
             get { return track_view; }
         }
-        
-        #endregion 
+
+        #endregion
 
         public static readonly SchemaEntry<int> VPanedPositionSchema = new SchemaEntry<int> (
             "plugins.podcasting", "vpaned_position", 120, "VPaned Position", ""
-        );     
+        );
     }
 }
\ No newline at end of file
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/ItmsPodcast.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/ItmsPodcast.cs
index 2831e27..29a85a7 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/ItmsPodcast.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/ItmsPodcast.cs
@@ -34,7 +34,7 @@ using Banshee.Web;
 namespace Banshee.Podcasting
 {
     public class ItmsPodcast
-    {  
+    {
         private string itms_uri;
         private string feed_url;
         private string xml;
@@ -44,7 +44,7 @@ namespace Banshee.Podcasting
             Fetch (itmsUri, 2);
 
             feed_url = GetString ("feedURL");
-            
+
             // <key>podcastName</key>
             // <string>This Week in Django - MP3 Edition</string>
         }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImageFetchJob.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImageFetchJob.cs
index d1408bf..c1242d3 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImageFetchJob.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImageFetchJob.cs
@@ -52,25 +52,25 @@ namespace Banshee.Podcasting
     public class PodcastImageFetchJob : MetadataServiceJob
     {
         private Feed feed;
-        
+
         public PodcastImageFetchJob (Feed feed) : base ()
         {
             this.feed = feed;
         }
-        
+
         public override void Run()
         {
             Fetch ();
         }
-        
+
         public void Fetch ()
         {
             if (feed.ImageUrl == null) {
                 return;
             }
-            
+
             string cover_art_id = PodcastService.ArtworkIdFor (feed);
-            
+
             if (cover_art_id == null) {
                 return;
             } else if (CoverArtSpec.CoverExists (cover_art_id)) {
@@ -78,7 +78,7 @@ namespace Banshee.Podcasting
             } else if (!InternetConnected) {
                 return;
             }
-            
+
             if (SaveHttpStreamCover (new Uri (feed.ImageUrl), cover_art_id, null)) {
                 Banshee.Sources.Source src = ServiceManager.SourceManager.ActiveSource;
                 if (src != null && (src is PodcastSource || src.Parent is PodcastSource)) {
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImportManager.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImportManager.cs
index 716622e..d928526 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImportManager.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastImportManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  PodcastImportManager.cs
  *
  *  Copyright (C) 2008 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -42,15 +42,15 @@ namespace Banshee.Podcasting
         {
             ForceCopy = false;
         }
-        
+
         public DatabaseTrackInfo ImportPodcast (string uri)
         {
             DatabaseTrackInfo track = null;
 
             track = ImportTrack (uri);
-            
+
             if (track != null) {
-                track.MediaAttributes |= TrackMediaAttributes.Podcast; 
+                track.MediaAttributes |= TrackMediaAttributes.Podcast;
                 track.Save ();
             }
 
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
index 2e64e2d..2092f22 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
@@ -53,20 +53,20 @@ using Banshee.Configuration;
 namespace Banshee.Podcasting
 {
     public partial class PodcastService : IExtensionService, IDisposable, IDelayedInitializeService
-    {  
+    {
         private readonly string tmp_download_path = Paths.Combine (Paths.ExtensionCacheRoot, "podcasting", "partial-downloads");
         private uint refresh_timeout_id = 0;
-            
+
         private bool disposed;
-        
+
         private DownloadManager download_manager;
         private DownloadManagerInterface download_manager_iface;
-        
+
         private FeedsManager feeds_manager;
-        
+
         private PodcastSource source;
         //private PodcastImportManager import_manager;
-        
+
         private readonly object sync = new object ();
 
         public PodcastService ()
@@ -83,7 +83,7 @@ namespace Banshee.Podcasting
                     ServiceManager.DbConnection.Execute(@"
                         INSERT INTO PodcastSyndications (FeedID, Title, Url, Link,
                             Description, ImageUrl, LastBuildDate, AutoDownload, IsSubscribed)
-                            SELECT 
+                            SELECT
                                 PodcastFeedID,
                                 Title,
                                 FeedUrl,
@@ -99,7 +99,7 @@ namespace Banshee.Podcasting
                     ServiceManager.DbConnection.Execute(@"
                         INSERT INTO PodcastItems (ItemID, FeedID, Title, Link, PubDate,
                             Description, Author, Active, Guid)
-                            SELECT 
+                            SELECT
                                 PodcastID,
                                 PodcastFeedID,
                                 Title,
@@ -115,7 +115,7 @@ namespace Banshee.Podcasting
                     // Note: downloaded*3 is because the value was 0 or 1, but is now 0 or 3 (FeedDownloadStatus.None/Downloaded)
                     ServiceManager.DbConnection.Execute(@"
                         INSERT INTO PodcastEnclosures (ItemID, LocalPath, Url, MimeType, FileSize, DownloadStatus)
-                            SELECT 
+                            SELECT
                                 PodcastID,
                                 LocalPath,
                                 Url,
@@ -187,7 +187,7 @@ namespace Banshee.Podcasting
                 DatabaseConfigurationClient.Client.Set<int> ("Podcast", "Version", 6);
             }
         }
-        
+
         private void MigrateDownloadCache ()
         {
             string old_download_dir = Path.Combine (Paths.ApplicationData, "downloads");
@@ -200,7 +200,7 @@ namespace Banshee.Podcasting
                 Directory.Delete (old_download_dir);
             }
         }
-        
+
         private void ReplaceNewlines (string table, string column)
         {
             string cmd = String.Format ("UPDATE {0} SET {1}=replace({1}, ?, ?)", table, column);
@@ -208,17 +208,17 @@ namespace Banshee.Podcasting
             ServiceManager.DbConnection.Execute (cmd, "\n", String.Empty);
             ServiceManager.DbConnection.Execute (cmd, "\r", String.Empty);
         }
-        
+
         public void Initialize ()
         {
         }
-        
+
         public void DelayedInitialize ()
         {
             download_manager = new DownloadManager (2, tmp_download_path);
             download_manager_iface = new DownloadManagerInterface (download_manager);
-            download_manager_iface.Initialize ();    
-            
+            download_manager_iface.Initialize ();
+
             feeds_manager = new FeedsManager (ServiceManager.DbConnection, download_manager, null);
 
             // Migrate data from 0.13.2 podcast tables, if they exist
@@ -268,43 +268,43 @@ namespace Banshee.Podcasting
             // Every 10 minutes try to refresh again
             refresh_timeout_id = Application.RunTimeout (1000 * 60 * 10, RefreshFeeds);
         }
-        
+
         bool disposing;
         public void Dispose ()
-        {                        
+        {
             lock (sync) {
                 if (disposing | disposed) {
                     return;
                 } else {
-                    disposing = true;               
+                    disposing = true;
                 }
             }
 
             Application.IdleTimeoutRemove (refresh_timeout_id);
             refresh_timeout_id = 0;
-            
+
             ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
             ServiceManager.Get<DBusCommandService> ().ArgumentPushed -= OnCommandLineArgument;
 
             if (download_manager_iface != null) {
-                download_manager_iface.Dispose ();                
+                download_manager_iface.Dispose ();
                 download_manager_iface = null;
-            }                
-           
-            if (feeds_manager != null) {   
+            }
+
+            if (feeds_manager != null) {
                 feeds_manager.Dispose ();
                 feeds_manager = null;
             }
 
-            if (download_manager != null) {            
+            if (download_manager != null) {
                 download_manager.Dispose ();
                 download_manager = null;
             }
-            
-            DisposeInterface ();            
-            
+
+            DisposeInterface ();
+
             lock (sync) {
-                disposing = false;            
+                disposing = false;
                 disposed = true;
             }
         }
@@ -323,13 +323,13 @@ namespace Banshee.Podcasting
             }));
             return true;
         }
-        
+
         private void OnCommandLineArgument (string uri, object value, bool isFile)
         {
             if (!isFile || String.IsNullOrEmpty (uri)) {
                 return;
             }
-            
+
             // Handle OPML files
             if (uri.Contains ("opml") || uri.EndsWith (".miro") || uri.EndsWith (".democracy")) {
                 try {
@@ -366,7 +366,7 @@ namespace Banshee.Podcasting
                 });
             }
         }
-        
+
         private void RefreshArtworkFor (Feed feed)
         {
             if (feed.LastDownloadTime != DateTime.MinValue && !CoverArtSpec.CoverExists (PodcastService.ArtworkIdFor (feed))) {
@@ -378,7 +378,7 @@ namespace Banshee.Podcasting
         {
             return DatabaseTrackInfo.Provider.FetchFirstMatching ("PrimarySourceID = ? AND ExternalID = ?", source.DbId, item_id);
         }
-        
+
         private void OnItemAdded (FeedItem item)
         {
             if (item.Enclosure != null) {
@@ -393,7 +393,7 @@ namespace Banshee.Podcasting
                 item.Delete (false);
             }
         }
-        
+
         private void OnItemRemoved (FeedItem item)
         {
             DatabaseTrackInfo track = GetTrackByItemId (item.DbId);
@@ -401,9 +401,9 @@ namespace Banshee.Podcasting
                 DatabaseTrackInfo.Provider.Delete (track);
             }
         }
-        
+
         internal static bool IgnoreItemChanges = false;
-        
+
         private void OnItemChanged (FeedItem item)
         {
             if (IgnoreItemChanges) {
@@ -419,7 +419,7 @@ namespace Banshee.Podcasting
                 }
             }
         }
-        
+
         private void OnFeedsChanged (object o, EventArgs args)
         {
             source.Reload ();
@@ -431,14 +431,14 @@ namespace Banshee.Podcasting
                 source.FeedModel.Add (args.Feed);
             }
         }
-        
+
         private void OnFeedRemovedHandler (object sender, FeedEventArgs args)
         {
             lock (sync) {
                 source.FeedModel.Remove (args.Feed);
                 args.Feed.Delete ();
             }
-        }        
+        }
 
         private void OnFeedRenamedHandler (object sender, FeedEventArgs args)
         {
@@ -448,7 +448,7 @@ namespace Banshee.Podcasting
         }
 
         private void OnFeedUpdatingHandler (object sender, FeedEventArgs args)
-        {   
+        {
             lock (sync) {
                 source.FeedModel.Reload ();
             }
@@ -457,11 +457,11 @@ namespace Banshee.Podcasting
         private void OnFeedDownloadCountChangedHandler (object sender, FeedDownloadCountChangedEventArgs args)
         {
             lock (sync) {
-                source.FeedModel.Reload ();                
+                source.FeedModel.Reload ();
             }
         }*/
 
-        /*private void OnFeedItemAddedHandler (object sender, FeedItemEventArgs args) 
+        /*private void OnFeedItemAddedHandler (object sender, FeedItemEventArgs args)
         {
             lock (sync) {
                 if (args.Item != null) {
@@ -473,7 +473,7 @@ namespace Banshee.Podcasting
                 }
             }
         }*/
-        
+
         public void AddFeedItem (FeedItem item)
         {
             if (item.Enclosure != null) {
@@ -482,11 +482,11 @@ namespace Banshee.Podcasting
                 pi.Track.Save (true);
                 source.NotifyUser ();
             } else {
-                item.Delete (false);                      
+                item.Delete (false);
             }
         }
 
-        /*private void OnFeedItemRemovedHandler (object sender, FeedItemEventArgs e) 
+        /*private void OnFeedItemRemovedHandler (object sender, FeedItemEventArgs e)
         {
             lock (sync) {
                 if (e.Item != null) {
@@ -496,35 +496,35 @@ namespace Banshee.Podcasting
                         PodcastItem.DeleteWithFeedId (fi.DbId);
                     }
                 }
-                
+
                 source.Reload ();
             }
-        } 
+        }
 
-        private void OnFeedItemCountChanged (object sender, 
+        private void OnFeedItemCountChanged (object sender,
                                              FeedItemCountChangedEventArgs e)
         {
             //UpdateCount ();
         }*/
 
-        /*private void OnFeedDownloadCompletedHandler (object sender, 
-                                                     FeedDownloadCompletedEventArgs e) 
+        /*private void OnFeedDownloadCompletedHandler (object sender,
+                                                     FeedDownloadCompletedEventArgs e)
         {
             lock (sync) {
-                Feed f = feedDict[e.Feed.DbId]; 
-                
+                Feed f = feedDict[e.Feed.DbId];
+
                 if (e.Error == FeedDownloadError.None) {
                     if (String.IsNullOrEmpty(e.Feed.LocalEnclosurePath)) {
                         e.Feed.LocalEnclosurePath = Path.Combine (
                             tmp_enclosure_path, SanitizeName (e.Feed.Name)
                         );
-                    }                    
-                
+                    }
+
                     if (f.AutoDownload != FeedAutoDownload.None) {
                         ReadOnlyCollection<FeedItem> items = e.Feed.Items;
-                        
+
                         if (items != null) {
-                            if (f.AutoDownload == FeedAutoDownload.One && 
+                            if (f.AutoDownload == FeedAutoDownload.One &&
                                 items.Count > 0) {
                                 items[0].Enclosure.AsyncDownload ();
                             } else {
@@ -535,73 +535,73 @@ namespace Banshee.Podcasting
                         }
                     }
                 }
-                
-                source.Reload ();                
+
+                source.Reload ();
             }
         }*/
-        
+
         /*private void OnTaskAssociated (object sender, EventArgs e)
         {
             lock (sync) {
                 source.Reload ();
             }
-        }        
-        
-        private void OnTaskStatusChanged (object sender, 
+        }
+
+        private void OnTaskStatusChanged (object sender,
         								  TaskStatusChangedEventArgs e)
         {
             lock (sync) {
                 source.Reload ();
             }
-        }        
-        
-        private void TaskStartedHandler (object sender, 
+        }
+
+        private void TaskStartedHandler (object sender,
                                          TaskEventArgs<HttpFileDownloadTask> e)
         {
             lock (sync) {
                 source.Reload ();
             }
-        }        
-        
-        private void OnTaskStoppedHandler (object sender, 
+        }
+
+        private void OnTaskStoppedHandler (object sender,
                                            TaskEventArgs<HttpFileDownloadTask> e)
         {
             // TODO merge
             lock (sync) {
                 if (e.Task != null && e.Task.Status == TaskStatus.Succeeded) {
                     FeedEnclosure enc = e.Task.UserState as FeedEnclosure;
-                
+
                     if (enc != null) {
                         FeedItem item = enc.Item;
                         DatabaseTrackInfo track = null;
-                        
-                        
-                        
+
+
+
                         if (itemDict.ContainsKey (item.DbId)) {
                             PodcastItem pi = itemDict[item.DbId];
-                            track = import_manager.ImportPodcast (enc.LocalPath);                            
+                            track = import_manager.ImportPodcast (enc.LocalPath);
 
                             if (track != null) {
                                 pi.Track = track;
                                 pi.New = true;
                                 pi.Save ();
                             }
-                            
-                            item.IsRead = true;                            
+
+                            item.IsRead = true;
                         }
-                    }                    
+                    }
                 }
-                
+
                 source.Reload ();
             }
-        }*/    
+        }*/
 
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             lock (sync) {
                 //source.Reload ();
             }
-        }          
+        }
 
         public static string ArtworkIdFor (Feed feed)
         {
@@ -613,10 +613,10 @@ namespace Banshee.Podcasting
         {
             // remove /, : and \ from names
             return s.Replace ('/', '_').Replace ('\\', '_').Replace (':', '_').Replace (' ', '_');
-        }*/   
-        
+        }*/
+
         public string ServiceName {
-            get { return "PodcastService"; } 
+            get { return "PodcastService"; }
         }
     }
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService_Interface.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService_Interface.cs
index b54d588..8248da0 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService_Interface.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService_Interface.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  PodcastService_Interface.cs
  *
  *  Copyright (C) 2008 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -54,9 +54,9 @@ using Banshee.Podcasting.Data;
 namespace Banshee.Podcasting
 {
     public partial class PodcastService
-    {                 
+    {
         private PodcastActions actions = null;
-         
+
         private void InitializeInterface ()
         {
             source = new PodcastSource ();
@@ -64,14 +64,14 @@ namespace Banshee.Podcasting
             ServiceManager.SourceManager.AddSource (source);
             actions = new PodcastActions (source);
         }
-        
+
         private void DisposeInterface ()
         {
             if (source != null) {
                 ServiceManager.SourceManager.RemoveSource (source);
                 source = null;
             }
-            
+
             if (actions != null) {
                 actions.Dispose ();
                 actions = null;
diff --git a/src/Extensions/Banshee.Podcasting/Makefile.in b/src/Extensions/Banshee.Podcasting/Makefile.in
index 8b1a4cf..097956a 100644
--- a/src/Extensions/Banshee.Podcasting/Makefile.in
+++ b/src/Extensions/Banshee.Podcasting/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -406,6 +415,7 @@ RESOURCES = \
 @ENABLE_PODCAST_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_PODCAST_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_PODCAST_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -509,11 +519,12 @@ RESOURCES = \
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_PODCAST_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_PODCAST_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_PODCAST_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_PODCAST_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -531,6 +542,7 @@ RESOURCES = \
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_PODCAST_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -561,6 +573,7 @@ RESOURCES = \
 @ENABLE_PODCAST_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_PODCAST_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_PODCAST_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_PODCAST_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_PODCAST_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_PODCAST_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_PODCAST_TRUE at OUTPUT_FILES = \
@@ -581,14 +594,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Podcasting/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Podcasting/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Podcasting/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Podcasting/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -606,25 +619,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -654,13 +683,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -692,6 +725,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -714,6 +748,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -722,18 +758,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -794,7 +840,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_PODCAST_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_PODCAST_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_PODCAST_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_PODCAST_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_PODCAST_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_PODCAST_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_PODCAST_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_PODCAST_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -811,6 +857,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_PODCAST_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_PODCAST_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteAudioService.cs b/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteAudioService.cs
index f8b7347..1ac9dc6 100644
--- a/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteAudioService.cs
+++ b/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteAudioService.cs
@@ -56,7 +56,7 @@ namespace Banshee.RemoteAudio
         public ReadOnlyCollection<RemoteSpeaker> Speakers {
             get { lock (speakers) { return speakers.AsReadOnly (); } }
         }
-        
+
         void IExtensionService.Initialize ()
         {
             Network network = ServiceManager.Get<Network> ();
@@ -70,14 +70,14 @@ namespace Banshee.RemoteAudio
             RemoteAudioActions a = new RemoteAudioActions ();
             a.Register ();
         }
-  
+
         public void Dispose ()
         {
             if (browser != null) {
                 browser.Dispose ();
             }
         }
-        
+
         string Banshee.ServiceStack.IService.ServiceName {
             get { return "RemoteAudioService"; }
         }
@@ -89,7 +89,7 @@ namespace Banshee.RemoteAudio
             browser.ServiceRemoved += OnServiceRemoved;
             browser.Browse (0, AddressProtocol.Any, RAOP_MDNS_TYPE, "local");
         }
-        
+
         private void OnNetworkStateChanged (object o, NetworkStateChangedArgs args)
         {
             if (!args.Connected) {
@@ -119,7 +119,7 @@ namespace Banshee.RemoteAudio
             if (service == null) {
                 return;
             }
-    
+
             Log.DebugFormat ("Resolved RAOP service at {0}", service.HostEntry.AddressList[0]);
 
             ITxtRecord record = service.TxtRecord;
diff --git a/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteSpeaker.cs b/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteSpeaker.cs
index f94d39f..857c478 100644
--- a/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteSpeaker.cs
+++ b/src/Extensions/Banshee.RemoteAudio/Banshee.RemoteAudio/RemoteSpeaker.cs
@@ -37,7 +37,7 @@ namespace Banshee.RemoteAudio
         public string Name {
             get { return name; }
         }
-        
+
         private IPAddress host;
         public IPAddress Host {
             get { return host; }
diff --git a/src/Extensions/Banshee.RemoteAudio/Makefile.in b/src/Extensions/Banshee.RemoteAudio/Makefile.in
index b7e2597..bbb79d1 100644
--- a/src/Extensions/Banshee.RemoteAudio/Makefile.in
+++ b/src/Extensions/Banshee.RemoteAudio/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -377,6 +386,7 @@ RESOURCES = \
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at REMOTE_AUDIO_ENABLED_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -480,11 +490,12 @@ RESOURCES = \
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at REMOTE_AUDIO_ENABLED_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at REMOTE_AUDIO_ENABLED_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at REMOTE_AUDIO_ENABLED_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @REMOTE_AUDIO_ENABLED_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -502,6 +513,7 @@ RESOURCES = \
 @REMOTE_AUDIO_ENABLED_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at REMOTE_AUDIO_ENABLED_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @REMOTE_AUDIO_ENABLED_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -532,6 +544,7 @@ RESOURCES = \
 @REMOTE_AUDIO_ENABLED_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @REMOTE_AUDIO_ENABLED_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@REMOTE_AUDIO_ENABLED_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@REMOTE_AUDIO_ENABLED_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @REMOTE_AUDIO_ENABLED_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @REMOTE_AUDIO_ENABLED_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @REMOTE_AUDIO_ENABLED_TRUE at OUTPUT_FILES = \
@@ -552,14 +565,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.RemoteAudio/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.RemoteAudio/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.RemoteAudio/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.RemoteAudio/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -577,25 +590,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -625,13 +654,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -663,6 +696,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -685,6 +719,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -693,18 +729,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -770,7 +816,7 @@ run:
 @REMOTE_AUDIO_ENABLED_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @REMOTE_AUDIO_ENABLED_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @REMOTE_AUDIO_ENABLED_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at REMOTE_AUDIO_ENABLED_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at REMOTE_AUDIO_ENABLED_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @REMOTE_AUDIO_ENABLED_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @REMOTE_AUDIO_ENABLED_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @REMOTE_AUDIO_ENABLED_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -787,6 +833,7 @@ run:
 
 @REMOTE_AUDIO_ENABLED_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @REMOTE_AUDIO_ENABLED_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs b/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs
index 6e67cc2..0cce6c9 100644
--- a/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs
+++ b/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSource.cs
@@ -40,11 +40,11 @@ namespace Banshee.Sample
         public SampleSource () : base ("sample", Catalog.GetString ("Sample"), 1000)
         {
             TypeUniqueId = "sample";
-            
+
             Properties.SetString ("Icon.Name", "face-kiss");
             Properties.Set<ISourceContents> ("Nereid.SourceContents", new SampleSourceInterface (this));
             Properties.Set<bool> ("Nereid.SourceContents.HeaderVisible", false);
-            
+
             ServiceManager.SourceManager.AddSource (this);
         }
     }
diff --git a/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSourceInterface.cs b/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSourceInterface.cs
index 04f6f71..3a15bc0 100644
--- a/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSourceInterface.cs
+++ b/src/Extensions/Banshee.Sample/Banshee.Sample/SampleSourceInterface.cs
@@ -41,38 +41,38 @@ using Banshee.Sources.Gui;
 namespace Banshee.Sample
 {
     public class SampleSourceInterface : VBox, ISourceContents
-    {   
+    {
         private SampleSource source;
-        
+
         public SampleSourceInterface (SampleSource source)
         {
             this.source = source;
-            
+
             Button button = new Button ("Waiting...");
             button.Show ();
-            
+
             PackStart (button, true, true, 0);
-            
+
             ServiceManager.PlayerEngine.TrackIntercept += delegate (TrackInfo track) {
                 if (System.IO.Path.GetExtension (track.Uri.LocalPath) != ".wmv") {
                     // We don't care about non wmv URIs, so let the engine take care of it
                     return false;
                 }
-                
+
                 // Stop the engine if playing
                 ServiceManager.PlayerEngine.Close ();
-                
+
                 // Update our UI and switch to our source
                 button.Label = track.ToString ();
                 ServiceManager.SourceManager.SetActiveSource (source);
-                
+
                 // Tell the engine that we've handled this track
                 return true;
             };
         }
-        
+
 #region ISourceContents
-        
+
         public bool SetSource (ISource src)
         {
             return source is SampleSource;
@@ -89,7 +89,7 @@ namespace Banshee.Sample
         public Widget Widget {
             get { return this; }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Extensions/Banshee.Sample/Makefile.in b/src/Extensions/Banshee.Sample/Makefile.in
index 15f6831..6b1aef8 100644
--- a/src/Extensions/Banshee.Sample/Makefile.in
+++ b/src/Extensions/Banshee.Sample/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -131,6 +135,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -150,6 +156,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -163,29 +171,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -350,14 +339,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Sample/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Sample/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Sample/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Sample/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -375,6 +364,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -404,13 +394,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -438,6 +432,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -456,6 +451,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -464,18 +461,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -511,6 +518,7 @@ uninstall-am:
 
 
 # include $(top_srcdir)/build/build.mk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs b/src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs
index 99ed2c9..33ba26a 100644
--- a/src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs
+++ b/src/Extensions/Banshee.SqlDebugConsole/Banshee.SqlDebugConsole/SqlActions.cs
@@ -84,7 +84,7 @@ namespace Banshee.SqlDebugConsole
             base.Dispose ();
         }
 
-#region Action Handlers 
+#region Action Handlers
 
         private void OnShowConsole (object sender, EventArgs args)
         {
diff --git a/src/Extensions/Banshee.SqlDebugConsole/Makefile.in b/src/Extensions/Banshee.SqlDebugConsole/Makefile.in
index 2f14e46..412b268 100644
--- a/src/Extensions/Banshee.SqlDebugConsole/Makefile.in
+++ b/src/Extensions/Banshee.SqlDebugConsole/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -131,6 +135,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -150,6 +156,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -163,29 +171,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -350,14 +339,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.SqlDebugConsole/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.SqlDebugConsole/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.SqlDebugConsole/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.SqlDebugConsole/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -375,6 +364,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -404,13 +394,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -438,6 +432,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -456,6 +451,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -464,18 +461,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -511,6 +518,7 @@ uninstall-am:
 
 
 #include $(top_srcdir)/build/build.mk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentFileDownloadTask.cs b/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentFileDownloadTask.cs
index b47489d..f76183e 100644
--- a/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentFileDownloadTask.cs
+++ b/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentFileDownloadTask.cs
@@ -37,26 +37,26 @@ namespace Banshee.Torrent
     {
         private MonoTorrent.DBus.IDownloader downloader;
         private MonoTorrent.DBus.ITorrent torrent;
-        
+
         public TorrentFileDownloadTask (string remoteUri, string localPath, object userState)
             : base (remoteUri, localPath.Substring (0, localPath.Length - 8), userState)
         {
         }
-        
+
         public override long BytesReceived {
             get {
                 if (downloader == null)
                     return 0;
-                
-                return (long)(downloader.GetProgress () / 100.0 * torrent.GetSize ()); 
+
+                return (long)(downloader.GetProgress () / 100.0 * torrent.GetSize ());
             }
         }
-        
+
         public override void CancelAsync ()
         {
             if (downloader == null)
                 return;
-            
+
             downloader.Stop ();
             SetStatus (TaskStatus.Cancelled);
             OnTaskCompleted (null, true);
@@ -68,9 +68,9 @@ namespace Banshee.Torrent
             TorrentService s = Banshee.ServiceStack.ServiceManager.Get<TorrentService> ();
             downloader = s.Download (RemoteUri.ToString (), Path.GetDirectoryName (LocalPath));
             torrent = TorrentService.Bus.GetObject <ITorrent> (TorrentService.BusName, downloader.GetTorrent ());
-            
+
             downloader.StateChanged += OnDownloaderStateChanged;
-            
+
             // There are no events on the torrent IDownloader to indicate when the stats have updated
             // Manually ping the SetProgress event, otherwise migo never notices progress changing
             System.Threading.ThreadPool.QueueUserWorkItem (UpdateProgress);
@@ -80,16 +80,16 @@ namespace Banshee.Torrent
         {
             if (downloader == null)
                 return;
-            
+
             SetStatus (TaskStatus.Paused);
             downloader.Pause ();
         }
-        
+
         public override void Resume ()
         {
             if (downloader == null)
                 return;
-            
+
             SetStatus (TaskStatus.Running);
             downloader.Stop ();
         }
@@ -98,7 +98,7 @@ namespace Banshee.Torrent
         {
             if (downloader == null)
                 return;
-            
+
             SetStatus (TaskStatus.Stopped);
             OnTaskCompleted (null, false);
             downloader.Stop ();
@@ -115,7 +115,7 @@ namespace Banshee.Torrent
 
         private void UpdateProgress (object o)
         {
-            while (Progress != 100 && 
+            while (Progress != 100 &&
                    (Status == TaskStatus.Running || Status == TaskStatus.Paused || Status == TaskStatus.Running)) {
                 System.Threading.Thread.Sleep (2000);
                 SetProgress ((int)downloader.GetProgress ());
diff --git a/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentService.cs b/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentService.cs
index e59a21a..0d6380b 100644
--- a/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentService.cs
+++ b/src/Extensions/Banshee.Torrent/Banshee.Torrent/TorrentService.cs
@@ -46,17 +46,17 @@ namespace Banshee.Torrent
         public static readonly string BusName = "org.monotorrent.dbus";
         public static readonly string EngineName = "banshee";
         public static readonly ObjectPath ServicePath = new ObjectPath ("/org/monotorrent/service");
-        
+
         private Bus bus;
         private IEngine engine;
         private ITorrentService service;
         /*private IEngineSettings settings;
-        
+
         public int MaxDownloadSpeed {
             get { return settings.GetGlobalMaxDownloadSpeed (); }
             set { settings.SetGlobalMaxDownloadSpeed (value); }
         }
-        
+
         public int MaxUploadSpeed {
             get { return settings.GetGlobalMaxUploadSpeed (); }
             set { settings.SetGlobalMaxUploadSpeed (value); }
@@ -65,17 +65,17 @@ namespace Banshee.Torrent
         public string ServiceName {
             get { return "TorrentService"; }
         }
-        
+
         public TorrentService ()
         {
         }
-        
+
         public IDownloader Download (string torrentUri, string savePath)
         {
             // Get the associated downloader
             ObjectPath path = engine.RegisterTorrent (torrentUri, savePath);
             IDownloader downloader = bus.GetObject <IDownloader> (BusName, path);
-            
+
             if (downloader.GetState () == TorrentState.Stopped) {
                 downloader.Start ();
                 Console.WriteLine ("Started: {0}", downloader.GetPath ());
@@ -84,7 +84,7 @@ namespace Banshee.Torrent
             }
             return downloader;
         }
-        
+
         public void Dispose ()
         {
             if (service != null) {
@@ -119,18 +119,18 @@ namespace Banshee.Torrent
                     return;
                 }
             }
-            
+
             // Register with Migo so we can handle .torrent downloads
             if (!RegisteredInMigo)
                 Migo.DownloadCore.DownloadManager.Register ("torrent", typeof (TorrentFileDownloadTask));
             RegisteredInMigo = true;
-            
+
             // Get the engine from DBus which we will use to download torrents with
             // and load the details for any existing downloads
             engine = bus.GetObject <IEngine> (BusName, service.GetEngine (EngineName));
             CheckExistingDownloads ();
         }
-        
+
         private void CheckExistingDownloads ()
         {
             //UserJobManager manager = (UserJobManager)ServiceManager.Get ("UserJobManager");
diff --git a/src/Extensions/Banshee.Torrent/Makefile.in b/src/Extensions/Banshee.Torrent/Makefile.in
index bff97ed..2df3b27 100644
--- a/src/Extensions/Banshee.Torrent/Makefile.in
+++ b/src/Extensions/Banshee.Torrent/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -373,6 +382,7 @@ EXTRA_BUNDLE = $(MONOTORRENT_ASSEMBLIES)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at HAVE_MONOTORRENT_DBUS_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -476,11 +486,12 @@ EXTRA_BUNDLE = $(MONOTORRENT_ASSEMBLIES)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at HAVE_MONOTORRENT_DBUS_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at HAVE_MONOTORRENT_DBUS_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at HAVE_MONOTORRENT_DBUS_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @HAVE_MONOTORRENT_DBUS_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -498,6 +509,7 @@ EXTRA_BUNDLE = $(MONOTORRENT_ASSEMBLIES)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at HAVE_MONOTORRENT_DBUS_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @HAVE_MONOTORRENT_DBUS_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -528,6 +540,7 @@ EXTRA_BUNDLE = $(MONOTORRENT_ASSEMBLIES)
 @HAVE_MONOTORRENT_DBUS_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @HAVE_MONOTORRENT_DBUS_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@HAVE_MONOTORRENT_DBUS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@HAVE_MONOTORRENT_DBUS_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @HAVE_MONOTORRENT_DBUS_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @HAVE_MONOTORRENT_DBUS_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @HAVE_MONOTORRENT_DBUS_TRUE at OUTPUT_FILES = \
@@ -548,14 +561,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Torrent/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Torrent/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Torrent/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Torrent/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -573,25 +586,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -621,13 +650,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -659,6 +692,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -683,6 +717,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -690,21 +726,30 @@ info-am:
 install-data-am: install-data-local install-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
-
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -726,7 +771,6 @@ ps-am:
 uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-
 .MAKE: install-am install-data-am install-strip uninstall-am
 
 .PHONY: all all-am check check-am clean clean-generic clean-libtool \
@@ -767,7 +811,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_MONOTORRENT_DBUS_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @HAVE_MONOTORRENT_DBUS_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @HAVE_MONOTORRENT_DBUS_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at HAVE_MONOTORRENT_DBUS_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at HAVE_MONOTORRENT_DBUS_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @HAVE_MONOTORRENT_DBUS_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @HAVE_MONOTORRENT_DBUS_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @HAVE_MONOTORRENT_DBUS_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -794,6 +838,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_MONOTORRENT_DBUS_TRUE@	for ASM in $(MONOTORRENT_ASSEMBLIES); do \
 @HAVE_MONOTORRENT_DBUS_TRUE@		rm -f $(DESTDIR)$(moduledir)/`basename $$ASM`; \
 @HAVE_MONOTORRENT_DBUS_TRUE@	done;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Banshee.Wikipedia/Makefile.in b/src/Extensions/Banshee.Wikipedia/Makefile.in
index ee5be0d..3e490fa 100644
--- a/src/Extensions/Banshee.Wikipedia/Makefile.in
+++ b/src/Extensions/Banshee.Wikipedia/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -371,6 +380,7 @@ RESOURCES = Banshee.Wikipedia.addin.xml
 @HAVE_WEBKIT_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @HAVE_WEBKIT_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @HAVE_WEBKIT_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at HAVE_WEBKIT_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @HAVE_WEBKIT_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @HAVE_WEBKIT_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @HAVE_WEBKIT_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -474,11 +484,12 @@ RESOURCES = Banshee.Wikipedia.addin.xml
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at HAVE_WEBKIT_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at HAVE_WEBKIT_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at HAVE_WEBKIT_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @HAVE_WEBKIT_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @HAVE_WEBKIT_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -496,6 +507,7 @@ RESOURCES = Banshee.Wikipedia.addin.xml
 @HAVE_WEBKIT_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at HAVE_WEBKIT_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @HAVE_WEBKIT_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @HAVE_WEBKIT_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @HAVE_WEBKIT_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -525,6 +537,7 @@ RESOURCES = Banshee.Wikipedia.addin.xml
 @HAVE_WEBKIT_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @HAVE_WEBKIT_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE@@HAVE_WEBKIT_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@HAVE_WEBKIT_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @HAVE_WEBKIT_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @HAVE_WEBKIT_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @HAVE_WEBKIT_TRUE at OUTPUT_FILES = \
@@ -545,14 +558,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Banshee.Wikipedia/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Banshee.Wikipedia/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Banshee.Wikipedia/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Banshee.Wikipedia/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -570,25 +583,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -618,13 +647,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -656,6 +689,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -678,6 +712,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -686,18 +722,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -758,7 +804,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @HAVE_WEBKIT_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @HAVE_WEBKIT_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @HAVE_WEBKIT_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at HAVE_WEBKIT_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at HAVE_WEBKIT_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @HAVE_WEBKIT_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @HAVE_WEBKIT_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @HAVE_WEBKIT_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -775,6 +821,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @HAVE_WEBKIT_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @HAVE_WEBKIT_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Extensions/Makefile.am b/src/Extensions/Makefile.am
index d992dac..c38928e 100644
--- a/src/Extensions/Makefile.am
+++ b/src/Extensions/Makefile.am
@@ -6,6 +6,7 @@ SUBDIRS = \
 	Banshee.CoverArt \
 	Banshee.Daap \
 	Banshee.FileSystemQueue \
+	Banshee.InternetArchive \
 	Banshee.InternetRadio \
 	Banshee.Lastfm \
 	Banshee.MiniMode \
diff --git a/src/Extensions/Makefile.in b/src/Extensions/Makefile.in
index 472bb90..3a05aa3 100644
--- a/src/Extensions/Makefile.in
+++ b/src/Extensions/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -354,6 +371,7 @@ SUBDIRS = \
 	Banshee.CoverArt \
 	Banshee.Daap \
 	Banshee.FileSystemQueue \
+	Banshee.InternetArchive \
 	Banshee.InternetRadio \
 	Banshee.Lastfm \
 	Banshee.MiniMode \
@@ -378,14 +396,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Extensions/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Extensions/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Extensions/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -403,6 +421,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -434,7 +453,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -468,16 +487,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -485,14 +504,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -504,7 +523,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -513,29 +532,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -556,29 +580,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -608,6 +647,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -627,6 +667,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -635,18 +677,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -667,8 +719,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -684,6 +736,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs
new file mode 100644
index 0000000..10dbc4e
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs
@@ -0,0 +1,149 @@
+//
+// ColumnCellAccessible.cs
+//
+// Author:
+//   Eitan Isaacson <eitan at ascender.com>
+//
+// Copyright (C) 2009 Eitan Isaacson.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    public class ColumnCellAccessible: Atk.Object, Atk.ComponentImplementor
+    {
+        protected ColumnCell cell;
+        protected object bound_object;
+        private ICellAccessibleParent cell_parent;
+
+        public ColumnCellAccessible (object bound_object, ColumnCell cell, ICellAccessibleParent parent)
+        {
+            Role = Atk.Role.TableCell;
+            this.bound_object = bound_object;
+            this.cell = cell;
+            cell_parent = parent;
+            Parent = (Atk.Object) parent;
+        }
+
+        protected override Atk.StateSet OnRefStateSet ()
+        {
+            Atk.StateSet states = base.OnRefStateSet ();
+            states.AddState (Atk.StateType.Transient);
+            states.AddState (Atk.StateType.Focusable);
+            states.AddState (Atk.StateType.Enabled);
+            states.AddState (Atk.StateType.Sensitive);
+            states.AddState (Atk.StateType.Visible);
+
+            if (cell_parent.IsCellShowing (this))
+                states.AddState (Atk.StateType.Showing);
+
+            if (cell_parent.IsCellFocused (this))
+                states.AddState (Atk.StateType.Focused);
+
+            if (cell_parent.IsCellSelected (this))
+                states.AddState (Atk.StateType.Selected);
+
+            if (cell_parent.IsCellActive (this))
+                states.AddState (Atk.StateType.Active);
+
+            return states;
+        }
+
+        protected override int OnGetIndexInParent ()
+        {
+            return cell_parent.GetCellIndex (this);
+        }
+
+        public double Alpha {
+            get { return 1.0; }
+        }
+
+        public bool SetSize (int w, int h)
+        {
+            return false;
+        }
+
+        public bool SetPosition (int x, int y, Atk.CoordType coordType)
+        {
+            return false;
+        }
+
+        public bool SetExtents (int x, int y, int w, int h, Atk.CoordType coordType)
+        {
+            return false;
+        }
+
+        public void RemoveFocusHandler (uint handlerId)
+        {
+        }
+
+        public bool GrabFocus ()
+        {
+            return false;
+        }
+
+        public void GetSize (out int w, out int h)
+        {
+            Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, Atk.CoordType.Screen);
+            w = rectangle.Width;
+            h = rectangle.Height;
+        }
+
+        public void GetPosition (out int x, out int y, Atk.CoordType coordType)
+        {
+            Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, coordType);
+
+            x = rectangle.X;
+            y = rectangle.Y;
+        }
+
+        public void GetExtents (out int x, out int y, out int w, out int h, Atk.CoordType coordType)
+        {
+            Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, coordType);
+
+            x = rectangle.X;
+            y = rectangle.Y;
+            w = rectangle.Width;
+            h = rectangle.Height;
+        }
+
+        public virtual Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType)
+        {
+            return null;
+        }
+
+        public bool Contains (int x, int y, Atk.CoordType coordType)
+        {
+            return false;
+        }
+
+        public uint AddFocusHandler (Atk.FocusHandler handler)
+        {
+            return 0;
+        }
+
+        public virtual void Redrawn ()
+        {
+        }
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs
new file mode 100644
index 0000000..76eb0c3
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs
@@ -0,0 +1,40 @@
+//
+// ColumnCellTextAccessible.cs
+//
+// Author:
+//   Eitan Isaacson <eitan at ascender.com>
+//
+// Copyright (C) 2009 Eitan Isaacson.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    class ColumnCellTextAccessible : ColumnCellAccessible
+    {
+        public ColumnCellTextAccessible (object bound_object, ColumnCellText cell, ICellAccessibleParent parent): base (bound_object, cell as ColumnCell, parent)
+        {
+            Name = cell.GetTextAlternative (bound_object);
+        }
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs
new file mode 100644
index 0000000..1638fa6
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs
@@ -0,0 +1,112 @@
+//
+// ColumnHeaderCellTextAccessible.cs
+//
+// Author:
+//   Eitan Isaacson <eitan at ascender.com>
+//
+// Copyright (C) 2009 Eitan Isaacson.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using Mono.Unix;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    class ColumnHeaderCellTextAccessible: ColumnCellTextAccessible, Atk.ActionImplementor
+    {
+        private static string [] action_descriptions  = new string[] {"", Catalog.GetString ("open context menu")};
+        private static string [] action_names_localized = new string[] {Catalog.GetString ("click"), Catalog.GetString ("menu")};
+
+        private enum Actions {
+            Click,
+            Menu,
+            Last
+        };
+
+        public ColumnHeaderCellTextAccessible (object bound_object, ColumnHeaderCellText cell, ICellAccessibleParent parent)
+            : base (bound_object, cell as ColumnCellText, parent)
+        {
+            Role = Atk.Role.TableColumnHeader;
+        }
+
+        protected override Atk.StateSet OnRefStateSet ()
+        {
+            Atk.StateSet states = base.OnRefStateSet ();
+            states.RemoveState (Atk.StateType.Selectable);
+            states.RemoveState (Atk.StateType.Transient);
+            return states;
+        }
+
+        public string GetLocalizedName (int action)
+        {
+            if (action >= action_names_localized.Length)
+                return "";
+
+            return action_names_localized[action];
+        }
+
+        public string GetName (int action)
+        {
+            if (action >= (int)Actions.Last)
+                return "";
+
+            return ((Actions)action).ToString ().ToLower ();
+        }
+
+        public string GetDescription (int action)
+        {
+            if (action >= action_descriptions.Length)
+                return "";
+
+            return action_descriptions[action];
+        }
+
+        public string GetKeybinding (int action)
+        {
+            return "";
+        }
+
+        public int NActions {
+            get { return (int)Actions.Last; }
+        }
+
+        public bool DoAction (int action)
+        {
+            ICellAccessibleParent parent = (ICellAccessibleParent)Parent;
+            switch ((Actions)action) {
+                case Actions.Menu: parent.InvokeColumnHeaderMenu (this); break;
+                case Actions.Click: parent.ClickColumnHeader (this); break;
+            }
+
+            if (action == (int)Actions.Menu) {
+                ((ICellAccessibleParent)Parent).InvokeColumnHeaderMenu (this);
+            }
+
+            return true;
+        }
+
+        public bool SetDescription (int action, string description)
+        {
+            return false;
+        }
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs
new file mode 100644
index 0000000..499a2ab
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs
@@ -0,0 +1,45 @@
+//
+// ICellAccessibleParent.cs
+//
+// Author:
+//   Eitan Isaacson <eitan at ascender.com>
+//
+// Copyright (C) 2009 Eitan Isaacson.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    public interface ICellAccessibleParent
+    {
+        Gdk.Rectangle GetCellExtents (ColumnCellAccessible cell, Atk.CoordType coord_type);
+        int GetCellIndex (ColumnCellAccessible cell);
+        bool IsCellShowing (ColumnCellAccessible cell);
+        bool IsCellFocused (ColumnCellAccessible cell);
+        bool IsCellSelected (ColumnCellAccessible cell);
+        bool IsCellActive (ColumnCellAccessible cell);
+        void InvokeColumnHeaderMenu (ColumnCellAccessible column);
+        void ClickColumnHeader (ColumnCellAccessible column);
+        void CellRedrawn (int column, int row);
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible.cs
new file mode 100644
index 0000000..4a72c34
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible.cs
@@ -0,0 +1,243 @@
+//
+// ListViewAccessible.cs
+//
+// Authors:
+//   Eitan Isaacson <eitan at ascender.com>
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+// Copyright (C) 2009 Eitan Isaacson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Hyena.Data.Gui;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    public partial class ListViewAccessible<T> : Hyena.Gui.BaseWidgetAccessible, ICellAccessibleParent
+    {
+        private ListView<T> list_view;
+        private Dictionary<int, ColumnCellAccessible> cell_cache;
+
+        public ListViewAccessible (GLib.Object widget) : base (widget as Gtk.Widget)
+        {
+            list_view = widget as ListView<T>;
+            // TODO replace with list_view.Name?
+            Name = "ListView";
+            Description = "ListView";
+            Role = Atk.Role.Table;
+            Parent = list_view.Parent.RefAccessible ();
+
+            cell_cache = new Dictionary<int, ColumnCellAccessible> ();
+
+            list_view.ModelChanged += (o, a) => OnModelChanged ();
+            list_view.Model.Reloaded += (o, a) => OnModelChanged ();
+            OnModelChanged ();
+
+            list_view.Selection.FocusChanged += OnSelectionFocusChanged;
+            list_view.ActiveColumnChanged += OnSelectionFocusChanged;
+
+            ListViewAccessible_Selection ();
+            ListViewAccessible_Table ();
+        }
+
+        protected override Atk.StateSet OnRefStateSet ()
+        {
+            Atk.StateSet states = base.OnRefStateSet ();
+            states.AddState (Atk.StateType.ManagesDescendants);
+
+            return states;
+        }
+
+        protected override int OnGetIndexInParent ()
+        {
+            for (int i=0; i < Parent.NAccessibleChildren; i++) {
+                if (Parent.RefAccessibleChild (i) == this) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        protected override int OnGetNChildren ()
+        {
+            return n_columns * n_rows + n_columns;
+        }
+
+        protected override Atk.Object OnRefChild (int index)
+        {
+            ColumnCellAccessible child;
+
+            if (cell_cache.ContainsKey (index)) {
+                return cell_cache[index];
+            }
+
+            var columns = list_view.ColumnController.Where (c => c.Visible);
+
+            if (index - n_columns < 0) {
+                child = columns.ElementAtOrDefault (index)
+                               .HeaderCell
+                               .GetAccessible (this) as ColumnCellAccessible;
+            } else {
+                int column = (index - n_columns) % n_columns;
+                int row = (index - n_columns) / n_columns;
+                var cell = columns.ElementAtOrDefault (column).GetCell (0);
+                cell.BindListItem (list_view.Model[row]);
+                child = (ColumnCellAccessible) cell.GetAccessible (this);
+            }
+
+            cell_cache.Add (index, child);
+
+            return child;
+        }
+
+        public override Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType)
+        {
+            int row, col;
+            list_view.GetCellAtPoint (x, y, coordType, out row, out col);
+            return RefAt (row, col);
+        }
+
+        private void OnModelChanged ()
+        {
+            GLib.Signal.Emit (this, "model_changed");
+            cell_cache.Clear ();
+            /*var handler = ModelChanged;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }*/
+        }
+
+        private void OnSelectionFocusChanged (object o, EventArgs a)
+        {
+            GLib.Signal.Emit (this, "active-descendant-changed", ActiveCell.Handle);
+        }
+
+        private Atk.Object ActiveCell {
+            get {
+                if (list_view.HeaderFocused)
+                    return OnRefChild (list_view.ActiveColumn);
+                else
+                    return RefAt (list_view.Selection.FocusedIndex, list_view.ActiveColumn);
+            }
+        }
+
+        private int n_columns {
+            get { return list_view.ColumnController.Count (c => c.Visible); }
+        }
+
+        private int n_rows {
+            get { return list_view.Model.Count; }
+        }
+
+        #region ICellAccessibleParent
+
+        public int GetCellIndex (ColumnCellAccessible cell)
+        {
+            foreach (KeyValuePair<int, ColumnCellAccessible> kv in cell_cache)
+            {
+                if ((ColumnCellAccessible)kv.Value == cell)
+                    return (int)kv.Key;
+            }
+
+            return -1;
+        }
+
+        public Gdk.Rectangle GetCellExtents (ColumnCellAccessible cell, Atk.CoordType coord_type)
+        {
+            int cache_index = GetCellIndex (cell);
+            int minval = Int32.MinValue;
+            if (cache_index == -1)
+                return new Gdk.Rectangle (minval, minval, minval, minval);
+
+            if (cache_index - n_columns >= 0)
+            {
+                int column = (cache_index - NColumns)%NColumns;
+                int row = (cache_index - NColumns)/NColumns;
+                return list_view.GetColumnCellExtents (row, column, true, coord_type);
+            } else
+            {
+                return list_view.GetColumnHeaderCellExtents (cache_index, true, coord_type);
+            }
+        }
+
+        public bool IsCellShowing (ColumnCellAccessible cell)
+        {
+            Gdk.Rectangle cell_extents = GetCellExtents (cell, Atk.CoordType.Window);
+
+            if (cell_extents.X == Int32.MinValue && cell_extents.Y == Int32.MinValue)
+                return false;
+
+            return true;
+        }
+
+        public bool IsCellFocused (ColumnCellAccessible cell)
+        {
+            int cell_index = GetCellIndex (cell);
+            if (cell_index % NColumns != 0)
+                return false; // Only 0 column cells get focus now.
+
+            int row = cell_index / NColumns;
+
+            return row == list_view.Selection.FocusedIndex;
+        }
+
+        public bool IsCellSelected (ColumnCellAccessible cell)
+        {
+            return IsChildSelected (GetCellIndex (cell));
+        }
+
+        public bool IsCellActive (ColumnCellAccessible cell)
+        {
+            return (ActiveCell == (Atk.Object)cell);
+        }
+
+        public void InvokeColumnHeaderMenu (ColumnCellAccessible cell)
+        {
+            list_view.InvokeColumnHeaderMenu (GetCellIndex (cell));
+        }
+
+        public void ClickColumnHeader (ColumnCellAccessible cell)
+        {
+            list_view.ClickColumnHeader (GetCellIndex (cell));
+        }
+
+        public void CellRedrawn (int column, int row)
+        {
+            int index;
+            if (row >= 0)
+                index = row * n_columns + column + n_columns;
+            else
+                index = column;
+
+            if (cell_cache.ContainsKey (index)) {
+                cell_cache[index].Redrawn ();
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs
new file mode 100644
index 0000000..9036788
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs
@@ -0,0 +1,90 @@
+//
+// ListViewAccessible_Selection.cs
+//
+// Authors:
+//   Eitan Isaacson <eitan at ascender.com>
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+// Copyright (C) 2009 Eitan Isaacson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Hyena.Data.Gui;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    public partial class ListViewAccessible<T> : Atk.SelectionImplementor
+    {
+        public void ListViewAccessible_Selection ()
+        {
+            list_view.SelectionProxy.Changed += OnSelectionChanged;
+        }
+
+        public bool AddSelection (int index)
+        {
+            return AddRowSelection (GetRowAtIndex (index));
+        }
+
+        public bool ClearSelection ()
+        {
+            list_view.Selection.Clear ();
+            return true;
+        }
+
+        public bool IsChildSelected (int index)
+        {
+            return IsRowSelected (GetRowAtIndex (index));
+        }
+
+        public bool RemoveSelection (int index)
+        {
+            int row = list_view.Selection.RangeCollection [index / n_columns];
+            return RemoveRowSelection (row);
+        }
+
+        public Atk.Object RefSelection (int index)
+        {
+            int row = list_view.Selection.RangeCollection [index / n_columns];
+            int column = index % n_columns;
+            return RefAt (row, column);
+        }
+
+        public int SelectionCount {
+            get { return list_view.Selection.Count * n_columns; }
+        }
+
+        public bool SelectAllSelection ()
+        {
+            list_view.Selection.SelectAll ();
+            return true;
+        }
+
+        private void OnSelectionChanged (object o, EventArgs a)
+        {
+            GLib.Signal.Emit (this, "selection_changed");
+        }
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs
new file mode 100644
index 0000000..abfb6c9
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs
@@ -0,0 +1,190 @@
+//
+// ListViewAccessible_Table.cs
+//
+// Authors:
+//   Eitan Isaacson <eitan at ascender.com>
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+// Copyright (C) 2009 Eitan Isaacson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Hyena.Data.Gui;
+
+namespace Hyena.Data.Gui.Accessibility
+{
+    public partial class ListViewAccessible<T> : Atk.TableImplementor
+    {
+        public void ListViewAccessible_Table ()
+        {
+        }
+
+        public Atk.Object Caption {
+            get { return new Atk.NoOpObject (list_view); }
+            set {}
+        }
+
+        public int NColumns {
+            get { return n_columns; }
+            set {}
+        }
+
+        public int NRows {
+            get { return n_rows; }
+            set {}
+        }
+
+        public Atk.Object Summary {
+            get { return new Atk.NoOpObject (list_view); }
+            set {}
+        }
+
+        public bool AddColumnSelection (int column)
+        {
+            return false;
+        }
+
+        public bool AddRowSelection (int row)
+        {
+            list_view.Selection.Select (row);
+            return true;
+        }
+
+        public int GetColumnAtIndex (int index)
+        {
+            return NColumns == 0 ? -1 : (index - NColumns) % NColumns;
+        }
+
+        public string GetColumnDescription (int column)
+        {
+            var col = list_view.ColumnController.Where (c => c.Visible).ElementAtOrDefault (column);
+            return col == null ? null : col.LongTitle;
+        }
+
+        public int GetColumnExtentAt (int row, int column)
+        {
+            return 1;
+        }
+
+        public Atk.Object GetColumnHeader (int column)
+        {
+            if (column >= NColumns)
+                return new Atk.NoOpObject (list_view);
+            else
+                return OnRefChild (column);
+        }
+
+        public int GetIndexAt (int row, int column)
+        {
+            return row * NColumns + column + NColumns;
+        }
+
+        public int GetRowAtIndex (int index)
+        {
+            if (NColumns == 0)
+                return -1;
+            return (index - NColumns) / NColumns;
+        }
+
+        public string GetRowDescription (int row)
+        {
+            return "";
+        }
+
+        public int GetRowExtentAt (int row, int column)
+        {
+            return 1;
+        }
+
+        public Atk.Object GetRowHeader (int row)
+        {
+            return new Atk.NoOpObject (list_view);
+        }
+
+// Ensure https://bugzilla.novell.com/show_bug.cgi?id=512477 is fixed
+#if ENABLE_ATK
+        private static readonly int [] empty_int_array = new int[0];
+        public int [] SelectedColumns {
+            get { return empty_int_array; }
+        }
+
+        public int [] SelectedRows {
+            get { return list_view.Selection.ToArray (); }
+        }
+#else
+        public int GetSelectedRows (out int row) { row = 0; return 0; }
+        public int GetSelectedColumns (out int cols) { cols = 0; return 0; }
+#endif
+
+        public bool IsColumnSelected (int column)
+        {
+            return false;
+        }
+
+        public bool IsRowSelected (int row)
+        {
+            return list_view.Selection.Contains (row);
+        }
+
+        public bool IsSelected (int row, int column)
+        {
+            return list_view.Selection.Contains (row);
+        }
+
+        public Atk.Object RefAt (int row, int column)
+        {
+            int index = NColumns * row + column + NColumns;
+            return OnRefChild (index);
+        }
+
+        public bool RemoveColumnSelection (int column)
+        {
+            return false;
+        }
+
+        public bool RemoveRowSelection (int row)
+        {
+            list_view.Selection.Unselect (row);
+            return true;
+        }
+
+        public void SetColumnDescription (int column, string description)
+        {
+        }
+
+        public void SetColumnHeader (int column, Atk.Object header)
+        {
+        }
+
+        public void SetRowDescription (int row, string description)
+        {
+        }
+
+        public void SetRowHeader (int row, Atk.Object header)
+        {
+        }
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
index bd4a625..f25ec0d 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
@@ -43,7 +43,7 @@ namespace Hyena.Data.Gui
         private Gdk.Rectangle clip;
         private bool text_as_foreground = false;
         private bool opaque = true;
-        
+
         public Cairo.Context Context {
             get { return context; }
             set { context = value; }
@@ -73,12 +73,12 @@ namespace Hyena.Data.Gui
             get { return area; }
             set { area = value; }
         }
-        
+
         public Gdk.Rectangle Clip {
             get { return clip; }
             set { clip = value; }
         }
-        
+
         public bool TextAsForeground {
             get { return text_as_foreground; }
             set { text_as_foreground = value; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs
index fd84faa..5840764 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs
@@ -40,40 +40,40 @@ namespace Hyena.Data.Gui
     {
         private ColumnCell header_cell;
         private List<ColumnCell> cells = new List<ColumnCell> ();
-        
+
         private int min_width = 0;
         private int max_width = Int32.MaxValue;
-        
+
         public Column (ColumnDescription description) :
             this (description, new ColumnCellText (description.Property, true))
         {
         }
-        
+
         public Column (ColumnDescription description, ColumnCell cell) :
             this (description.Title, cell, description.Width, description.Visible)
         {
         }
-        
+
         public Column (string title, ColumnCell cell, double width)
             : this (title, cell, width, true)
         {
         }
-        
-        public Column (string title, ColumnCell cell, double width, bool visible) 
+
+        public Column (string title, ColumnCell cell, double width, bool visible)
             : this (null, title, cell, width, visible)
         {
         }
-        
+
         public Column (ColumnCell headerCell, string title, ColumnCell cell, double width)
             : this (headerCell, title, cell, width, true)
         {
         }
-        
+
         public Column (ColumnCell headerCell, string title, ColumnCell cell, double width, bool visible)
             : this (headerCell, title, cell, width, visible, 0, Int32.MaxValue)
         {
         }
-        
+
         public Column (ColumnCell headerCell, string title, ColumnCell cell, double width, bool visible, int minWidth, int maxWidth)
             : base (cell.Property, title, width, visible)
         {
@@ -89,47 +89,47 @@ namespace Hyena.Data.Gui
 
             PackStart (cell);
         }
-        
+
         private Column HeaderCellDataHandler ()
         {
             return this;
         }
-        
+
         public void PackStart (ColumnCell cell)
         {
             cells.Insert (0, cell);
         }
-        
+
         public void PackEnd (ColumnCell cell)
         {
             cells.Add (cell);
         }
-        
-        public ColumnCell GetCell (int index) 
+
+        public ColumnCell GetCell (int index)
         {
             return cells[index];
         }
-        
+
         public void RemoveCell (int index)
         {
             cells.RemoveAt (index);
         }
-        
+
         public void ClearCells ()
         {
             cells.Clear ();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return cells.GetEnumerator ();
         }
-        
+
         IEnumerator<ColumnCell> IEnumerable<ColumnCell>.GetEnumerator ()
         {
             return cells.GetEnumerator ();
         }
-        
+
         public ColumnCell HeaderCell {
             get { return header_cell; }
             set { header_cell = value; }
@@ -170,7 +170,7 @@ namespace Hyena.Data.Gui
                 }
             }
         }
-        
+
         public int MinWidth {
             get { return min_width; }
             set {
@@ -180,7 +180,7 @@ namespace Hyena.Data.Gui
                 }
             }
         }
-        
+
         public int MaxWidth {
             get { return max_width; }
             set {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs
index 7812d1a..65b3904 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs
@@ -31,6 +31,8 @@ using System.Reflection;
 using Gtk;
 using Cairo;
 
+using Hyena.Data.Gui.Accessibility;
+
 namespace Hyena.Data.Gui
 {
     public abstract class ColumnCell
@@ -40,7 +42,17 @@ namespace Hyena.Data.Gui
         private PropertyInfo property_info, sub_property_info;
         private object bound_object;
         private object bound_object_parent;
-            
+
+        public virtual Atk.Object GetAccessible (ICellAccessibleParent parent)
+        {
+            return new ColumnCellAccessible (BoundObject, this, parent);
+        }
+
+        public virtual string GetTextAlternative (object obj)
+        {
+            return "";
+        }
+
         public ColumnCell (string property, bool expand)
         {
             Property = property;
@@ -54,9 +66,9 @@ namespace Hyena.Data.Gui
                 bound_object = null;
                 return;
             }
-            
+
             bound_object_parent = item;
-            
+
             if (property != null) {
                 EnsurePropertyInfo ();
                 bound_object = property_info.GetValue (bound_object_parent, null);
@@ -74,7 +86,7 @@ namespace Hyena.Data.Gui
         {
             EnsurePropertyInfo (property, ref property_info, bound_object_parent);
         }
-        
+
         private void EnsurePropertyInfo (string name, ref PropertyInfo prop, object obj)
         {
             if (prop == null || prop.ReflectedType != obj.GetType ()) {
@@ -87,15 +99,15 @@ namespace Hyena.Data.Gui
                 }
             }
         }
-        
+
         public virtual void NotifyThemeChange ()
         {
         }
-        
+
         protected Type BoundType {
             get { return bound_object.GetType (); }
         }
-        
+
         protected object BoundObject {
             get { return bound_object; }
             set {
@@ -105,18 +117,18 @@ namespace Hyena.Data.Gui
                 }
             }
         }
-        
+
         protected object BoundObjectParent {
             get { return bound_object_parent; }
         }
-        
+
         public abstract void Render (CellContext context, StateType state, double cellWidth, double cellHeight);
-        
+
         public bool Expand {
             get { return expand; }
             set { expand = value; }
         }
-        
+
         public string Property {
             get { return property; }
             set {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs
index 80539bd..bfed4bd 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs
@@ -30,91 +30,91 @@ using System;
 using Gtk;
 
 namespace Hyena.Data.Gui
-{    
+{
     public class ColumnCellCheckBox : ColumnCell, IInteractiveCell, ISizeRequestCell
-    {   
+    {
         public ColumnCellCheckBox (string property, bool expand) : base (property, expand)
         {
         }
-            
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             int cell_width = context.Area.Width - 2 * Xpad;
             int cell_height = context.Area.Height - 2 * Ypad;
             int x = context.Area.X + xpad + ((cell_width - Size) / 2);
             int y = context.Area.Y + ypad + ((cell_height - Size) / 2);
-            
+
             if (state == StateType.Normal && last_hover_bound == BoundObjectParent) {
                 state = StateType.Prelight;
             }
-            
-            Style.PaintCheck (context.Widget.Style, context.Drawable, state, 
-                Value ? ShadowType.In : ShadowType.Out, 
+
+            Style.PaintCheck (context.Widget.Style, context.Drawable, state,
+                Value ? ShadowType.In : ShadowType.Out,
                 context.Clip, context.Widget, "cellcheck", x, y, Size, Size);
         }
-        
+
         private object last_pressed_bound;
         private object last_hover_bound;
-        
+
         public bool ButtonEvent (int x, int y, bool pressed, Gdk.EventButton evnt)
         {
             if (pressed) {
                 last_pressed_bound = BoundObjectParent;
                 return false;
             }
-            
+
             if (last_pressed_bound != null && last_pressed_bound.Equals (BoundObjectParent)) {
                 Value = !Value;
                 last_pressed_bound = null;
             }
-            
+
             return true;
         }
-        
+
         public bool MotionEvent (int x, int y, Gdk.EventMotion evnt)
         {
             if (last_hover_bound == BoundObjectParent) {
                 return false;
             }
-            
+
             last_hover_bound = BoundObjectParent;
             return true;
         }
-        
+
         public bool PointerLeaveEvent ()
         {
             last_hover_bound = null;
             return true;
         }
-        
+
         public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
             min = max = 2 * Xpad + Size;
         }
-        
+
         private bool restrict_size = true;
         public bool RestrictSize {
             get { return restrict_size; }
             set { restrict_size = value; }
         }
-        
+
         private bool Value {
             get { return (bool)BoundObject; }
             set { BoundObject = value; }
         }
-        
+
         private int size = 13;
         public int Size {
             get { return size; }
             set { size = value; }
         }
-        
+
         private int xpad = 2;
         public int Xpad {
             get { return xpad; }
             set { xpad = value; }
         }
-        
+
         public int ypad = 2;
         public int Ypad {
             get { return ypad; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
index 802c6c8..e1efeb2 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
@@ -33,116 +33,126 @@ using Hyena.Gui;
 using Hyena.Gui.Theming;
 
 namespace Hyena.Data.Gui
-{    
+{
     public class ColumnCellRating : ColumnCell, IInteractiveCell, ISizeRequestCell
-    {   
+    {
         private object last_pressed_bound;
         private object hover_bound;
         private int hover_value;
         private Gdk.Rectangle actual_area_hack;
         private RatingRenderer renderer = new RatingRenderer ();
-        
+
         public ColumnCellRating (string property, bool expand) : base (property, expand)
         {
             Xpad = 0;
         }
-            
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             Gdk.Rectangle area = new Gdk.Rectangle (0, 0, context.Area.Width, context.Area.Height);
-            
+
             // FIXME: Compute font height and set to renderer.Size
 
             renderer.Value = Value;
             bool is_hovering = hover_bound == BoundObjectParent && hover_bound != null;
-            renderer.Render (context.Context, area, context.Theme.Colors.GetWidgetColor (GtkColorClass.Text, state), 
+            renderer.Render (context.Context, area, context.Theme.Colors.GetWidgetColor (GtkColorClass.Text, state),
                 is_hovering, is_hovering, hover_value, 0.8, 0.45, 0.35);
-            
+
             // FIXME: Something is hosed in the view when computing cell dimensions
             // The cell width request is always smaller than the actual cell, so
-            // this value is preserved once we compute it from rendering so the 
+            // this value is preserved once we compute it from rendering so the
             // input stuff can do its necessary calculations
             actual_area_hack = area;
         }
-        
+
         public bool ButtonEvent (int x, int y, bool pressed, Gdk.EventButton evnt)
         {
+            if (ReadOnly) {
+                return false;
+            }
+
             if (pressed) {
                 last_pressed_bound = BoundObjectParent;
                 return false;
             }
-            
+
             if (last_pressed_bound == BoundObjectParent) {
                 Value = RatingFromPosition (x);
                 last_pressed_bound = null;
             }
-            
+
             return true;
         }
-        
+
         public bool MotionEvent (int x, int y, Gdk.EventMotion evnt)
         {
+            if (ReadOnly) {
+                return false;
+            }
+
             int value = RatingFromPosition (x);
-        
+
             if (hover_bound == BoundObjectParent && value == hover_value) {
                 return false;
             }
-            
+
             hover_bound = BoundObjectParent;
             hover_value = value;
             return true;
         }
-        
+
         public bool PointerLeaveEvent ()
         {
             hover_bound = null;
             hover_value = MinRating - 1;
             return true;
         }
-        
+
         public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
             min = max = renderer.Width;
         }
-        
+
         private int RatingFromPosition (double x)
         {
             return renderer.RatingFromPosition (actual_area_hack, x);
         }
-        
+
         private bool restrict_size = true;
         public bool RestrictSize {
             get { return restrict_size; }
             set { restrict_size = value; }
         }
-        
+
         private int Value {
             get { return BoundObject == null ? MinRating : renderer.ClampValue ((int)BoundObject); }
             set { BoundObject = renderer.ClampValue (value); }
         }
-        
+
         public int MaxRating {
             get { return renderer.MaxRating; }
             set { renderer.MaxRating = value; }
         }
-        
+
         public int MinRating {
             get { return renderer.MinRating; }
             set { renderer.MinRating = value; }
         }
-        
+
         public int RatingLevels {
             get { return renderer.RatingLevels; }
         }
-        
+
         public int Xpad {
             get { return renderer.Xpad; }
             set { renderer.Xpad = value; }
         }
-        
+
         public int Ypad {
             get { return renderer.Ypad; }
             set { renderer.Ypad = value; }
         }
+
+        public bool ReadOnly { get; set; }
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
index b13d06c..0a2c126 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
@@ -32,6 +32,7 @@ using Cairo;
 
 using Hyena.Gui;
 using Hyena.Gui.Theming;
+using Hyena.Data.Gui.Accessibility;
 
 namespace Hyena.Data.Gui
 {
@@ -40,7 +41,7 @@ namespace Hyena.Data.Gui
         internal const int Spacing = 4;
 
         public delegate string DataHandler ();
-    
+
         private Pango.Weight font_weight = Pango.Weight.Normal;
         private Pango.EllipsizeMode ellipsize_mode = Pango.EllipsizeMode.End;
         private Pango.Alignment alignment = Pango.Alignment.Left;
@@ -50,31 +51,41 @@ namespace Hyena.Data.Gui
         protected string MinString, MaxString;
         private string last_text = null;
         private bool use_markup;
-        
+
         public ColumnCellText (string property, bool expand) : base (property, expand)
         {
         }
 
-        protected void SetMinMaxStrings (object min_max)
+        public override Atk.Object GetAccessible (ICellAccessibleParent parent)
+        {
+            return new ColumnCellTextAccessible (BoundObject, this, parent);
+        }
+
+        public override string GetTextAlternative (object obj)
+        {
+            return GetText (obj);
+        }
+
+        public void SetMinMaxStrings (object min_max)
         {
             SetMinMaxStrings (min_max, min_max);
         }
-        
-        protected void SetMinMaxStrings (object min, object max)
+
+        public void SetMinMaxStrings (object min, object max)
         {
             // Set the min/max strings from the min/max objects
             MinString = GetText (min);
             MaxString = GetText (max);
             RestrictSize = true;
         }
-    
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             UpdateText (context, cellWidth);
             if (String.IsNullOrEmpty (last_text)) {
                 return;
             }
-            
+
             context.Context.Rectangle (0, 0, cellWidth, cellHeight);
             context.Context.Clip ();
             context.Context.MoveTo (Spacing, ((int)cellHeight - text_height) / 2);
@@ -124,7 +135,7 @@ namespace Hyena.Data.Gui
             UpdateText (cellContext, columnWidth);
             return IsEllipsized ? GLib.Markup.EscapeText (Text) : null;
         }
-        
+
         protected virtual string GetText (object obj)
         {
             return obj == null ? String.Empty : obj.ToString ();
@@ -146,11 +157,11 @@ namespace Hyena.Data.Gui
         public string Text {
             get { return last_text; }
         }
-        
+
         protected int TextWidth {
             get { return text_width; }
         }
-        
+
         protected int TextHeight {
             get { return text_height; }
         }
@@ -159,22 +170,22 @@ namespace Hyena.Data.Gui
             get { return text_format; }
             set { text_format = value; }
         }
-        
+
         public Pango.Alignment Alignment {
             get { return alignment; }
             set { alignment = value; }
         }
-        
+
         public virtual Pango.Weight FontWeight {
             get { return font_weight; }
             set { font_weight = value; }
         }
-        
+
         public virtual Pango.EllipsizeMode EllipsizeMode {
             get { return ellipsize_mode; }
             set { ellipsize_mode = value; }
         }
-        
+
         internal static int ComputeRowHeight (Widget widget)
         {
             int w_width, row_height;
@@ -185,13 +196,13 @@ namespace Hyena.Data.Gui
             return row_height + 8;
         }
 
-        #region ISizeRequestCell implementation 
-        
+        #region ISizeRequestCell implementation
+
         public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
             int height;
             min = max = -1;
-            
+
             if (!String.IsNullOrEmpty (MinString)) {
                 UpdateLayout (layout, MinString);
                 layout.GetPixelSize (out min, out height);
@@ -206,7 +217,7 @@ namespace Hyena.Data.Gui
                 //Console.WriteLine ("for {0} got max {1} for {2}", this, max, MaxString);
             }
         }
-        
+
         private bool restrict_size = false;
         public bool RestrictSize {
             get { return restrict_size; }
@@ -217,7 +228,7 @@ namespace Hyena.Data.Gui
             get { return use_markup; }
             set { use_markup = value; }
         }
-        
+
         #endregion
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs
index 723e673..1ebb336 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs
@@ -31,28 +31,28 @@ using System.Collections;
 using System.Collections.Generic;
 
 namespace Hyena.Data.Gui
-{    
+{
     public class ColumnController : IEnumerable<Column>
     {
         private List<Column> columns = new List<Column> ();
         private ISortableColumn default_sort_column;
         private ISortableColumn sort_column;
-        
+
         protected List<Column> Columns {
             get { return columns; }
         }
-        
+
         public event EventHandler Updated;
-        
+
         protected virtual void OnVisibilitiesChanged ()
         {
             OnUpdated ();
         }
-        
+
         protected virtual void OnWidthsChanged ()
         {
         }
-        
+
         protected void OnUpdated ()
         {
             EventHandler handler = Updated;
@@ -60,7 +60,7 @@ namespace Hyena.Data.Gui
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void Clear ()
         {
             lock (this) {
@@ -70,7 +70,7 @@ namespace Hyena.Data.Gui
                 }
                 columns.Clear ();
             }
-            
+
             OnUpdated ();
         }
 
@@ -94,10 +94,10 @@ namespace Hyena.Data.Gui
                 column.WidthChanged += OnColumnWidthChanged;
                 columns.Add (column);
             }
-            
+
             OnUpdated ();
         }
-        
+
         public void Insert (Column column, int index)
         {
             lock (this) {
@@ -105,10 +105,10 @@ namespace Hyena.Data.Gui
                 column.WidthChanged += OnColumnWidthChanged;
                 columns.Insert (index, column);
             }
-            
+
             OnUpdated ();
         }
-        
+
         public void Remove (Column column)
         {
             lock (this) {
@@ -116,10 +116,10 @@ namespace Hyena.Data.Gui
                 column.WidthChanged -= OnColumnWidthChanged;
                 columns.Remove (column);
             }
-            
+
             OnUpdated ();
         }
-        
+
         public void Remove (int index)
         {
             lock (this) {
@@ -128,10 +128,10 @@ namespace Hyena.Data.Gui
                 column.WidthChanged -= OnColumnWidthChanged;
                 columns.RemoveAt (index);
             }
-            
+
             OnUpdated ();
         }
-        
+
         public void Reorder (int index, int newIndex)
         {
             lock (this) {
@@ -139,42 +139,42 @@ namespace Hyena.Data.Gui
                 columns.RemoveAt (index);
                 columns.Insert (newIndex, column);
             }
-            
+
             OnUpdated ();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return columns.GetEnumerator ();
         }
-        
+
         IEnumerator<Column> IEnumerable<Column>.GetEnumerator ()
         {
             return columns.GetEnumerator ();
         }
-        
+
         public int IndexOf (Column column)
         {
             lock (this) {
                 return columns.IndexOf (column);
             }
         }
-        
+
         public Column [] ToArray ()
         {
             return columns.ToArray ();
         }
-        
+
         private void OnColumnVisibilityChanged (object o, EventArgs args)
         {
             OnVisibilitiesChanged ();
         }
-        
+
         private void OnColumnWidthChanged (object o, EventArgs args)
         {
             OnWidthsChanged ();
         }
-        
+
         public Column this[int index] {
             get { return columns[index]; }
         }
@@ -188,11 +188,11 @@ namespace Hyena.Data.Gui
             get { return sort_column; }
             set { sort_column = value;}
         }
-        
+
         public int Count {
             get { return columns.Count; }
         }
-        
+
         public virtual bool EnableColumnMenu {
             get { return false; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs
index bb00152..a5d17b6 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs
@@ -30,12 +30,14 @@ using System;
 using Gtk;
 using Cairo;
 
+using Hyena.Data.Gui.Accessibility;
+
 namespace Hyena.Data.Gui
 {
     public class ColumnHeaderCellText : ColumnCellText, IHeaderCell
     {
         public delegate Column DataHandler ();
-        
+
         private DataHandler data_handler;
         private bool has_sort;
 
@@ -43,13 +45,18 @@ namespace Hyena.Data.Gui
         {
             this.data_handler = data_handler;
         }
-    
+
+        public override Atk.Object GetAccessible (ICellAccessibleParent parent)
+        {
+            return new  ColumnHeaderCellTextAccessible (BoundObject, this, parent);
+        }
+
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
             if (data_handler == null) {
                 return;
             }
-            
+
             if (!has_sort) {
                 base.Render (context, state, cellWidth, cellHeight);
                 return;
@@ -71,17 +78,17 @@ namespace Hyena.Data.Gui
                 context.Theme.DrawArrow (context.Context, arrow_alloc, sort_type);
             }
         }
-        
+
         protected override string GetText (object obj)
         {
             return data_handler ().Title;
         }
-        
+
         public bool HasSort {
             get { return has_sort; }
             set { has_sort = value; }
         }
-        
+
         public static int GetArrowWidth (int headerHeight)
         {
             return (int)(headerHeight / 3.0) + Spacing;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IListView.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IListView.cs
index 18167d5..ac5fab7 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IListView.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IListView.cs
@@ -32,13 +32,13 @@ namespace Hyena.Data.Gui
     {
         Hyena.Collections.SelectionProxy SelectionProxy { get; }
         Hyena.Collections.Selection Selection { get; }
-        
+
         void ScrollTo (int index);
         void CenterOn (int index);
         void GrabFocus ();
         ColumnController ColumnController { get; set; }
     }
-    
+
     public interface IListView<T> : IListView
     {
         void SetModel (IListModel<T> model);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs
index 97fd59b..473bd2a 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs
@@ -30,7 +30,7 @@
 using System;
 
 namespace Hyena.Data.Gui
-{   
+{
     public interface ISizeRequestCell
     {
         bool RestrictSize { get; set; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs
index 7b447ad..ca541cd 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs
@@ -30,7 +30,7 @@
 using System;
 
 namespace Hyena.Data.Gui
-{   
+{
     public interface ITextCell
     {
         Pango.Weight FontWeight { get; set; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView.cs
index e6d61eb..5d02fcc 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView.cs
@@ -48,7 +48,7 @@ namespace Hyena.Data.Gui
                 ITooltipCell cell;
                 Column column;
                 int row_index;
-                
+
                 if (GetEventCell<ITooltipCell> (args.X, args.Y, out cell, out column, out row_index)) {
                     CachedColumn cached_column = GetCachedColumnForColumn (column);
 
@@ -72,7 +72,7 @@ namespace Hyena.Data.Gui
 
                         // TODO not right - could be smaller if at the top/bottom and only partially showing
                         rect.Height = RowHeight;
-                        
+
                         args.Tooltip.Markup = markup;
                         args.Tooltip.TipArea = rect;
                         args.RetVal = true;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Accessible.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Accessible.cs
new file mode 100644
index 0000000..1c8abc7
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Accessible.cs
@@ -0,0 +1,177 @@
+//
+// ListView_Accessible.cs
+//
+// Authors:
+//   Gabriel Burt <gburt at novell.com>
+//   Eitan Isaacson <eitan at ascender.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+// Copyright (C) 2009 Eitan Isaacson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Gtk;
+
+using Hyena.Data.Gui.Accessibility;
+
+namespace Hyena.Data.Gui
+{
+    public partial class ListView<T> : ListViewBase
+    {
+        static ListView ()
+        {
+#if ENABLE_ATK
+            ListViewAccessibleFactory<T>.Init ();
+#endif
+        }
+
+        public Gdk.Rectangle GetColumnCellExtents (int row, int column)
+        {
+            return GetColumnCellExtents (row, column, true);
+        }
+
+        public Gdk.Rectangle GetColumnCellExtents (int row, int column, bool clip) {
+            return GetColumnCellExtents (row, column, clip, Atk.CoordType.Window);
+        }
+
+        public Gdk.Rectangle GetColumnCellExtents (int row, int column, bool clip, Atk.CoordType coord_type)
+        {
+            int width = GetColumnWidth (column);
+            int height = RowHeight;
+
+            int y = (int)GetYAtRow (row) - VadjustmentValue + ListAllocation.Y;
+
+            int x = ListAllocation.X - HadjustmentValue;
+            for (int index=0;index<column;index++)
+                x += GetColumnWidth (index);
+
+            Gdk.Rectangle rectangle = new Gdk.Rectangle (x, y, width, height);
+
+            if (clip && !ListAllocation.Contains (rectangle))
+                return new Gdk.Rectangle (Int32.MinValue, Int32.MinValue, Int32.MinValue, Int32.MinValue);
+
+            if (coord_type == Atk.CoordType.Window)
+                return rectangle;
+
+            int origin_x, origin_y;
+            GdkWindow.GetPosition (out origin_x, out origin_y);
+
+            rectangle.X += origin_x;
+            rectangle.Y += origin_y;
+
+            return rectangle;
+        }
+
+        public Gdk.Rectangle GetColumnHeaderCellExtents (int column, bool clip, Atk.CoordType coord_type)
+        {
+            if (!HeaderVisible)
+                return new Gdk.Rectangle (Int32.MinValue, Int32.MinValue, Int32.MinValue, Int32.MinValue);
+            int width = GetColumnWidth (column);
+            int height = HeaderHeight;
+
+            int x = header_rendering_alloc.X - HadjustmentValue + Theme.BorderWidth;
+            if (column != 0)
+                x += Theme.InnerBorderWidth;
+            for (int index=0;index<column;index++)
+                x += GetColumnWidth (index);
+
+            int y = Theme.BorderWidth + header_rendering_alloc.Y;
+
+            Gdk.Rectangle rectangle = new Gdk.Rectangle (x, y, width, height);
+
+            if (coord_type == Atk.CoordType.Window)
+                return rectangle;
+
+            int origin_x, origin_y;
+            GdkWindow.GetPosition (out origin_x, out origin_y);
+
+            rectangle.X += origin_x;
+            rectangle.Y += origin_y;
+
+            return rectangle;
+        }
+
+        public void GetCellAtPoint (int x, int y, Atk.CoordType coord_type, out int row, out int col)
+        {
+            int origin_x = 0;
+            int origin_y = 0;
+            if (coord_type == Atk.CoordType.Screen)
+                GdkWindow.GetPosition (out origin_x, out origin_y);
+
+            x = x - ListAllocation.X - origin_x;
+            y = y - ListAllocation.Y - origin_y;
+
+            Column column = GetColumnAt (x);
+
+            CachedColumn cached_column = GetCachedColumnForColumn (column);
+
+            row = GetRowAtY (y);
+            col = cached_column.Index;
+        }
+
+        public void InvokeColumnHeaderMenu (int column)
+        {
+            Gdk.Rectangle rectangle = GetColumnHeaderCellExtents (column, true, Atk.CoordType.Window);
+            Column col = ColumnController.Where (c => c.Visible).ElementAtOrDefault (column);
+            OnColumnRightClicked (col, rectangle.X + rectangle.Width/2, rectangle.Y + rectangle.Height/2);
+        }
+
+        public void ClickColumnHeader (int column)
+        {
+            Column col = ColumnController.Where (c => c.Visible).ElementAtOrDefault (column);
+            OnColumnLeftClicked (col);
+        }
+
+        private void AccessibleCellRedrawn (int column, int row)
+        {
+            var accessible = Accessible as ICellAccessibleParent;
+            if (accessible != null) {
+                accessible.CellRedrawn (column, row);
+            }
+        }
+
+    }
+
+#if ENABLE_ATK
+    internal class ListViewAccessibleFactory<T> : Atk.ObjectFactory
+    {
+        public static void Init ()
+        {
+            new ListViewAccessibleFactory<T> ();
+            Atk.Global.DefaultRegistry.SetFactoryType ((GLib.GType)typeof (ListView<T>), (GLib.GType)typeof (ListViewAccessibleFactory<T>));
+        }
+
+        protected override Atk.Object OnCreateAccessible (GLib.Object obj)
+        {
+            return new ListViewAccessible<T> (obj);
+        }
+
+        protected override GLib.GType OnGetAccessibleType ()
+        {
+            return ListViewAccessible<T>.GType;
+        }
+    }
+#endif
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs
index 1f5980a..9b5cfb5 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs
@@ -30,25 +30,25 @@ using System;
 using Gtk;
 
 namespace Hyena.Data.Gui
-{    
+{
     public static class ListViewDragDropTarget
     {
         public enum TargetType
         {
             ModelSelection
         }
-        
+
         public static readonly TargetEntry ModelSelection =
             new TargetEntry ("application/x-hyena-data-model-selection", TargetFlags.App,
                 (uint)TargetType.ModelSelection);
     }
-    
+
     public partial class ListView<T> : ListViewBase
     {
         private static TargetEntry [] drag_drop_dest_entries = new TargetEntry [] {
             ListViewDragDropTarget.ModelSelection
         };
-        
+
         protected virtual TargetEntry [] DragDropDestEntries {
             get { return drag_drop_dest_entries; }
         }
@@ -56,7 +56,7 @@ namespace Hyena.Data.Gui
         protected virtual TargetEntry [] DragDropSourceEntries {
             get { return drag_drop_dest_entries; }
         }
-        
+
         private bool is_reorderable = false;
         public bool IsReorderable {
             get { return is_reorderable && IsEverReorderable; }
@@ -76,7 +76,7 @@ namespace Hyena.Data.Gui
                 OnDragDestSet ();
             }
         }
-        
+
         private bool force_drag_source_set = false;
         protected bool ForceDragSourceSet {
             get { return force_drag_source_set; }
@@ -85,7 +85,7 @@ namespace Hyena.Data.Gui
                 OnDragSourceSet ();
             }
         }
-        
+
         private bool force_drag_dest_set = false;
         protected bool ForceDragDestSet {
             get { return force_drag_dest_set; }
@@ -94,7 +94,7 @@ namespace Hyena.Data.Gui
                 OnDragDestSet ();
             }
         }
-        
+
         protected virtual void OnDragDestSet ()
         {
             if (ForceDragDestSet || IsReorderable) {
@@ -103,34 +103,34 @@ namespace Hyena.Data.Gui
                 Gtk.Drag.DestUnset (this);
             }
         }
-        
+
         protected virtual void OnDragSourceSet ()
         {
             if (ForceDragSourceSet || IsReorderable) {
-                Gtk.Drag.SourceSet (this, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask, 
+                Gtk.Drag.SourceSet (this, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask,
                     DragDropSourceEntries, Gdk.DragAction.Copy | Gdk.DragAction.Move);
             } else {
                 Gtk.Drag.SourceUnset (this);
             }
         }
-        
+
         private uint drag_scroll_timeout_id;
         private uint drag_scroll_timeout_duration = 50;
         private double drag_scroll_velocity;
         private double drag_scroll_velocity_max = 100.0;
         private int drag_reorder_row_index = -1;
         private int drag_reorder_motion_y = -1;
-        
+
         private void StopDragScroll ()
         {
             drag_scroll_velocity = 0.0;
-            
+
             if (drag_scroll_timeout_id > 0) {
                 GLib.Source.Remove (drag_scroll_timeout_id);
                 drag_scroll_timeout_id = 0;
             }
         }
-        
+
         private void OnDragScroll (GLib.TimeoutHandler handler, double threshold, int total, int position)
         {
             if (position < threshold) {
@@ -141,12 +141,12 @@ namespace Hyena.Data.Gui
                 StopDragScroll ();
                 return;
             }
-            
+
             if (drag_scroll_timeout_id == 0) {
                 drag_scroll_timeout_id = GLib.Timeout.Add (drag_scroll_timeout_duration, handler);
             }
         }
-        
+
         protected override bool OnDragMotion (Gdk.DragContext context, int x, int y, uint time)
         {
             if (!IsReorderable) {
@@ -156,20 +156,20 @@ namespace Hyena.Data.Gui
                 InvalidateList ();
                 return false;
             }
-            
+
             drag_reorder_motion_y = y;
             DragReorderUpdateRow ();
-            
+
             OnDragScroll (OnDragVScrollTimeout, Allocation.Height * 0.3, Allocation.Height, y);
-            
+
             return true;
         }
-        
+
         protected override void OnDragLeave (Gdk.DragContext context, uint time)
         {
             StopDragScroll ();
         }
-        
+
         protected override void OnDragEnd (Gdk.DragContext context)
         {
             StopDragScroll ();
@@ -177,28 +177,28 @@ namespace Hyena.Data.Gui
             drag_reorder_motion_y = -1;
             InvalidateList ();
         }
-        
+
         private bool OnDragVScrollTimeout ()
         {
             ScrollTo (VadjustmentValue + (drag_scroll_velocity * drag_scroll_velocity_max));
             DragReorderUpdateRow ();
             return true;
         }
-        
+
         private void DragReorderUpdateRow ()
         {
             int row = GetDragRow (drag_reorder_motion_y);
             if (row != drag_reorder_row_index) {
                 drag_reorder_row_index = row;
                 InvalidateList ();
-            }   
+            }
         }
-        
+
         protected int GetDragRow (int y)
         {
             y = TranslateToListY (y);
             int row = GetRowAtY (y);
-            
+
             if (row == -1) {
                 return -1;
             }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
index 707a6e7..f9aae51 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
@@ -51,12 +51,13 @@ namespace Hyena.Data.Gui
             public double ElasticWidth;
             public double ElasticPercent;
         }
-        
+
         private static Gdk.Cursor resize_x_cursor = new Gdk.Cursor (Gdk.CursorType.SbHDoubleArrow);
         private static Gdk.Cursor drag_cursor = new Gdk.Cursor (Gdk.CursorType.Fleur);
 
         private bool resizable;
         private int header_width;
+        private double list_width, max_width;
         private int sort_column_index = -1;
         private int resizing_column_index = -1;
         private int pressed_column_index = -1;
@@ -67,62 +68,70 @@ namespace Hyena.Data.Gui
         private int pressed_column_x_start_hadjustment = -1;
         private bool pressed_column_is_dragging = false;
         private bool pressed_column_drag_started = false;
-        
+
         private Pango.Layout column_layout;
-        
+
         private CachedColumn [] column_cache;
         private List<int> elastic_columns;
-        
+
+        public int Width {
+            get { return (int)list_width; }
+        }
+
+        public int MaxWidth {
+            get { return (int)max_width + Theme.TotalBorderWidth*2; }
+        }
+
 #region Columns
-        
+
         private void InvalidateColumnCache ()
         {
             column_cache = null;
         }
-        
+
         private void GenerateColumnCache ()
         {
             column_cache = new CachedColumn[column_controller.Count];
-            
+
             int i = 0;
             double total = 0.0;
-            
+
             foreach (Column column in column_controller) {
                 if (!column.Visible) {
                     continue;
                 }
-                
+
                 // If we don't already have a MinWidth set, use the width of our Title text
                 column.CalculateWidths (column_layout, HeaderVisible, HeaderHeight);
                 column_cache[i] = new CachedColumn ();
                 column_cache[i].Column = column;
                 column_cache[i].Index = i;
-                
+
                 total += column.Width;
                 i++;
             }
-            
+
             Array.Resize (ref column_cache, i);
-            
+
             double scale_factor = 1.0 / total;
-            
+
             for (i = 0; i < column_cache.Length; i++) {
                 column_cache[i].Column.Width *= scale_factor;
             }
-            
+
             RecalculateColumnSizes ();
         }
-        
+
         private void RegenerateColumnCache ()
         {
             if (column_controller == null) {
                 return;
             }
-            
+
             if (column_cache == null) {
                 GenerateColumnCache ();
             }
-            
+
             for (int i = 0; i < column_cache.Length; i++) {
                 // Calculate this column's proportional share of the width, and set positions (X1/X2)
                 column_cache[i].Width = (int)Math.Round (((double)header_width * column_cache[i].Column.Width));
@@ -131,7 +140,7 @@ namespace Hyena.Data.Gui
                 column_cache[i].ResizeX1 = column_cache[i].X2;
                 column_cache[i].ResizeX2 = column_cache[i].ResizeX1 + 2;
             }
-            
+
             // TODO handle max width
             int index = column_cache.Length - 1;
             if (index >= 0) {
@@ -139,13 +148,13 @@ namespace Hyena.Data.Gui
                 column_cache[index].Width = column_cache[index].X2 - column_cache[index].X1;
             }
         }
-        
+
         private void RecalculateColumnSizes ()
         {
             if (column_cache == null) {
                 return;
             }
-            
+
             ISortable sortable = Model as ISortable;
             sort_column_index = -1;
             int min_header_width = 0;
@@ -178,7 +187,7 @@ namespace Hyena.Data.Gui
             } else {
                 header_width = header_interaction_alloc.Width;
                 resizable = true;
-                
+
                 if (elastic_columns == null) {
                     elastic_columns = new List<int> (column_cache.Length);
                 }
@@ -188,32 +197,41 @@ namespace Hyena.Data.Gui
                     column_cache[i].ElasticWidth = 0.0;
                     column_cache[i].ElasticPercent = column_cache[i].Column.Width * header_width;
                 }
-                
+
                 double remaining_width = RecalculateColumnSizes (header_width, header_width);
-                
-                while (remaining_width > 0 && elastic_columns.Count > 0) {
+
+                while (Math.Round (remaining_width) != 0.0 && elastic_columns.Count > 0) {
                     double total_elastic_width = 0.0;
                     foreach (int i in elastic_columns) {
                         total_elastic_width += column_cache[i].ElasticWidth;
                     }
                     remaining_width = RecalculateColumnSizes (remaining_width, total_elastic_width);
                 }
-                
+
                 for (int i = 0; i < column_cache.Length; i++) {
                     column_cache[i].Column.Width = column_cache[i].ElasticWidth / (double)header_width;
                 }
             }
+
+            double tmp_width = 0.0;
+            double tmp_max = 0.0;
+            foreach (var col in column_cache) {
+                tmp_width += col.ElasticWidth;
+                tmp_max += col.MaxWidth == Int32.MaxValue ? col.MinWidth : col.MaxWidth;
+            }
+            list_width = tmp_width;
+            max_width = tmp_max;
         }
-        
+
         private double RecalculateColumnSizes (double total_width, double total_elastic_width)
         {
             double remaining_width = total_width;
-            
+
             for (int index = 0; index < elastic_columns.Count; index++) {
                 int i = elastic_columns[index];
                 double percent = column_cache[i].ElasticPercent / total_elastic_width;
                 double delta = total_width * percent;
-                
+
                 // TODO handle max widths
                 double width = column_cache[i].ElasticWidth + delta;
                 if (width < column_cache[i].MinWidth) {
@@ -225,11 +243,11 @@ namespace Hyena.Data.Gui
                     elastic_columns.RemoveAt (index);
                     index--;
                 }
-                
+
                 remaining_width -= delta;
                 column_cache[i].ElasticWidth += delta;
             }
-            
+
             if (Math.Abs (total_width - remaining_width) < 1.0 || remaining_width == Double.NaN) {
                 Hyena.Log.Warning ("Forcefully breaking out of RCS loop b/c change in total_width less than 1.0");
                 return 0;
@@ -237,7 +255,7 @@ namespace Hyena.Data.Gui
 
             return Math.Round (remaining_width);
         }
-        
+
         protected virtual void OnColumnControllerUpdated ()
         {
             InvalidateColumnCache ();
@@ -245,7 +263,38 @@ namespace Hyena.Data.Gui
             UpdateAdjustments ();
             QueueDraw ();
         }
-        
+
+        protected virtual void OnColumnLeftClicked (Column clickedColumn)
+        {
+            if (Model is ISortable && clickedColumn is ISortableColumn) {
+                ISortableColumn sort_column = clickedColumn as ISortableColumn;
+                ISortable sortable = Model as ISortable;
+
+                // Change the sort-type with every click
+                if (sort_column == ColumnController.SortColumn) {
+                    switch (sort_column.SortType) {
+                        case SortType.Ascending:    sort_column.SortType = SortType.Descending; break;
+                        case SortType.Descending:   sort_column.SortType = SortType.None; break;
+                        case SortType.None:         sort_column.SortType = SortType.Ascending; break;
+                    }
+                }
+
+                // If we're switching from a different column, or we aren't reorderable, make sure sort type isn't None
+                if ((sort_column != ColumnController.SortColumn || !IsEverReorderable) && sort_column.SortType == SortType.None) {
+                    sort_column.SortType = SortType.Ascending;
+                }
+
+                sortable.Sort (sort_column);
+                ColumnController.SortColumn = sort_column;
+                IsReorderable = sortable.SortColumn == null || sortable.SortColumn.SortType == SortType.None;
+
+                Model.Reload ();
+                RecalculateColumnSizes ();
+                RegenerateColumnCache ();
+                InvalidateHeader ();
+            }
+        }
+
         protected virtual void OnColumnRightClicked (Column clickedColumn, int x, int y)
         {
             Column [] columns = ColumnController.ToArray ();
@@ -253,60 +302,60 @@ namespace Hyena.Data.Gui
                 // Fully qualified type name to avoid Mono 1.2.4 bug
                 return System.String.Compare (a.Title, b.Title);
             });
-            
+
             uint items = 0;
-            
+
             for (int i = 0; i < columns.Length; i++) {
                 if (columns[i].Id != null) {
                     items++;
                 }
             }
-            
+
             uint max_items_per_column = 15;
             if (items >= max_items_per_column * 2) {
                 max_items_per_column = (uint)Math.Ceiling (items / 3.0);
             } else if (items >= max_items_per_column) {
                 max_items_per_column = (uint)Math.Ceiling (items / 2.0);
             }
-            
+
             uint column_count = (uint)Math.Ceiling (items / (double)max_items_per_column);
-            
+
             Menu menu = new Menu ();
             uint row_offset = 2;
-            
+
             if (clickedColumn.Id != null) { // FIXME: Also restrict if the column vis can't be changed
                 menu.Attach (new ColumnHideMenuItem (clickedColumn), 0, column_count, 0, 1);
                 menu.Attach (new SeparatorMenuItem (), 0, column_count, 1, 2);
             }
-            
+
             items = 0;
-            
+
             for (uint i = 0, n = (uint)columns.Length, column = 0, row = 0; i < n; i++) {
                 if (columns[i].Id == null) {
                     continue;
                 }
-                
+
                 row = items++ % max_items_per_column;
-                
-                menu.Attach (new ColumnToggleMenuItem (columns[i]), 
+
+                menu.Attach (new ColumnToggleMenuItem (columns[i]),
                     column, column + 1, row + row_offset, row + 1 + row_offset);
-                
+
                 if (row == max_items_per_column - 1) {
                     column++;
                 }
             }
-            
+
             menu.ShowAll ();
             menu.Popup (null, null, delegate (Menu popup, out int pos_x, out int pos_y, out bool push_in) {
                 int win_x, win_y;
                 GdkWindow.GetOrigin (out win_x, out win_y);
-                
+
                 pos_x = win_x + x;
                 pos_y = win_y + y;
                 push_in = true;
             }, 3, Gtk.Global.CurrentEventTime);
         }
-        
+
         private void ResizeColumn (double x)
         {
             CachedColumn resizing_column = column_cache[resizing_column_index];
@@ -330,50 +379,50 @@ namespace Hyena.Data.Gui
             if (resizing_column.Width + resize_delta > resizing_column.MaxWidth) {
                 resize_delta = resizing_column.MaxWidth - resizing_column.Width;
             }
-            
+
             if (resize_delta == 0) {
                 return;
             }
-            
+
             int sign = Math.Sign (resize_delta);
             resize_delta = Math.Abs (resize_delta);
             double total_elastic_width = 0.0;
-            
+
             for (int i = real_resizing_column_index + 1; i < column_cache.Length; i++) {
                 total_elastic_width += column_cache[i].ElasticWidth = sign == 1
                     ? column_cache[i].Width - column_cache[i].MinWidth
                     : column_cache[i].MaxWidth - column_cache[i].Width;
             }
-            
+
             if (total_elastic_width == 0) {
                 return;
             }
-            
+
             if (resize_delta > total_elastic_width) {
                 resize_delta = total_elastic_width;
             }
 
             // Convert to a proprotional width
             resize_delta = sign * resize_delta / (double)header_width;
-            
+
             for (int i = real_resizing_column_index + 1; i < column_cache.Length; i++) {
                 column_cache[i].Column.Width += -resize_delta * (column_cache[i].ElasticWidth / total_elastic_width);
             }
-            
+
             resizing_column.Column.Width += resize_delta;
 
             RegenerateColumnCache ();
             QueueDraw ();
         }
-        
+
         private Column GetColumnForResizeHandle (int x)
         {
             if (column_cache == null || !resizable) {
                 return null;
             }
-            
+
             x += HadjustmentValue;
-            
+
             for (int i = 0; i < column_cache.Length - 1; i++) {
                 if (x < column_cache[i].ResizeX1 - 2) {
                     // No point in checking other columns since their ResizeX1 are even larger
@@ -386,6 +435,12 @@ namespace Hyena.Data.Gui
             return null;
         }
 
+        protected int GetColumnWidth (int column_index)
+        {
+            CachedColumn cached_column = column_cache[column_index];
+            return cached_column.Width;
+        }
+
         private bool CanResizeColumn (int column_index)
         {
             // At least one column to the left (including the one being resized) should be resizable.
@@ -410,24 +465,24 @@ namespace Hyena.Data.Gui
 
             return false;
         }
-        
+
         private Column GetColumnAt (int x)
         {
             if (column_cache == null) {
                 return null;
             }
-            
+
             x += HadjustmentValue;
-            
+
             foreach (CachedColumn column in column_cache) {
                 if (x >= column.X1 && x <= column.X2) {
                     return column.Column;
                 }
             }
-            
+
             return null;
         }
-        
+
         private CachedColumn GetCachedColumnForColumn (Column col)
         {
             foreach (CachedColumn ca_col in column_cache) {
@@ -435,10 +490,10 @@ namespace Hyena.Data.Gui
                     return ca_col;
                 }
             }
-            
+
             return CachedColumn.Zero;
         }
-                
+
         private ColumnController column_controller;
         public ColumnController ColumnController {
             get { return column_controller; }
@@ -450,17 +505,17 @@ namespace Hyena.Data.Gui
                 if (column_controller != null) {
                     column_controller.Updated -= OnColumnControllerUpdatedHandler;
                 }
-                
+
                 column_controller = value;
-                
+
                 OnColumnControllerUpdated ();
-                
+
                 if (column_controller != null) {
                     column_controller.Updated += OnColumnControllerUpdatedHandler;
                 }
             }
         }
-        
+
 #endregion
 
 #region Header
@@ -471,7 +526,7 @@ namespace Hyena.Data.Gui
                 if (!header_visible) {
                     return 0;
                 }
-                
+
                 if (header_height == 0) {
                     int w;
                     int h;
@@ -480,20 +535,20 @@ namespace Hyena.Data.Gui
                     header_height = h;
                     header_height += 10;
                 }
-                
+
                 return header_height;
             }
         }
-        
+
         private bool header_visible = true;
         public bool HeaderVisible {
             get { return header_visible; }
-            set { 
+            set {
                 header_visible = value;
                 MoveResize (Allocation);
             }
         }
-        
+
 #endregion
 
 #region Gtk.MenuItem Wrappers for the column context menu
@@ -503,64 +558,64 @@ namespace Hyena.Data.Gui
             private Column column;
             private bool ready = false;
             private Label label;
-            
+
             public ColumnToggleMenuItem (Column column) : base ()
             {
                 this.column = column;
-                Active = column.Visible; 
+                Active = column.Visible;
                 ready = true;
-                
+
                 label = new Label ();
                 label.Xalign = 0.0f;
                 label.Text = column.LongTitle ?? String.Empty;
                 label.Show ();
-                
+
                 Add (label);
             }
-                        
+
             protected override void OnStyleSet (Style previousStyle)
             {
                 base.OnStyleSet (previousStyle);
                 label.ModifyFg (StateType.Prelight, Style.Foreground (StateType.Selected));
             }
-            
+
             protected override void OnActivated ()
             {
                 base.OnActivated ();
-                
+
                 if (!ready) {
                     return;
                 }
-                
+
                 column.Visible = Active;
             }
         }
-        
+
         private class ColumnHideMenuItem : ImageMenuItem
         {
             private Column column;
             private Label label;
-            
+
             public ColumnHideMenuItem (Column column) : base ()
             {
                 this.column = column;
                 this.Image = new Image (Stock.Remove, IconSize.Menu);
-                
+
                 label = new Label ();
                 label.Xalign = 0.0f;
-                label.Markup = String.Format (Catalog.GetString ("Hide <i>{0}</i>"), 
+                label.Markup = String.Format (Catalog.GetString ("Hide <i>{0}</i>"),
                     GLib.Markup.EscapeText (column.LongTitle));
                 label.Show ();
-                
+
                 Add (label);
             }
-            
+
             protected override void OnStyleSet (Style previousStyle)
             {
                 base.OnStyleSet (previousStyle);
                 label.ModifyFg (StateType.Prelight, Style.Foreground (StateType.Selected));
             }
-            
+
             protected override void OnActivated ()
             {
                 column.Visible = false;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
index 1b44fee..02a05de 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
@@ -1,11 +1,13 @@
 //
 // ListView_Interaction.cs
 //
-// Author:
+// Authors:
 //   Aaron Bockover <abockover at novell.com>
 //   Gabriel Burt <gburt at novell.com>
+//   Eitan Isaacson <eitan at ascender.com>
 //
-// Copyright (C) 2007-2008 Novell, Inc.
+// Copyright (C) 2007-2009 Novell, Inc.
+// Copyright (C) 2009 Eitan Isaacson
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -37,16 +39,42 @@ namespace Hyena.Data.Gui
 {
     public partial class ListView<T> : ListViewBase
     {
+        private bool header_focused = false;
+        public bool HeaderFocused {
+            get { return header_focused; }
+            set {
+                header_focused = value;
+                InvalidateHeader ();
+                InvalidateList ();
+            }
+        }
+
+        #pragma warning disable 0067
+        public event EventHandler ActiveColumnChanged;
+        #pragma warning restore 0067
+
+        private int active_column = 0;
+        public int ActiveColumn {
+            get { return active_column; }
+            set {
+                active_column = value;
+                var handler = ActiveColumnChanged;
+                if (handler != null) {
+                    handler (this, EventArgs.Empty);
+                }
+            }
+        }
+
         private Adjustment vadjustment;
         public Adjustment Vadjustment {
             get { return vadjustment; }
         }
-        
+
         private Adjustment hadjustment;
         public Adjustment Hadjustment {
             get { return hadjustment; }
         }
-        
+
         private SelectionProxy selection_proxy = new SelectionProxy ();
         public SelectionProxy SelectionProxy {
             get { return selection_proxy; }
@@ -55,17 +83,17 @@ namespace Hyena.Data.Gui
         public Selection Selection {
             get { return model.Selection; }
         }
-        
+
         private int HadjustmentValue {
             get { return hadjustment == null ? 0 : (int)hadjustment.Value; }
         }
-        
+
         private int VadjustmentValue {
             get { return vadjustment == null ? 0 : (int)vadjustment.Value; }
         }
-        
+
         public event RowActivatedHandler<T> RowActivated;
-        
+
 #region Row/Selection, Keyboard/Mouse Interaction
 
         private bool KeyboardScroll (Gdk.ModifierType modifier, int relative_row, bool align_y)
@@ -73,13 +101,13 @@ namespace Hyena.Data.Gui
             if (Model == null) {
                 return true;
             }
-        
+
             int row_limit;
             if (relative_row < 0) {
                 if (Selection.FocusedIndex == -1) {
                     return false;
                 }
-                
+
                 row_limit = 0;
             } else {
                 row_limit = Model.Count - 1;
@@ -88,7 +116,7 @@ namespace Hyena.Data.Gui
             if (Selection.FocusedIndex == row_limit) {
                 return true;
             }
-            
+
             int row_index = Math.Min (Model.Count - 1, Math.Max (0, Selection.FocusedIndex + relative_row));
 
             if (Selection != null) {
@@ -111,7 +139,7 @@ namespace Hyena.Data.Gui
                     Selection.Select (row_index);
                 }
             }
-            
+
             // Scroll if needed
             double y_at_row = GetYAtRow (row_index);
             if (align_y) {
@@ -128,7 +156,7 @@ namespace Hyena.Data.Gui
             InvalidateList ();
             return true;
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey press)
         {
             bool handled = false;
@@ -152,62 +180,107 @@ namespace Hyena.Data.Gui
                 case Gdk.Key.K:
                 case Gdk.Key.Up:
                 case Gdk.Key.KP_Up:
-                    handled = KeyboardScroll (press.State, -1, true);
+                    if (!HeaderFocused)
+                        handled = KeyboardScroll (press.State, -1, true);
                     break;
 
                 case Gdk.Key.j:
                 case Gdk.Key.J:
                 case Gdk.Key.Down:
                 case Gdk.Key.KP_Down:
-                    handled = KeyboardScroll (press.State, 1, true);
+                    if (!HeaderFocused) {
+                        handled = KeyboardScroll (press.State, 1, true);
+                    } else if (HeaderFocused) {
+                        handled = true;
+                        HeaderFocused = false;
+                    }
+                    break;
+                case Gdk.Key.Right:
+                case Gdk.Key.KP_Right:
+                    if (ActiveColumn + 1 < column_cache.Length) {
+                        ActiveColumn++;
+                        InvalidateHeader ();
+                    }
+                    handled = true;
+                    break;
+                case Gdk.Key.Left:
+                case Gdk.Key.KP_Left:
+                    if (ActiveColumn - 1 >= 0) {
+                        ActiveColumn--;
+                        InvalidateHeader ();
+                    }
+                    handled = true;
                     break;
-
                 case Gdk.Key.Page_Up:
                 case Gdk.Key.KP_Page_Up:
-                    handled = vadjustment != null && KeyboardScroll (press.State, 
-                        (int)(-vadjustment.PageIncrement / (double)RowHeight), false);
+                    if (!HeaderFocused)
+                        handled = vadjustment != null && KeyboardScroll (press.State,
+                            (int)(-vadjustment.PageIncrement / (double)RowHeight), false);
                     break;
 
                 case Gdk.Key.Page_Down:
                 case Gdk.Key.KP_Page_Down:
-                    handled = vadjustment != null && KeyboardScroll (press.State, 
-                        (int)(vadjustment.PageIncrement / (double)RowHeight), false);
+                    if (!HeaderFocused)
+                        handled = vadjustment != null && KeyboardScroll (press.State,
+                            (int)(vadjustment.PageIncrement / (double)RowHeight), false);
                     break;
 
                 case Gdk.Key.Home:
                 case Gdk.Key.KP_Home:
-                    handled = KeyboardScroll (press.State, -10000000, false);
+                    if (!HeaderFocused)
+                        handled = KeyboardScroll (press.State, -10000000, false);
                     break;
 
                 case Gdk.Key.End:
                 case Gdk.Key.KP_End:
-                    handled = KeyboardScroll (press.State, 10000000, false);
+                    if (!HeaderFocused)
+                        handled = KeyboardScroll (press.State, 10000000, false);
                     break;
 
                 case Gdk.Key.Return:
                 case Gdk.Key.KP_Enter:
-                    handled = ActivateSelection ();
+                    if (!HeaderFocused) {
+                        handled = ActivateSelection ();
+                    } else if (HeaderFocused && ActiveColumn >= 0) {
+                        OnColumnLeftClicked (
+                            column_cache[ActiveColumn].Column);
+                        handled = true;
+                    }
                     break;
 
                 case Gdk.Key.Escape:
                     handled = CancelColumnDrag ();
                     break;
-                
+
                 case Gdk.Key.space:
-                    if (Selection != null && Selection.FocusedIndex != 1) {
+                    if (Selection != null && Selection.FocusedIndex != 1 &&
+                        !HeaderFocused) {
                         Selection.ToggleSelect (Selection.FocusedIndex);
                         handled = true;
                     }
                     break;
+
+                case Gdk.Key.F10:
+                    if ((press.State & Gdk.ModifierType.ShiftMask) != 0)
+                        goto case Gdk.Key.Menu;
+                    break;
+
+                case Gdk.Key.Menu:
+                    // OnPopupMenu() is reserved for list items in derived classes.
+                    if (HeaderFocused) {
+                        InvokeColumnHeaderMenu (ActiveColumn);
+                        handled = true;
+                    }
+                    break;
             }
 
             if (handled) {
                 return true;
             }
-            
+
             return base.OnKeyPressEvent (press);
         }
-        
+
         protected bool ActivateSelection ()
         {
             if (Selection != null && Selection.FocusedIndex != -1) {
@@ -218,32 +291,32 @@ namespace Hyena.Data.Gui
             }
             return false;
         }
-        
-#region Cell Event Proxy        
-        
+
+#region Cell Event Proxy
+
         private IInteractiveCell last_icell;
         private Gdk.Rectangle last_icell_area = Gdk.Rectangle.Zero;
-        
+
         private void ProxyEventToCell (Gdk.Event evnt, bool press)
         {
             IInteractiveCell icell;
             Gdk.Rectangle icell_area;
             bool redraw = ProxyEventToCell (evnt, press, out icell, out icell_area);
-            
+
             int xoffset = HadjustmentValue;
             int yoffset = VadjustmentValue;
-            
+
             if (last_icell_area != icell_area) {
                 if (last_icell != null && last_icell.PointerLeaveEvent ()) {
-                    QueueDrawArea (last_icell_area.X - xoffset, last_icell_area.Y - yoffset, 
+                    QueueDrawArea (last_icell_area.X - xoffset, last_icell_area.Y - yoffset,
                         last_icell_area.Width, last_icell_area.Height);
                 }
                 last_icell = icell;
                 last_icell_area = icell_area;
             }
-            
+
             if (redraw) {
-                QueueDrawArea (icell_area.X - xoffset, icell_area.Y - yoffset, 
+                QueueDrawArea (icell_area.X - xoffset, icell_area.Y - yoffset,
                     icell_area.Width, icell_area.Height);
             }
         }
@@ -256,10 +329,10 @@ namespace Hyena.Data.Gui
             int evnt_x, evnt_y;
             int x, y, row_index;
             x = y = row_index = 0;
-            
+
             Gdk.EventButton evnt_button = evnt as Gdk.EventButton;
             Gdk.EventMotion evnt_motion = evnt as Gdk.EventMotion;
-            
+
             if (evnt_motion != null) {
                 evnt_x = (int)evnt_motion.X;
                 evnt_y = (int)evnt_motion.Y;
@@ -318,45 +391,47 @@ namespace Hyena.Data.Gui
             if (row_index < 0 || row_index >= Model.Count) {
                 return false;
             }
-            
+
             column = GetColumnAt (x);
             if (column == null) {
                 return false;
             }
-            
+
             ColumnCell cell = column.GetCell (0);
             icell = cell as G;
             if (icell == null) {
                 return false;
             }
-            
+
             // Bind the row to the cell
             cell.BindListItem (model[row_index]);
             return true;
         }
 
         #pragma warning restore 0169
-        
+
 #endregion
-        
+
 #region OnButtonPress
 
         protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
         {
             HasFocus = true;
             if (header_visible && header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y)) {
+                HeaderFocused = true;
                 return OnHeaderButtonPressEvent (evnt);
             } else if (list_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && model != null) {
+                HeaderFocused = false;
                 return OnListButtonPressEvent (evnt);
             }
             return true;
         }
-        
+
         private bool OnHeaderButtonPressEvent (Gdk.EventButton evnt)
         {
             int x = (int)evnt.X - header_interaction_alloc.X;
             int y = (int)evnt.Y - header_interaction_alloc.Y;
-            
+
             if (evnt.Button == 3 && ColumnController.EnableColumnMenu) {
                 Column menu_column = GetColumnAt (x);
                 if (menu_column != null) {
@@ -366,7 +441,7 @@ namespace Hyena.Data.Gui
             } else if (evnt.Button != 1) {
                 return true;
             }
-            
+
             Gtk.Drag.SourceUnset (this);
 
             Column column = GetColumnForResizeHandle (x);
@@ -382,28 +457,29 @@ namespace Hyena.Data.Gui
                     pressed_column_x_start_hadjustment = HadjustmentValue;
                 }
             }
-            
+
             return true;
         }
-        
+
         private bool OnListButtonPressEvent (Gdk.EventButton evnt)
         {
             if (Model == null) {
                 return true;
             }
-            
+
             int y = (int)evnt.Y - list_interaction_alloc.Y;
-            
+
             GrabFocus ();
-            
+
             int row_index = GetRowAtY (y);
 
             if (row_index < 0 || row_index >= Model.Count) {
+                Gtk.Drag.SourceUnset (this);
                 return true;
             }
-            
+
             ProxyEventToCell (evnt, true);
-            
+
             object item = model[row_index];
             if (item == null) {
                 return true;
@@ -451,20 +527,20 @@ namespace Hyena.Data.Gui
                     OnPopupMenu ();
                 }
             }
-            
+
             InvalidateList ();
             return true;
         }
-        
+
 #endregion
 
 #region OnButtonRelease
-        
+
         protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt)
         {
             OnDragSourceSet ();
             StopDragScroll ();
-            
+
             if (resizing_column_index >= 0) {
                 pressed_column_index = -1;
                 resizing_column_index = -1;
@@ -477,7 +553,7 @@ namespace Hyena.Data.Gui
                 pressed_column_drag_started = false;
                 return true;
             }
-            
+
             if (header_visible && header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y)) {
                 return OnHeaderButtonRelease (evnt);
             } else if (list_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && model != null &&
@@ -493,49 +569,27 @@ namespace Hyena.Data.Gui
         {
             if (pressed_column_index >= 0 && pressed_column_index < column_cache.Length) {
                 Column column = column_cache[pressed_column_index].Column;
-                if (column != null && Model is ISortable && column is ISortableColumn) {
-                    ISortableColumn sort_column = column as ISortableColumn;
-                    ISortable sortable = Model as ISortable;
-
-                    // Change the sort-type with every click
-                    switch (sort_column.SortType) {
-                        case SortType.Ascending:    sort_column.SortType = SortType.Descending; break;
-                        case SortType.Descending:   sort_column.SortType = SortType.None; break;
-                        case SortType.None:         sort_column.SortType = SortType.Ascending; break;
-                    }
-
-                    // If we're switching to a different column or we aren't reorderable and the type is None, sort Ascending
-                    if (sort_column != ColumnController.SortColumn || (!IsEverReorderable && sort_column.SortType == SortType.None)) {
-                        sort_column.SortType = SortType.Ascending;
-                    }
+                ActiveColumn = pressed_column_index;
+                if (column != null)
+                    OnColumnLeftClicked (column);
 
-                    sortable.Sort (sort_column);
-                    ColumnController.SortColumn = sort_column;
-                    IsReorderable = sortable.SortColumn == null || sortable.SortColumn.SortType == SortType.None;
-
-                    Model.Reload ();
-                    RecalculateColumnSizes ();
-                    RegenerateColumnCache ();
-                    InvalidateHeader ();
-                }
-                
                 pressed_column_index = -1;
                 return true;
             } else {
                 return false;
             }
         }
-        
+
         private bool OnListButtonRelease (Gdk.EventButton evnt)
         {
             if (Model == null) {
                 return true;
             }
-        
+
             int y = (int)evnt.Y - list_interaction_alloc.Y;
-            
+
             GrabFocus ();
-            
+
             int row_index = GetRowAtY (y);
 
             if (row_index >= Model.Count) {
@@ -546,81 +600,81 @@ namespace Hyena.Data.Gui
             if (item == null) {
                 return true;
             }
-            
+
             //if (Selection != null && Selection.Contains (row_index) && Selection.Count > 1) {
             if (Selection != null && evnt.Button == 1 && Hyena.Gui.GtkUtilities.NoImportantModifiersAreSet ()) {
                 if (Selection.Count > 1) {
                     Selection.Clear (false);
                     Selection.Select (row_index);
                     FocusRow (row_index);
-                    InvalidateList ();    
+                    InvalidateList ();
                 }
             }
-            
+
             return true;
         }
-        
+
 #endregion
-        
+
         protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt)
         {
             int x = (int)evnt.X - header_interaction_alloc.X;
-            
-            if (pressed_column_index >= 0 && !pressed_column_is_dragging && 
+
+            if (pressed_column_index >= 0 && !pressed_column_is_dragging &&
                 Gtk.Drag.CheckThreshold (this, pressed_column_x_start, 0, x, 0)) {
                 pressed_column_is_dragging = true;
                 pressed_column_drag_started = true;
                 InvalidateHeader ();
                 InvalidateList ();
             }
-            
+
             pressed_column_x = x;
-            
+
             if (OnMotionNotifyEvent (x)) {
                 return true;
             }
 
-            GdkWindow.Cursor = header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && 
+            GdkWindow.Cursor = header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) &&
                 (resizing_column_index >= 0 || GetColumnForResizeHandle (x) != null)
-                ? resize_x_cursor 
+                ? resize_x_cursor
                 : null;
-            
+
             if (resizing_column_index >= 0) {
                 ResizeColumn (x);
             }
-            
+
             ProxyEventToCell (evnt, false);
-            
+
             return true;
         }
-        
+
         private bool OnMotionNotifyEvent (int x)
         {
             if (!pressed_column_is_dragging) {
                 return false;
             }
-            
+
             OnDragScroll (OnDragHScrollTimeout, header_interaction_alloc.Width * 0.1, header_interaction_alloc.Width, x);
-            
+
             GdkWindow.Cursor = drag_cursor;
-            
+
             Column swap_column = GetColumnAt (x);
-            
+
             if (swap_column != null) {
                 CachedColumn swap_column_c = GetCachedColumnForColumn (swap_column);
                 bool reorder = false;
-                
+
                 if (swap_column_c.Index < pressed_column_index) {
                     // Moving from right to left
                     reorder = pressed_column_x_drag <= swap_column_c.X1 + swap_column_c.Width / 2;
                 } else if (swap_column_c.Index > pressed_column_index) {
                     if (column_cache.Length > pressed_column_index && pressed_column_index >= 0) {
                         // Moving from left to right
-                        reorder = pressed_column_x_drag + column_cache[pressed_column_index].Width >= 
+                        reorder = pressed_column_x_drag + column_cache[pressed_column_index].Width >=
                             swap_column_c.X1 + swap_column_c.Width / 2;
                     }
                 }
-                
+
                 if (reorder) {
                     int actual_pressed_index = ColumnController.IndexOf (column_cache[pressed_column_index].Column);
                     int actual_swap_index = ColumnController.IndexOf (swap_column_c.Column);
@@ -629,20 +683,20 @@ namespace Hyena.Data.Gui
                     RegenerateColumnCache ();
                 }
             }
-            
+
             pressed_column_x_drag = x - pressed_column_x_offset - (pressed_column_x_start_hadjustment - HadjustmentValue);
-            
+
             QueueDraw ();
             return true;
         }
-        
+
         private bool OnDragHScrollTimeout ()
         {
             ScrollTo (hadjustment, HadjustmentValue + (drag_scroll_velocity * drag_scroll_velocity_max));
             OnMotionNotifyEvent (pressed_column_x);
             return true;
         }
-        
+
         protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt)
         {
             if (evnt.Mode == Gdk.CrossingMode.Normal) {
@@ -651,17 +705,31 @@ namespace Hyena.Data.Gui
             }
             return base.OnLeaveNotifyEvent (evnt);
         }
-        
-        protected override bool OnFocusInEvent (Gdk.EventFocus evnt)
-        {
-            return base.OnFocusInEvent (evnt);
-        }
-        
-        protected override bool OnFocusOutEvent (Gdk.EventFocus evnt)
+
+        protected override bool OnFocused (Gtk.DirectionType directionType)
         {
-            return base.OnFocusOutEvent (evnt);
+            if (!HeaderVisible)
+                return base.OnFocused (directionType);
+
+            if (HasFocus) {
+                if (directionType == DirectionType.TabForward && HeaderFocused)
+                    HeaderFocused = false;
+                else if (directionType == DirectionType.TabBackward && !HeaderFocused)
+                    HeaderFocused = true;
+                else
+                    return base.OnFocused (directionType);
+
+                return true;
+            } else {
+                if (directionType == DirectionType.TabForward )
+                    HeaderFocused = true;
+                else if (directionType == DirectionType.TabBackward)
+                    HeaderFocused = false;
+
+                return base.OnFocused (directionType);
+            }
         }
-        
+
         protected virtual void OnRowActivated ()
         {
             if (Selection.FocusedIndex != -1) {
@@ -683,17 +751,17 @@ namespace Hyena.Data.Gui
             }
             return false;
         }
-        
+
         protected int GetRowAtY (int y)
         {
             if (y < 0) {
                 return -1;
             }
-            
+
             int page_offset = VadjustmentValue % RowHeight;
             int first_row = VadjustmentValue / RowHeight;
             int row_offset = (y + page_offset) / RowHeight;
-            
+
             return first_row + row_offset;
         }
 
@@ -711,22 +779,22 @@ namespace Hyena.Data.Gui
 #endregion
 
 #region Adjustments & Scrolling
-        
+
         private void UpdateAdjustments ()
         {
             UpdateAdjustments (null, null);
         }
-        
+
         private void UpdateAdjustments (Adjustment hadj, Adjustment vadj)
         {
             if (hadj != null) {
                 hadjustment = hadj;
             }
-            
+
             if (vadj != null) {
                 vadjustment = vadj;
             }
-            
+
             if (hadjustment != null) {
                 hadjustment.Upper = header_width;
                 hadjustment.StepIncrement = 10.0;
@@ -734,7 +802,7 @@ namespace Hyena.Data.Gui
                     hadjustment.Value = hadjustment.Upper - hadjustment.PageSize;
                 }
             }
-            
+
             if (vadjustment != null && model != null) {
                 vadjustment.Upper = (RowHeight * (model.Count));
                 vadjustment.StepIncrement = RowHeight;
@@ -742,7 +810,7 @@ namespace Hyena.Data.Gui
                     vadjustment.Value = vadjustment.Upper - vadjustment.PageSize;
                 }
             }
-            
+
             if (hadjustment != null) {
                 hadjustment.Change ();
             }
@@ -751,23 +819,23 @@ namespace Hyena.Data.Gui
                 vadjustment.Change ();
             }
         }
-        
+
         private void OnHadjustmentChanged (object o, EventArgs args)
         {
             InvalidateHeader ();
             InvalidateList ();
         }
-        
+
         private void OnVadjustmentChanged (object o, EventArgs args)
         {
             InvalidateList ();
         }
-        
+
         public void ScrollTo (double val)
         {
             ScrollTo (vadjustment, val);
         }
-        
+
         private void ScrollTo (Adjustment adjustment, double val)
         {
             if (adjustment != null) {
@@ -814,14 +882,14 @@ namespace Hyena.Data.Gui
             if (hadj == null || vadj == null) {
                 return;
             }
-            
+
             hadj.ValueChanged += OnHadjustmentChanged;
             vadj.ValueChanged += OnVadjustmentChanged;
-            
+
             UpdateAdjustments (hadj, vadj);
         }
 
 #endregion
-        
+
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
index 891d557..8663161 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
@@ -35,6 +35,10 @@ namespace Hyena.Data.Gui
 {
     public partial class ListView<T> : ListViewBase
     {
+        #pragma warning disable 0067
+        public event EventHandler ModelChanged;
+        #pragma warning restore 0067
+
         public void SetModel (IListModel<T> model)
         {
             SetModel (model, 0.0);
@@ -50,7 +54,7 @@ namespace Hyena.Data.Gui
                 model.Cleared -= OnModelClearedHandler;
                 model.Reloaded -= OnModelReloadedHandler;
             }
-            
+
             model = value;
 
             if (model != null) {
@@ -71,10 +75,16 @@ namespace Hyena.Data.Gui
                     IsReorderable = sortable.SortColumn == null || sortable.SortColumn.SortType == SortType.None;
                 }
             }
-            
+
             RefreshViewForModel (vpos);
+
+            var handler = ModelChanged;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
         }
 
+
         private void RefreshViewForModel (double? vpos)
         {
             if (Model == null) {
@@ -91,11 +101,11 @@ namespace Hyena.Data.Gui
             } else if (vadjustment != null) {
                 ScrollTo (vadjustment.Value);
             }
-            
+
             if (Model != null && Selection != null) {
                 Selection.MaxIndex = Model.Count - 1;
             }
-            
+
             if (Parent is ScrolledWindow) {
                 Parent.QueueDraw ();
             }
@@ -105,7 +115,7 @@ namespace Hyena.Data.Gui
         {
             OnModelCleared ();
         }
-        
+
         private void OnModelReloadedHandler (object o, EventArgs args)
         {
             OnModelReloaded ();
@@ -120,12 +130,12 @@ namespace Hyena.Data.Gui
         {
             RefreshViewForModel (null);
         }
-        
+
         protected virtual void OnModelReloaded ()
         {
             RefreshViewForModel (null);
         }
-        
+
         private IListModel<T> model;
         public virtual IListModel<T> Model {
             get { return model; }
@@ -167,32 +177,32 @@ namespace Hyena.Data.Gui
 
             return (bool)row_opaque_property_info.GetValue (item, null);
         }
-        
+
         private string row_bold_property_name = "IsBold";
         private PropertyInfo row_bold_property_info;
         bool row_bold_property_invalid = false;
-        
+
         public string RowBoldPropertyName {
             get { return row_bold_property_name; }
-            set { 
+            set {
                 if (value == row_bold_property_name) {
                     return;
                 }
-                
+
                 row_bold_property_name = value;
                 row_bold_property_info = null;
                 row_bold_property_invalid = false;
-                
+
                 InvalidateList ();
             }
         }
-        
+
         private bool IsRowBold (object item)
         {
             if (item == null || row_bold_property_invalid) {
                 return false;
             }
-         
+
             if (row_bold_property_info == null || row_bold_property_info.ReflectedType != item.GetType ()) {
                 row_bold_property_info = item.GetType ().GetProperty (row_bold_property_name);
                 if (row_bold_property_info == null || row_bold_property_info.PropertyType != typeof (bool)) {
@@ -201,7 +211,7 @@ namespace Hyena.Data.Gui
                     return false;
                 }
             }
-            
+
             return (bool)row_bold_property_info.GetValue (item, null);
         }
     }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
index d4c424e..075e9a9 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
@@ -45,33 +45,33 @@ namespace Hyena.Data.Gui
         private Cairo.Context cairo_context;
         private CellContext cell_context;
         private Pango.Layout pango_layout;
-        
+
         private List<int> selected_rows = new List<int> ();
-        
+
         private Theme theme;
         protected Theme Theme {
             get { return theme; }
         }
-        
+
         private bool changing_style = false;
-        
+
         protected override void OnStyleSet (Style old_style)
         {
             if (changing_style) {
                 return;
             }
-            
+
             changing_style = true;
             GtkUtilities.AdaptGtkRcStyle (this, typeof (TreeView));
             changing_style = false;
-            
+
             base.OnStyleSet (old_style);
             RecomputeRowHeight = true;
             theme = Hyena.Gui.Theming.ThemeEngine.CreateTheme (this);
 
             // Save the drawable so we can reuse it
             Gdk.Drawable drawable = cell_context != null ? cell_context.Drawable : null;
-            
+
             if (pango_layout != null) {
                 pango_layout.Dispose ();
                 pango_layout = null;
@@ -82,40 +82,44 @@ namespace Hyena.Data.Gui
             cell_context.Widget = this;
             cell_context.Drawable = drawable;
         }
-         
+
         protected override bool OnExposeEvent (EventExpose evnt)
         {
             Rectangle damage = new Rectangle ();
             foreach (Rectangle rect in evnt.Region.GetRectangles ()) {
                 damage = damage.Union (rect);
             }
-            
+
             cairo_context = CairoHelper.Create (evnt.Window);
             if (pango_layout == null) {
                 pango_layout = CairoExtensions.CreateLayout (this, cairo_context);
             }
-            
+
             cell_context.Context = cairo_context;
             cell_context.Layout = pango_layout;
-            
+
             Theme.DrawFrameBackground (cairo_context, Allocation, true);
             if (header_visible && column_controller != null) {
                 PaintHeader (damage);
             }
-           
-            Theme.DrawFrameBorder (cairo_context, Allocation);
+
+            if (HasFocus)
+                Theme.DrawFrameBorderFocused (cairo_context, Allocation);
+            else
+                Theme.DrawFrameBorder (cairo_context, Allocation);
+
             if (Model != null) {
-                PaintRows(damage);
+                PaintRows (damage);
             }
-            
+
             PaintDraggingColumn (damage);
-            
+
             ((IDisposable)cairo_context.Target).Dispose ();
             ((IDisposable)cairo_context).Dispose ();
-            
+
             return true;
         }
-        
+
         private void PaintHeader (Rectangle clip)
         {
             Rectangle rect = header_rendering_alloc;
@@ -123,13 +127,13 @@ namespace Hyena.Data.Gui
             clip.Intersect (rect);
             cairo_context.Rectangle (clip.X, clip.Y, clip.Width, clip.Height);
             cairo_context.Clip ();
-            
+
             Theme.DrawHeaderBackground (cairo_context, header_rendering_alloc);
-            
+
             Rectangle cell_area = new Rectangle ();
             cell_area.Y = header_rendering_alloc.Y;
             cell_area.Height = header_rendering_alloc.Height;
-            
+
             cell_context.Clip = clip;
             cell_context.Opaque = true;
             cell_context.TextAsForeground = true;
@@ -140,34 +144,38 @@ namespace Hyena.Data.Gui
                 if (pressed_column_is_dragging && pressed_column_index == ci) {
                     continue;
                 }
-                
+
                 cell_area.X = column_cache[ci].X1 + Theme.TotalBorderWidth + header_rendering_alloc.X - HadjustmentValue;
                 cell_area.Width = column_cache[ci].Width;
                 PaintHeaderCell (cell_area, ci, false, ref have_drawn_separator);
             }
-            
+
             if (pressed_column_is_dragging && pressed_column_index >= 0) {
                 cell_area.X = pressed_column_x_drag + Allocation.X - HadjustmentValue;
                 cell_area.Width = column_cache[pressed_column_index].Width;
                 PaintHeaderCell (cell_area, pressed_column_index, true, ref have_drawn_separator);
             }
-            
+
             cairo_context.ResetClip ();
         }
-        
+
         private void PaintHeaderCell (Rectangle area, int ci, bool dragging, ref bool have_drawn_separator)
         {
             if (ci < 0 || column_cache.Length <= ci)
                 return;
 
+            if (ci == ActiveColumn && HasFocus && HeaderFocused) {
+                Theme.DrawColumnHeaderFocus (cairo_context, area);
+            }
+
             if (dragging) {
-                Theme.DrawColumnHighlight (cairo_context, area, 
+                Theme.DrawColumnHighlight (cairo_context, area,
                     CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (GtkColorClass.Dark, StateType.Normal), 0.9));
-                    
+
                 Cairo.Color stroke_color = CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (
                     GtkColorClass.Base, StateType.Normal), 0.0);
                 stroke_color.A = 0.3;
-                
+
                 cairo_context.Color = stroke_color;
                 cairo_context.MoveTo (area.X + 0.5, area.Y + 1.0);
                 cairo_context.LineTo (area.X + 0.5, area.Bottom);
@@ -177,7 +185,7 @@ namespace Hyena.Data.Gui
             }
 
             ColumnCell cell = column_cache[ci].Column.HeaderCell;
-            
+
             if (cell != null) {
                 cairo_context.Save ();
                 cairo_context.Translate (area.X, area.Y);
@@ -185,14 +193,14 @@ namespace Hyena.Data.Gui
                 cell.Render (cell_context, StateType.Normal, area.Width, area.Height);
                 cairo_context.Restore ();
             }
-            
-            if (!dragging && ci < column_cache.Length - 1 && (have_drawn_separator || 
+
+            if (!dragging && ci < column_cache.Length - 1 && (have_drawn_separator ||
                 column_cache[ci].MaxWidth != column_cache[ci].MinWidth)) {
                 have_drawn_separator = true;
                 Theme.DrawHeaderSeparator (cairo_context, area, area.Right);
             }
         }
-        
+
         private void PaintRows (Rectangle clip)
         {
             // TODO factor this out?
@@ -204,27 +212,27 @@ namespace Hyena.Data.Gui
                     header_rendering_alloc.Bottom + Theme.BorderWidth,
                     col.Width, list_rendering_alloc.Height + Theme.InnerBorderWidth * 2);
             }
-            
+
             clip.Intersect (list_rendering_alloc);
             cairo_context.Rectangle (clip.X, clip.Y, clip.Width, clip.Height);
             cairo_context.Clip ();
-            
+
             cell_context.Clip = clip;
             cell_context.TextAsForeground = false;
-            
+
             int vadjustment_value = VadjustmentValue;
             int first_row = vadjustment_value / RowHeight;
             int last_row = Math.Min (model.Count, first_row + RowsInView);
             int offset = list_rendering_alloc.Y - vadjustment_value % RowHeight;
-            
+
             Rectangle selected_focus_alloc = Rectangle.Zero;
             Rectangle single_list_alloc = new Rectangle ();
-            
+
             single_list_alloc.X = list_rendering_alloc.X - HadjustmentValue;
             single_list_alloc.Y = offset;
             single_list_alloc.Width = list_rendering_alloc.Width + HadjustmentValue;
             single_list_alloc.Height = RowHeight;
-            
+
             int selection_height = 0;
             int selection_y = 0;
             selected_rows.Clear ();
@@ -234,71 +242,78 @@ namespace Hyena.Data.Gui
                     if (selection_height == 0) {
                         selection_y = single_list_alloc.Y;
                     }
-                    
+
                     selection_height += single_list_alloc.Height;
                     selected_rows.Add (ri);
-                    
+
                     if (Selection.FocusedIndex == ri) {
                         selected_focus_alloc = single_list_alloc;
                     }
                 } else {
                     if (rules_hint && ri % 2 != 0) {
-                        Theme.DrawRowRule (cairo_context, single_list_alloc.X, single_list_alloc.Y, 
+                        Theme.DrawRowRule (cairo_context, single_list_alloc.X, single_list_alloc.Y,
                             single_list_alloc.Width, single_list_alloc.Height);
                     }
-                    
+
                     PaintReorderLine (ri, single_list_alloc);
-                    
+
                     if (Selection != null && Selection.FocusedIndex == ri && !Selection.Contains (ri) && HasFocus) {
                         CairoCorners corners = CairoCorners.All;
-                        
+
                         if (Selection.Contains (ri - 1)) {
                             corners &= ~(CairoCorners.TopLeft | CairoCorners.TopRight);
                         }
-                        
+
                         if (Selection.Contains (ri + 1)) {
                             corners &= ~(CairoCorners.BottomLeft | CairoCorners.BottomRight);
                         }
-                        
-                        Theme.DrawRowSelection (cairo_context, single_list_alloc.X, single_list_alloc.Y, 
-                            single_list_alloc.Width, single_list_alloc.Height, false, true, 
-                            Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), corners);
+
+                        if (HasFocus && !HeaderFocused) // Cursor out of selection.
+                            Theme.DrawRowCursor (cairo_context, single_list_alloc.X, single_list_alloc.Y,
+                                                 single_list_alloc.Width, single_list_alloc.Height,
+                                                 CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), 0.85));
                     }
-                    
+
                     if (selection_height > 0) {
-                        Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height);
+                        Cairo.Color selection_color = Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected);
+                        if (!HasFocus || HeaderFocused)
+                            selection_color = CairoExtensions.ColorShade (selection_color, 1.1);
+
+                        Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height,
+                                                true, true, selection_color, CairoCorners.All);
                         selection_height = 0;
                     }
-                    
+
                     PaintRow (ri, single_list_alloc, StateType.Normal);
                 }
-                
+
                 single_list_alloc.Y += single_list_alloc.Height;
             }
-            
+
             // In case the user is dragging to the end of the list
             PaintReorderLine (last_row, single_list_alloc);
-            
+
             if (selection_height > 0) {
-                Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y, 
+                Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y,
                     list_rendering_alloc.Width, selection_height);
             }
-            
-            if (Selection != null && Selection.Count > 1 && 
-                !selected_focus_alloc.Equals (Rectangle.Zero) && HasFocus) {
-                Theme.DrawRowSelection (cairo_context, selected_focus_alloc.X, selected_focus_alloc.Y, 
-                    selected_focus_alloc.Width, selected_focus_alloc.Height, false, true, 
-                    Theme.Colors.GetWidgetColor (GtkColorClass.Dark, StateType.Selected));
+
+            if (Selection != null && Selection.Count > 1 &&
+                !selected_focus_alloc.Equals (Rectangle.Zero) &&
+                HasFocus && !HeaderFocused) { // Cursor inside selection.
+                Theme.DrawRowCursor (cairo_context, selected_focus_alloc.X, selected_focus_alloc.Y,
+                    selected_focus_alloc.Width, selected_focus_alloc.Height,
+                    Theme.Colors.GetWidgetColor (GtkColorClass.Text, StateType.Selected));
             }
-            
+
             foreach (int ri in selected_rows) {
                 single_list_alloc.Y = offset + ((ri - first_row) * single_list_alloc.Height);
                 PaintRow (ri, single_list_alloc, StateType.Selected);
             }
-            
+
             cairo_context.ResetClip ();
         }
-        
+
         private void PaintReorderLine (int row_index, Rectangle single_list_alloc)
         {
             if (row_index == drag_reorder_row_index && IsReorderable) {
@@ -318,25 +333,25 @@ namespace Hyena.Data.Gui
             if (column_cache == null) {
                 return;
             }
-            
+
             object item = model[row_index];
             bool opaque = IsRowOpaque (item);
             bool bold = IsRowBold (item);
-            
+
             Rectangle cell_area = new Rectangle ();
             cell_area.Height = RowHeight;
             cell_area.Y = area.Y;
-            
+
             for (int ci = 0; ci < column_cache.Length; ci++) {
                 if (pressed_column_is_dragging && pressed_column_index == ci) {
                     continue;
                 }
-                
+
                 cell_area.Width = column_cache[ci].Width;
                 cell_area.X = column_cache[ci].X1 + area.X;
                 PaintCell (item, ci, row_index, cell_area, opaque, bold, state, false);
             }
-            
+
             if (pressed_column_is_dragging && pressed_column_index >= 0) {
                 cell_area.Width = column_cache[pressed_column_index].Width;
                 cell_area.X = pressed_column_x_drag + list_rendering_alloc.X -
@@ -344,19 +359,19 @@ namespace Hyena.Data.Gui
                 PaintCell (item, pressed_column_index, row_index, cell_area, opaque, bold, state, true);
             }
         }
-        
+
         private void PaintCell (object item, int column_index, int row_index, Rectangle area, bool opaque, bool bold,
             StateType state, bool dragging)
         {
             ColumnCell cell = column_cache[column_index].Column.GetCell (0);
             cell.BindListItem (item);
             ColumnCellDataProvider (cell, item);
-            
+
             ITextCell text_cell = cell as ITextCell;
             if (text_cell != null) {
                 text_cell.FontWeight = bold ? Pango.Weight.Bold : Pango.Weight.Normal;
             }
-            
+
             if (dragging) {
                 Cairo.Color fill_color = Theme.Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal);
                 fill_color.A = 0.5;
@@ -364,74 +379,76 @@ namespace Hyena.Data.Gui
                 cairo_context.Rectangle (area.X, area.Y, area.Width, area.Height);
                 cairo_context.Fill ();
             }
-            
+
             cairo_context.Save ();
             cairo_context.Translate (area.X, area.Y);
             cell_context.Area = area;
             cell_context.Opaque = opaque;
             cell.Render (cell_context, dragging ? StateType.Normal : state, area.Width, area.Height);
             cairo_context.Restore ();
+
+            AccessibleCellRedrawn (column_index, row_index);
         }
-        
+
         private void PaintDraggingColumn (Rectangle clip)
         {
             if (!pressed_column_is_dragging || pressed_column_index < 0) {
                 return;
             }
-            
+
             CachedColumn column = column_cache[pressed_column_index];
-            
+
             int x = pressed_column_x_drag + Allocation.X + 1 - HadjustmentValue;
-            
+
             Cairo.Color fill_color = Theme.Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal);
             fill_color.A = 0.45;
-            
+
             Cairo.Color stroke_color = CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (
                 GtkColorClass.Base, StateType.Normal), 0.0);
             stroke_color.A = 0.3;
-            
+
             cairo_context.Rectangle (x, header_rendering_alloc.Bottom + 1, column.Width - 2,
                 list_rendering_alloc.Bottom - header_rendering_alloc.Bottom - 1);
             cairo_context.Color = fill_color;
             cairo_context.Fill ();
-            
+
             cairo_context.MoveTo (x - 0.5, header_rendering_alloc.Bottom + 0.5);
             cairo_context.LineTo (x - 0.5, list_rendering_alloc.Bottom + 0.5);
             cairo_context.LineTo (x + column.Width - 1.5, list_rendering_alloc.Bottom + 0.5);
             cairo_context.LineTo (x + column.Width - 1.5, header_rendering_alloc.Bottom + 0.5);
-            
+
             cairo_context.Color = stroke_color;
             cairo_context.LineWidth = 1.0;
             cairo_context.Stroke ();
         }
-        
+
         private void InvalidateList ()
         {
             if (IsRealized) {
                 QueueDrawArea (list_rendering_alloc.X, list_rendering_alloc.Y, list_rendering_alloc.Width, list_rendering_alloc.Height);
             }
         }
-        
+
         private void InvalidateHeader ()
         {
             if (IsRealized) {
                 QueueDrawArea (header_rendering_alloc.X, header_rendering_alloc.Y, header_rendering_alloc.Width, header_rendering_alloc.Height);
             }
         }
-        
+
         protected virtual void ColumnCellDataProvider (ColumnCell cell, object boundItem)
         {
         }
-        
+
         private bool rules_hint = false;
         public bool RulesHint {
             get { return rules_hint; }
-            set { 
-                rules_hint = value; 
+            set {
+                rules_hint = value;
                 InvalidateList ();
             }
         }
-        
+
         private ListViewRowHeightHandler row_height_handler;
         public virtual ListViewRowHeightHandler RowHeightProvider {
             get { return row_height_handler; }
@@ -442,32 +459,32 @@ namespace Hyena.Data.Gui
                 }
             }
         }
-        
+
         private bool recompute_row_height = true;
         protected bool RecomputeRowHeight {
             get { return recompute_row_height; }
-            set { 
+            set {
                 recompute_row_height = value;
                 if (value && IsMapped && IsRealized) {
                     QueueDraw ();
                 }
             }
         }
-        
+
         private int row_height = 32;
-        protected int RowHeight {
+        public int RowHeight {
             get {
                 if (RecomputeRowHeight) {
-                    row_height = RowHeightProvider != null 
-                        ? RowHeightProvider (this) 
+                    row_height = RowHeightProvider != null
+                        ? RowHeightProvider (this)
                         : ColumnCellText.ComputeRowHeight (this);
-                    
+
                     header_height = 0;
                     MoveResize (Allocation);
-                    
+
                     RecomputeRowHeight = false;
                 }
-                
+
                 return row_height;
             }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
index c9b3c0b..99ca456 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
@@ -40,20 +40,20 @@ namespace Hyena.Data.Gui
         private Rectangle header_rendering_alloc;
         private Rectangle list_interaction_alloc;
         private Rectangle header_interaction_alloc;
-        
+
         private Gdk.Window event_window;
-        
+
         protected Rectangle ListAllocation {
             get { return list_rendering_alloc; }
         }
-        
+
         protected override void OnRealized ()
         {
             WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow;
-            
+
             GdkWindow = Parent.GdkWindow;
             cell_context.Drawable = GdkWindow;
-            
+
             WindowAttr attributes = new WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
             attributes.X = Allocation.X;
@@ -69,74 +69,74 @@ namespace Hyena.Data.Gui
                 EventMask.ButtonReleaseMask |
                 EventMask.LeaveNotifyMask |
                 EventMask.ExposureMask);
-            
+
             WindowAttributesType attributes_mask =
                 WindowAttributesType.X | WindowAttributesType.Y | WindowAttributesType.Wmclass;
-            
+
             event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask);
             event_window.UserData = Handle;
-            
+
             OnDragSourceSet ();
             MoveResize (Allocation);
-            
+
             base.OnRealized ();
         }
-        
+
         protected override void OnUnrealized ()
         {
             WidgetFlags &= ~WidgetFlags.Realized;
-            
+
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
             event_window = null;
-            
+
             base.OnUnrealized ();
         }
-        
+
         protected override void OnMapped ()
         {
             WidgetFlags |= WidgetFlags.Mapped;
             event_window.Show ();
         }
-        
+
         protected override void OnUnmapped ()
         {
             WidgetFlags &= ~WidgetFlags.Mapped;
             event_window.Hide ();
         }
-        
+
         protected int TranslateToListY (int y)
         {
             return y - list_interaction_alloc.Y;
         }
-        
+
         private void MoveResize (Rectangle allocation)
         {
             if (Theme == null) {
                 return;
             }
-            
+
             header_rendering_alloc = allocation;
             header_rendering_alloc.Height = HeaderHeight;
-            
+
             list_rendering_alloc.X = header_rendering_alloc.X + Theme.TotalBorderWidth;
             list_rendering_alloc.Y = header_rendering_alloc.Bottom + Theme.TotalBorderWidth;
             list_rendering_alloc.Width = allocation.Width - Theme.TotalBorderWidth * 2;
             list_rendering_alloc.Height = allocation.Height - (list_rendering_alloc.Y - allocation.Y) -
                 Theme.TotalBorderWidth;
-            
+
             header_interaction_alloc = header_rendering_alloc;
             header_interaction_alloc.X = list_rendering_alloc.X;
             header_interaction_alloc.Width = list_rendering_alloc.Width;
             header_interaction_alloc.Height += Theme.BorderWidth;
             header_interaction_alloc.Offset (-allocation.X, -allocation.Y);
-            
+
             list_interaction_alloc = list_rendering_alloc;
             list_interaction_alloc.Offset (-allocation.X, -allocation.Y);
-            
+
             header_width = header_interaction_alloc.Width;
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             // TODO give the minimum height of the header
@@ -146,19 +146,19 @@ namespace Hyena.Data.Gui
             requisition.Width = Theme.TotalBorderWidth * 2;
             requisition.Height = HeaderHeight + Theme.TotalBorderWidth * 2;
         }
-        
+
         protected override void OnSizeAllocated (Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             if (IsRealized) {
                 event_window.MoveResize (allocation);
             }
-            
+
             MoveResize (allocation);
             RecalculateColumnSizes ();
             RegenerateColumnCache ();
-           
+
             if (vadjustment != null) {
                 hadjustment.PageSize = header_interaction_alloc.Width;
                 hadjustment.PageIncrement = header_interaction_alloc.Width;
@@ -166,15 +166,15 @@ namespace Hyena.Data.Gui
                 vadjustment.PageIncrement = list_rendering_alloc.Height;
                 UpdateAdjustments ();
             }
-            
+
             ICareAboutView model = Model as ICareAboutView;
             if (model != null) {
                 model.RowsInView = RowsInView;
             }
-            
+
             InvalidateList ();
         }
-        
+
         protected int RowsInView {
             get { return (int) Math.Ceiling ((list_rendering_alloc.Height + RowHeight) / (double) RowHeight); }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListViewTestModule.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListViewTestModule.cs
index f31047b..148fc13 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListViewTestModule.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListViewTestModule.cs
@@ -43,26 +43,26 @@ namespace Hyena.Data.Gui
     {
         private View view;
         private Model model;
-        
+
         public ListViewTestModule () : base ("ListView")
         {
             WindowPosition = WindowPosition.Center;
             SetDefaultSize (800, 600);
-            
+
             ScrolledWindow scroll = new ScrolledWindow ();
             scroll.HscrollbarPolicy = PolicyType.Automatic;
             scroll.VscrollbarPolicy = PolicyType.Automatic;
-            
+
             view = new View ();
             model = new Model ();
-            
+
             scroll.Add (view);
             Add (scroll);
             ShowAll ();
-            
+
             view.SetModel (model);
         }
-        
+
         private class View : ListView<ModelItem>
         {
             public View ()
@@ -79,15 +79,15 @@ namespace Hyena.Data.Gui
                 );
             }
         }
-        
+
         private class Model : IListModel<ModelItem>
         {
             private List<ModelItem> store = new List<ModelItem> ();
             private Selection selection = new Selection ();
-            
+
             public event EventHandler Cleared;
             public event EventHandler Reloaded;
-            
+
             public Model ()
             {
                 Random random = new Random (0);
@@ -95,15 +95,15 @@ namespace Hyena.Data.Gui
                     store.Add (new ModelItem (i, random));
                 }
             }
-            
+
             public void Clear ()
             {
             }
-            
+
             public void Reload ()
             {
             }
-            
+
             public int Count {
                 get { return store.Count; }
             }
@@ -111,17 +111,17 @@ namespace Hyena.Data.Gui
             public bool CanReorder {
                 get { return false; }
             }
-            
+
             public ModelItem this[int index] {
                 get { return store[index]; }
             }
-            
+
             public Selection Selection {
                 get { return selection; }
             }
         }
-        
-        private class ModelItem 
+
+        private class ModelItem
         {
             public ModelItem (int i, Random rand)
             {
@@ -133,7 +133,7 @@ namespace Hyena.Data.Gui
                 f = rand.Next (0, 1) == 1;
                 g = rand.Next (0, 5);
             }
-        
+
             string a; public string A { get { return a; } }
             int b;    public int    B { get { return b; } }
             double c; public double C { get { return c; } }
@@ -142,16 +142,16 @@ namespace Hyena.Data.Gui
             bool f; public bool F { get { return f; } set { f = value; } }
             int g; public int G { get { return g; } set { g = value; } }
         }
-        
+
         private class ColumnCellDoodle : ColumnCell, IInteractiveCell
         {
             private Random random = new Random ();
             private bool red = false;
-            
+
             public ColumnCellDoodle (string property, bool expand) : base (property, expand)
             {
             }
-            
+
             public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
             {
                 red = !red;
@@ -159,7 +159,7 @@ namespace Hyena.Data.Gui
                 cr.Rectangle (0, 0, cellWidth, cellHeight);
                 cr.Color = CairoExtensions.RgbaToColor (red ? 0xff000099 : 0x00000099);
                 cr.Fill ();
-                
+
                 List<Gdk.Point> points = Points;
                 for (int i = 0, n = points.Count; i < n; i++) {
                     if (i == 0) {
@@ -168,42 +168,42 @@ namespace Hyena.Data.Gui
                         cr.LineTo (points[i].X, points[i].Y);
                     }
                 }
-                
+
                 cr.Color = CairoExtensions.RgbToColor ((uint)random.Next (0xffffff));
                 cr.LineWidth = 1;
                 cr.Stroke ();
             }
-            
+
             private object last_pressed_bound;
-            
+
             public bool ButtonEvent (int x, int y, bool pressed, Gdk.EventButton evnt)
             {
                 if (!pressed) {
                     last_pressed_bound = null;
                     return false;
                 }
-                
+
                 last_pressed_bound = BoundObject;
                 Points.Add (new Gdk.Point (x, y));
                 return true;
             }
-            
+
             public bool MotionEvent (int x, int y, Gdk.EventMotion evnt)
             {
                 if (last_pressed_bound == BoundObject) {
                     Points.Add (new Gdk.Point (x, y));
                     return true;
                 }
-                
+
                 return false;
             }
-            
+
             public bool PointerLeaveEvent ()
             {
                 last_pressed_bound = null;
                 return true;
             }
-            
+
             private List<Gdk.Point> Points {
                 get { return (List<Gdk.Point>)BoundObject; }
             }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ObjectListView.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ObjectListView.cs
index a17040e..b2525b4 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ObjectListView.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ObjectListView.cs
@@ -31,12 +31,12 @@ using System;
 namespace Hyena.Data.Gui
 {
     public class ObjectListView : ListView<object>
-    {   
+    {
         public ObjectListView () : base ()
         {
             ColumnController = new ColumnController();
         }
-        
+
         protected override void OnModelReloaded ()
         {
             ColumnController.Clear ();
@@ -44,7 +44,7 @@ namespace Hyena.Data.Gui
                 ColumnController.Add (new Column (column_description));
             }
         }
-        
+
         public new IObjectListModel Model {
             get { return (IObjectListModel)base.Model; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/RowActivatedHandler.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/RowActivatedHandler.cs
index 6d5f4c4..66dd52d 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/RowActivatedHandler.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/RowActivatedHandler.cs
@@ -31,12 +31,12 @@ using System;
 namespace Hyena.Data.Gui
 {
     public delegate void RowActivatedHandler<T> (object o, RowActivatedArgs<T> args);
-    
+
     public class RowActivatedArgs<T> : EventArgs
     {
         private int row;
         private T row_value;
-        
+
         public RowActivatedArgs (int row, T rowValue)
         {
             this.row = row;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/SortableColumn.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/SortableColumn.cs
index 86d7723..ebd2a45 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/SortableColumn.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/SortableColumn.cs
@@ -38,24 +38,24 @@ namespace Hyena.Data.Gui
         private string sort_key;
         private SortType sort_type = SortType.Ascending;
         private Hyena.Query.QueryField field;
-        
-        public SortableColumn(string title, ColumnCell cell, double width, string sort_key, bool visible) : 
+
+        public SortableColumn(string title, ColumnCell cell, double width, string sort_key, bool visible) :
             base(title, cell, width, visible)
         {
             this.sort_key = sort_key;
         }
-        
+
         public SortableColumn(ColumnCell header_cell, string title, ColumnCell cell, double width, string sort_key, bool visible) :
             base(header_cell, title, cell, width, visible)
         {
             this.sort_key = sort_key;
         }
-        
+
         public string SortKey {
             get { return sort_key; }
             set { sort_key = value; }
         }
-        
+
         public SortType SortType {
             get { return sort_type; }
             set { sort_type = value; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs
index 1ed8114..b185cea 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs
@@ -41,26 +41,26 @@ namespace Hyena.Gui.Dialogs
     {
         private AccelGroup accel_group;
         private string debugInfo;
-        
+
         public ExceptionDialog(Exception e) : base()
         {
             debugInfo = BuildExceptionMessage(e);
-           
+
             HasSeparator = false;
             BorderWidth = 5;
             Resizable = false;
             Title = Catalog.GetString("Banshee Encountered a Fatal Error");
-            
+
             VBox.Spacing = 12;
             ActionArea.Layout = ButtonBoxStyle.End;
 
             accel_group = new AccelGroup();
 		    AddAccelGroup(accel_group);
-        
+
             HBox hbox = new HBox(false, 12);
             hbox.BorderWidth = 5;
             VBox.PackStart(hbox, false, false, 0);
-        
+
             Image image = new Image(Stock.DialogError, IconSize.Dialog);
             image.Yalign = 0.0f;
             hbox.PackStart(image, true, true, 0);
@@ -77,7 +77,7 @@ namespace Hyena.Gui.Dialogs
             label_vbox.PackStart(label, false, false, 0);
 
             label = new Label(e.Message);
-                
+
             label.UseMarkup = true;
             label.UseUnderline = false;
             label.Justify = Gtk.Justification.Left;
@@ -86,7 +86,7 @@ namespace Hyena.Gui.Dialogs
             label.SetAlignment(0.0f, 0.5f);
             label_vbox.PackStart(label, false, false, 0);
 
-            Label details_label = new Label(String.Format("<b>{0}</b>", 
+            Label details_label = new Label(String.Format("<b>{0}</b>",
                 GLib.Markup.EscapeText(Catalog.GetString("Error Details"))));
             details_label.UseMarkup = true;
             Expander details_expander = new Expander("Details");
@@ -95,11 +95,11 @@ namespace Hyena.Gui.Dialogs
 
             ScrolledWindow scroll = new ScrolledWindow();
             TextView view = new TextView();
-            
+
             scroll.HscrollbarPolicy = PolicyType.Automatic;
             scroll.VscrollbarPolicy = PolicyType.Automatic;
             scroll.AddWithViewport(view);
-            
+
             scroll.SetSizeRequest(450, 250);
 			
 			view.Editable = false;
@@ -122,34 +122,34 @@ namespace Hyena.Gui.Dialogs
 
             if(is_default) {
                 DefaultResponse = response;
-                button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return, 
+                button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return,
                     0, AccelFlags.Visible);
             }
         }
-        
+
         private string BuildExceptionMessage(Exception e)
         {
             System.Text.StringBuilder msg = new System.Text.StringBuilder();
-            
+
             msg.Append(Catalog.GetString("An unhandled exception was thrown: "));
-            
+
             Stack<Exception> exception_chain = new Stack<Exception> ();
 
             while (e != null) {
                 exception_chain.Push (e);
                 e = e.InnerException;
             }
-            
+
             while (exception_chain.Count > 0) {
                 e = exception_chain.Pop ();
                 msg.AppendFormat ("{0}\n\n{1}\n", e.Message, e.StackTrace);
             };
-            
+
             msg.Append("\n");
             msg.AppendFormat(".NET Version: {0}\n", Environment.Version);
             msg.AppendFormat("OS Version: {0}\n", Environment.OSVersion);
             msg.Append("\nAssembly Version Information:\n\n");
-            
+
             foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
 				AssemblyName name = asm.GetName();
                 msg.AppendFormat("{0} ({1})\n", name.Name, name.Version);
@@ -161,21 +161,21 @@ namespace Hyena.Gui.Dialogs
 			
 			try {
                 msg.AppendFormat("\nPlatform Information: {0}", BuildPlatformString());
-                
+
                 msg.Append("\n\nDisribution Information:\n\n");
-                
+
                 Dictionary<string, string> lsb = LsbVersionInfo.Harvest;
-                
+
                 foreach(string lsbfile in lsb.Keys) {
                     msg.AppendFormat("[{0}]\n", lsbfile);
                     msg.AppendFormat("{0}\n", lsb[lsbfile]);
                 }
             } catch {
             }
-            
+
             return msg.ToString();
         }
-        
+
         private string BuildPlatformString()
         {
             ProcessStartInfo startInfo = new ProcessStartInfo();
@@ -183,8 +183,8 @@ namespace Hyena.Gui.Dialogs
             startInfo.RedirectStandardOutput = true;
             startInfo.RedirectStandardError = true;
             startInfo.UseShellExecute = false;
-            
-            foreach(string unameprog in new string [] { 
+
+            foreach(string unameprog in new string [] {
                 "/usr/bin/uname", "/bin/uname", "/usr/local/bin/uname",
                 "/sbin/uname", "/usr/sbin/uname", "/usr/local/sbin/uname"}) {
                 try {
@@ -195,10 +195,10 @@ namespace Hyena.Gui.Dialogs
                     continue;
                 }
             }
-            
+
             return null;
         }
-        
+
         private class LsbVersionInfo
         {
             private string [] filesToCheck = {
@@ -206,9 +206,9 @@ namespace Hyena.Gui.Dialogs
                 "slackware-version",
                 "debian_version"
             };
-            
-            private Dictionary<string, string> harvest = new Dictionary<string, string>(); 
-            
+
+            private Dictionary<string, string> harvest = new Dictionary<string, string>();
+
             public LsbVersionInfo()
             {
                 foreach(string pattern in filesToCheck) {
@@ -219,11 +219,11 @@ namespace Hyena.Gui.Dialogs
                     }
                 }
             }
-            
+
             public Dictionary<string, string> Findings {
                 get { return harvest; }
             }
-            
+
             public static Dictionary<string, string> Harvest {
                 get { return (new LsbVersionInfo()).Findings; }
             }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs
index faaca1a..484dc0a 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs
@@ -38,78 +38,78 @@ namespace Hyena.Gui.Dialogs
         private Label path_label;
         private TreeView version_tree;
         private TreeStore version_store;
-        
+
         public VersionInformationDialog() : base()
         {
             AccelGroup accel_group = new AccelGroup();
-            AddAccelGroup(accel_group);       
+            AddAccelGroup(accel_group);
             Modal = true;
-            
+
             Button button = new Button("gtk-close");
             button.CanDefault = true;
             button.UseStock = true;
             button.Show();
             DefaultResponse = ResponseType.Close;
-            button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Escape, 
+            button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Escape,
                 0, Gtk.AccelFlags.Visible);
-        
+
             AddActionWidget(button, ResponseType.Close);
-            
+
             Title = Catalog.GetString("Assembly Version Information");
             BorderWidth = 10;
-            
+
             version_tree = new TreeView();
-            
+
             version_tree.RulesHint = true;
             version_tree.AppendColumn(Catalog.GetString("Assembly Name"),
                 new CellRendererText(), "text", 0);
             version_tree.AppendColumn(Catalog.GetString("Version"),
                 new CellRendererText(), "text", 1);
-                                
+
             version_tree.Model = FillStore();
             version_tree.CursorChanged += OnCursorChanged;
-         
+
             ScrolledWindow scroll = new ScrolledWindow();
             scroll.Add(version_tree);
             scroll.ShadowType = ShadowType.In;
             scroll.SetSizeRequest(420, 200);
-            
+
             VBox.PackStart(scroll, true, true, 0);
             VBox.Spacing = 5;
-            
+
             path_label = new Label();
             path_label.Ellipsize = Pango.EllipsizeMode.End;
             path_label.Hide();
             path_label.Xalign = 0.0f;
             path_label.Yalign = 1.0f;
             VBox.PackStart(path_label, false, true, 0);
-            
+
             scroll.ShowAll();
         }
-        
+
         private void OnCursorChanged(object o, EventArgs args)
         {
             TreeIter iter;
-            
+
             if(!version_tree.Selection.GetSelected(out iter)) {
                 path_label.Hide();
                 return;
             }
-            
+
             object path = version_store.GetValue(iter, 2);
-            
+
             if(path == null) {
                 path_label.Hide();
                 return;
             }
-            
+
             path_label.Text = path as string;
             path_label.Show();
         }
-        
+
         private TreeStore FillStore()
         {
-            version_store = new TreeStore(typeof(string), 
+            version_store = new TreeStore(typeof(string),
                 typeof(string), typeof(string));
 
             foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Actor.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Actor.cs
index 95c28ed..bf5e8a2 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Actor.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Actor.cs
@@ -33,25 +33,25 @@ namespace Hyena.Gui.Theatrics
     public class Actor<T>
     {
         private T target;
-        
+
         private DateTime start_time;
         private uint duration;
         private double frames;
         private double percent;
         private bool can_expire = true;
-    
+
         public Actor (T target, uint duration)
         {
             this.target = target;
             this.duration = duration;
             Reset ();
         }
-        
+
         public void Reset ()
         {
             Reset (duration);
         }
-        
+
         public void Reset (uint duration)
         {
             start_time = DateTime.Now;
@@ -59,13 +59,13 @@ namespace Hyena.Gui.Theatrics
             percent = 0.0;
             this.duration = duration;
         }
-        
+
         public virtual void Step ()
         {
             if (!CanExpire && percent >= 1.0) {
                 Reset ();
             }
-            
+
             percent = (DateTime.Now - start_time).TotalMilliseconds / duration;
             frames++;
         }
@@ -73,32 +73,32 @@ namespace Hyena.Gui.Theatrics
         public bool Expired {
             get { return CanExpire && percent >= 1.0; }
         }
-        
+
         public bool CanExpire {
             get { return can_expire; }
             set { can_expire = value; }
         }
-        
+
         public T Target {
             get { return target; }
         }
-        
+
         public double Duration {
             get { return duration; }
         }
-        
+
         public DateTime StartTime {
             get { return start_time; }
         }
-        
+
         public double Frames {
             get { return frames; }
         }
-        
+
         public double FramesPerSecond {
             get { return frames / ((double)duration / 1000.0); }
         }
-        
+
         public double Percent {
             get { return Math.Max (0.0, Math.Min (1.0, percent)); }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs
index 17151ee..98a510f 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs
@@ -51,53 +51,53 @@ namespace Hyena.Gui.Theatrics
         ExponentialInOut,
         Sine,
     }
-    
+
     public static class Choreographer
     {
         public static int PixelCompose (double percent, int size, Easing easing)
         {
             return (int)Math.Round (Compose (percent, size, easing));
         }
-        
+
         public static double Compose (double percent, double scale, Easing easing)
         {
             return scale * Compose (percent, easing);
         }
-        
+
         public static double Compose (double percent, Easing easing)
         {
             if (percent < 0.0 || percent > 1.0) {
                 throw new ArgumentOutOfRangeException ("percent", "must be between 0 and 1 inclusive");
             }
-        
+
             switch (easing) {
                 case Easing.QuadraticIn:
                     return percent * percent;
-                
+
                 case Easing.QuadraticOut:
                     return -1.0 * percent * (percent - 2.0);
-                
+
                 case Easing.QuadraticInOut:
                     percent *= 2.0;
                     return percent < 1.0
                         ? percent * percent * 0.5
                         : -0.5 * (--percent * (percent - 2.0) - 1.0);
-                
+
                 case Easing.ExponentialIn:
                     return Math.Pow (2.0, 10.0 * (percent - 1.0));
-                
+
                 case Easing.ExponentialOut:
                     return -Math.Pow (2.0, -10.0 * percent) + 1.0;
-                
+
                 case Easing.ExponentialInOut:
                     percent *= 2.0;
                     return percent < 1.0
                         ? 0.5 * Math.Pow (2.0, 10.0 * (percent - 1.0))
                         : 0.5 * (-Math.Pow (2.0, -10.0 * --percent) + 2.0);
-                
+
                 case Easing.Sine:
                     return Math.Sin (percent * Math.PI);
-                
+
                 case Easing.Linear:
                 default:
                     return percent;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Pulsator.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Pulsator.cs
index 91d74c0..6531e62 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Pulsator.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Pulsator.cs
@@ -35,80 +35,80 @@ namespace Hyena.Gui.Theatrics
         private Stage<T> stage;
         public Stage<T> Stage {
             get { return stage; }
-            set { 
+            set {
                 if (stage == value) {
                     return;
                 }
-                
+
                 if (stage != null) {
                     stage.ActorStep -= OnActorStep;
                 }
-                
+
                 stage = value;
-                
+
                 if (stage != null) {
                     stage.ActorStep += OnActorStep;
                 }
             }
         }
-        
+
         private T target;
         public T Target {
             get { return target; }
             set { target = value; }
         }
-        
+
         public double Percent {
             get { return IsPulsing ? stage[Target].Percent : 0; }
         }
-        
+
         public bool IsPulsing {
             get { return stage != null && stage.Contains (Target); }
         }
-        
+
         public bool Stopping {
             get { return !IsPulsing ? true : stage[Target].CanExpire; }
         }
-        
+
         #pragma warning disable 0067
         // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455
         public event EventHandler Pulse;
         #pragma warning restore 0067
-        
+
         public Pulsator ()
         {
         }
-        
-        public Pulsator (Stage<T> stage) 
+
+        public Pulsator (Stage<T> stage)
         {
             Stage = stage;
         }
-        
+
         public void StartPulsing ()
         {
             if (!Stage.Contains (Target)) {
                 Stage.Add (Target);
             }
-            
+
             Stage[Target].CanExpire = false;
         }
-        
+
         public void StopPulsing ()
         {
             if (Stage.Contains (Target)) {
                 Stage[Target].CanExpire = true;
             }
         }
-        
+
         private bool OnActorStep (Actor<T> actor)
         {
             if (actor.Target == target) {
                 OnPulse ();
             }
-            
+
             return true;
         }
-        
+
         protected virtual void OnPulse ()
         {
             EventHandler handler = Pulse;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/SingleActorStage.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/SingleActorStage.cs
index faddf76..04acc2c 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/SingleActorStage.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/SingleActorStage.cs
@@ -33,30 +33,30 @@ namespace Hyena.Gui.Theatrics
     public class SingleActorStage : Stage<object>
     {
         private object target = new object ();
-        
+
         public SingleActorStage () : base ()
         {
         }
-        
+
         public SingleActorStage (uint actorDuration) : base (actorDuration)
         {
         }
-        
+
         protected override bool OnActorStep (Actor<object> actor)
         {
             return true;
         }
-        
+
         public void Reset ()
         {
             AddOrReset (target);
         }
-        
+
         public void Reset (uint duration)
         {
             AddOrReset (target, duration);
         }
-        
+
         public Actor<object> Actor {
             get { return this[target]; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs
index 8f0cc98..f60985d 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs
@@ -32,128 +32,128 @@ using System.Collections.Generic;
 namespace Hyena.Gui.Theatrics
 {
     public class Stage<T>
-    {   
+    {
         public delegate bool ActorStepHandler (Actor<T> actor);
-    
+
         private Dictionary<T, Actor<T>> actors = new Dictionary<T, Actor<T>> ();
         private uint timeout_id;
-        
+
         private uint update_frequency = 30;
         private uint default_duration = 1000;
         private bool playing = true;
-        
+
         public event ActorStepHandler ActorStep;
-        
+
         #pragma warning disable 0067
         // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455
         public event EventHandler Iteration;
         #pragma warning restore 0067
-        
+
         public Stage ()
         {
         }
-        
+
         public Stage (uint actorDuration)
         {
             default_duration = actorDuration;
         }
-        
+
         public Actor<T> this[T target] {
             get {
                 if (actors.ContainsKey (target)) {
                     return actors[target];
                 }
-                
+
                 return null;
             }
         }
-        
+
         public bool Contains (T target)
         {
             return actors.ContainsKey (target);
         }
-        
+
         public Actor<T> Add (T target)
         {
             lock (this) {
                 return Add (target, default_duration);
             }
         }
-        
+
         public Actor<T> Add (T target, uint duration)
         {
             lock (this) {
                 if (Contains (target)) {
                     throw new InvalidOperationException ("Stage already contains this actor");
                 }
-                
+
                 Actor<T> actor = new Actor<T> (target, duration);
                 actors.Add (target, actor);
-                
+
                 CheckTimeout ();
-                
+
                 return actor;
             }
         }
-        
+
         public Actor<T> AddOrReset (T target)
         {
             lock (this) {
                 return AddOrResetCore (target, null);
             }
         }
-        
+
         public Actor<T> AddOrReset (T target, uint duration)
         {
             lock (this) {
                 return AddOrResetCore (target, duration);
             }
         }
-        
+
         private Actor<T> AddOrResetCore (T target, uint? duration)
         {
             lock (this) {
                 if (Contains (target)) {
                     Actor<T> actor = this[target];
-                    
+
                     if (duration == null) {
                         actor.Reset ();
                     } else {
                         actor.Reset (duration.Value);
                     }
-                    
+
                     CheckTimeout ();
-                    
+
                     return actor;
                 }
-                
+
                 return Add (target);
             }
         }
-        
+
         public void Reset (T target)
         {
             lock (this) {
                 ResetCore (target, null);
             }
         }
-        
+
         public void Reset (T target, uint duration)
         {
             lock (this) {
                 ResetCore (target, duration);
             }
         }
-        
+
         private void ResetCore (T target, uint? duration)
         {
             lock (this) {
                 if (!Contains (target)) {
                     throw new InvalidOperationException ("Stage does not contain this actor");
                 }
-                
+
                 CheckTimeout ();
-                
+
                 if (duration == null) {
                     this [target].Reset ();
                 } else {
@@ -161,7 +161,7 @@ namespace Hyena.Gui.Theatrics
                 }
             }
         }
-        
+
         private void CheckTimeout ()
         {
             if ((!Playing || actors.Count == 0) && timeout_id > 0) {
@@ -173,29 +173,29 @@ namespace Hyena.Gui.Theatrics
                 return;
             }
         }
-        
+
         private bool OnTimeout ()
         {
             if (!Playing || this.actors.Count == 0) {
                 timeout_id = 0;
                 return false;
             }
-            
+
             Queue<Actor<T>> actors = new Queue<Actor<T>> (this.actors.Values);
             while (actors.Count > 0) {
                 Actor<T> actor = actors.Dequeue ();
                 actor.Step ();
-                
+
                 if (!OnActorStep (actor) || actor.Expired) {
                     this.actors.Remove (actor.Target);
                 }
             }
-            
+
             OnIteration ();
-            
+
             return true;
         }
-        
+
         protected virtual bool OnActorStep (Actor<T> actor)
         {
             ActorStepHandler handler = ActorStep;
@@ -208,7 +208,7 @@ namespace Hyena.Gui.Theatrics
             }
             return false;
         }
-        
+
         protected virtual void OnIteration ()
         {
             EventHandler handler = Iteration;
@@ -216,21 +216,21 @@ namespace Hyena.Gui.Theatrics
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void Play ()
         {
             lock (this) {
                 Playing = true;
             }
         }
-        
+
         public void Pause ()
         {
             lock (this) {
                 Playing = false;
             }
         }
-        
+
         public void Exeunt ()
         {
             lock (this) {
@@ -238,12 +238,12 @@ namespace Hyena.Gui.Theatrics
                 CheckTimeout ();
             }
         }
-        
+
         public uint DefaultActorDuration {
             get { return default_duration; }
             set { lock (this) { default_duration = value; } }
         }
-        
+
         public bool Playing {
             get { return playing; }
             set {
@@ -251,13 +251,13 @@ namespace Hyena.Gui.Theatrics
                     if (playing == value) {
                         return;
                     }
-                
-                    playing = value; 
+
+                    playing = value;
                     CheckTimeout ();
                 }
             }
         }
-        
+
         public uint UpdateFrequency {
             get { return update_frequency; }
             set {
@@ -268,7 +268,7 @@ namespace Hyena.Gui.Theatrics
                 }
             }
         }
-        
+
         public int ActorCount {
             get { return actors.Count; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs
index d63911a..5447fca 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs
@@ -33,7 +33,7 @@ using NUnit.Framework;
 
 using Hyena;
 using Hyena.Gui.Theatrics;
-    
+
 namespace Hyena.Gui.Theatrics.Tests
 {
     [TestFixture]
@@ -46,67 +46,67 @@ namespace Hyena.Gui.Theatrics.Tests
                 Assert.AreEqual (values[(int)j], value);
             }
         }
-    
+
         [Test]
         public void QuadraticInCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 0, 1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36, 42, 49, 56, 64, 72, 81, 90, 100
             }, Easing.QuadraticIn);
         }
-           
+
         [Test]
         public void QuadraticOutCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 10, 19, 28, 36, 44, 51, 58, 64, 70, 75, 80, 84, 88, 91, 94, 96, 98, 99, 100, 100
             }, Easing.QuadraticOut);
         }
-           
+
         [Test]
         public void QuadraticInOutCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 1, 2, 4, 8, 12, 18, 24, 32, 40, 50, 60, 68, 76, 82, 88, 92, 96, 98, 100, 100
             }, Easing.QuadraticInOut);
         }
-           
+
         [Test]
         public void ExponentialInCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 6, 9, 12, 18, 25, 35, 50, 71, 100
             }, Easing.ExponentialIn);
         }
-           
+
         [Test]
         public void ExponentialOutCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 29, 50, 65, 75, 82, 88, 91, 94, 96, 97, 98, 98, 99, 99, 99, 100, 100, 100, 100, 100
             }, Easing.ExponentialOut);
         }
-           
+
         [Test]
         public void ExponentialInOutCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 0, 0, 0, 1, 2, 3, 6, 13, 25, 50, 75, 88, 94, 97, 98, 99, 100, 100, 100, 100
             }, Easing.ExponentialInOut);
         }
-           
+
         [Test]
         public void LinearCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100
             }, Easing.Linear);
         }
-          
+
         [Test]
         public void SineCompose ()
         {
-            _TestComposeRange (new int [] { 
+            _TestComposeRange (new int [] {
                 0, 16, 31, 45, 59, 71, 81, 89, 95, 99, 100, 99, 95, 89, 81, 71, 59, 45, 31, 16, 0
             }, Easing.Sine);
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkColors.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkColors.cs
index f67b5ef..4e73dec 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkColors.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkColors.cs
@@ -32,7 +32,7 @@ using Gtk;
 
 namespace Hyena.Gui.Theming
 {
-    public enum GtkColorClass 
+    public enum GtkColorClass
     {
         Light,
         Mid,
@@ -53,7 +53,7 @@ namespace Hyena.Gui.Theming
 
         public Widget Widget {
             get { return widget; }
-            set { 
+            set {
                 if (widget == value) {
                     return;
                 } else if (widget != null) {
@@ -85,35 +85,35 @@ namespace Hyena.Gui.Theming
         {
             RefreshColors ();
         }
-        
+
         public Cairo.Color GetWidgetColor (GtkColorClass @class, StateType state)
         {
             if (gtk_colors == null) {
                 RefreshColors ();
             }
-            
+
             return gtk_colors[(int)@class * ((int)StateType.Insensitive + 1) + (int)state];
         }
-        
+
         public void RefreshColors ()
         {
             if (refreshing) {
                 return;
             }
-            
+
             refreshing = true;
-            
+
             int sn = (int)StateType.Insensitive + 1;
             int cn = (int)GtkColorClass.Foreground + 1;
-            
+
             if (gtk_colors == null) {
                 gtk_colors = new Cairo.Color[sn * cn];
             }
-                
+
             for (int c = 0, i = 0; c < cn; c++) {
                 for (int s = 0; s < sn; s++, i++) {
                     Gdk.Color color = Gdk.Color.Zero;
-                    
+
                     if (widget != null && widget.IsRealized) {
                         switch ((GtkColorClass)c) {
                             case GtkColorClass.Light:      color = widget.Style.LightColors[s]; break;
@@ -127,13 +127,13 @@ namespace Hyena.Gui.Theming
                     } else {
                         color = new Gdk.Color (0, 0, 0);
                     }
-                    
+
                     gtk_colors[c * sn + s] = CairoExtensions.GdkColorToCairoColor (color);
                 }
             }
 
             OnRefreshed ();
-            
+
             refreshing = false;
         }
 
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs
index 401f781..e67768a 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs
@@ -40,14 +40,14 @@ namespace Hyena.Gui.Theming
         public GtkTheme (Widget widget) : base (widget)
         {
         }
-        
+
         public static Cairo.Color GetCairoTextMidColor (Widget widget)
         {
             Cairo.Color text_color = CairoExtensions.GdkColorToCairoColor (widget.Style.Foreground (StateType.Normal));
             Cairo.Color background_color = CairoExtensions.GdkColorToCairoColor (widget.Style.Background (StateType.Normal));
             return CairoExtensions.AlphaBlend (text_color, background_color, 0.5);
         }
-        
+
         public static Gdk.Color GetGdkTextMidColor (Widget widget)
         {
             Cairo.Color color = GetCairoTextMidColor (widget);
@@ -83,7 +83,7 @@ namespace Hyena.Gui.Theming
             Color color_a = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected);
             Color color_b = CairoExtensions.ColorShade (color_a, 1.4);
 
-            RadialGradient fill = new RadialGradient (Context.X, Context.Y, 0, 
+            RadialGradient fill = new RadialGradient (Context.X, Context.Y, 0,
                 Context.X, Context.Y, 2.0 * Context.Radius);
             fill.AddColorStop (0, color_a);
             fill.AddColorStop (1, color_b);
@@ -97,7 +97,7 @@ namespace Hyena.Gui.Theming
             Context.Cairo.LineWidth = Context.LineWidth;
             Context.Cairo.Stroke ();
         }
-        
+
         public override void DrawArrow (Context cr, Gdk.Rectangle alloc, Hyena.Data.SortType type)
         {
             cr.LineWidth = 1;
@@ -107,7 +107,7 @@ namespace Hyena.Gui.Theming
             double x2 = x3 + (x3 - x1);
             double y1 = alloc.Y;
             double y2 = alloc.Bottom;
-            
+
             if (type == Hyena.Data.SortType.Ascending) {
                 cr.MoveTo (x1, y1);
                 cr.LineTo (x2, y1);
@@ -119,7 +119,7 @@ namespace Hyena.Gui.Theming
                 cr.LineTo (x1, y2);
                 cr.LineTo (x3, y1);
             }
-            
+
             cr.Color = Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal);
             cr.FillPreserve ();
             cr.Color = Colors.GetWidgetColor (GtkColorClass.Text, StateType.Normal);
@@ -138,26 +138,36 @@ namespace Hyena.Gui.Theming
             CairoExtensions.RoundedRectangle (cr, alloc.X, alloc.Y, alloc.Width, alloc.Height, Context.Radius, CairoCorners.All);
             cr.Fill ();
         }
-        
+
         public override void DrawFrameBorder (Cairo.Context cr, Gdk.Rectangle alloc)
         {
             cr.LineWidth = BorderWidth;
             cr.Color = border_color;
-            double offset = (double)BorderWidth / 2.0;
+            double offset = (double)cr.LineWidth / 2.0;
             CairoExtensions.RoundedRectangle (cr, alloc.X + offset, alloc.Y + offset,
-                alloc.Width - BorderWidth, alloc.Height - BorderWidth, Context.Radius, CairoCorners.All);
-            cr.Stroke();
+                alloc.Width - cr.LineWidth, alloc.Height - cr.LineWidth, Context.Radius, CairoCorners.All);
+            cr.Stroke ();
+        }
+
+        public override void DrawFrameBorderFocused (Cairo.Context cr, Gdk.Rectangle alloc)
+        {
+            cr.LineWidth = BorderWidth * 1.5;
+            cr.Color = CairoExtensions.ColorShade (border_color, 0.8);
+            double offset = (double)cr.LineWidth / 2.0;
+            CairoExtensions.RoundedRectangle (cr, alloc.X + offset, alloc.Y + offset,
+                alloc.Width - cr.LineWidth, alloc.Height - cr.LineWidth, Context.Radius, CairoCorners.All);
+            cr.Stroke ();
         }
-        
+
         public override void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color)
         {
             Cairo.Color light_color = CairoExtensions.ColorShade (color, 1.6);
             Cairo.Color dark_color = CairoExtensions.ColorShade (color, 1.3);
-            
+
             LinearGradient grad = new LinearGradient (alloc.X, alloc.Y, alloc.X, alloc.Bottom - 1);
             grad.AddColorStop (0, light_color);
             grad.AddColorStop (1, dark_color);
-            
+
             cr.Pattern = grad;
             cr.Rectangle (alloc.X + 1.5, alloc.Y + 1.5, alloc.Width - 3, alloc.Height - 2);
             cr.Fill ();
@@ -169,49 +179,84 @@ namespace Hyena.Gui.Theming
             Cairo.Color gtk_background_color = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal);
             Cairo.Color light_color = CairoExtensions.ColorShade (gtk_background_color, 1.1);
             Cairo.Color dark_color = CairoExtensions.ColorShade (gtk_background_color, 0.95);
-            
+
             CairoCorners corners = CairoCorners.TopLeft | CairoCorners.TopRight;
 
             LinearGradient grad = new LinearGradient (alloc.X, alloc.Y, alloc.X, alloc.Bottom);
             grad.AddColorStop (0, light_color);
             grad.AddColorStop (0.75, dark_color);
             grad.AddColorStop (0, light_color);
-        
+
             cr.Pattern = grad;
             CairoExtensions.RoundedRectangle (cr, alloc.X, alloc.Y, alloc.Width, alloc.Height, Context.Radius, corners);
             cr.Fill ();
-            
+
             cr.Color = border_color;
             cr.Rectangle (alloc.X, alloc.Bottom, alloc.Width, BorderWidth);
             cr.Fill ();
             grad.Destroy ();
         }
-        
+
+        public override void DrawColumnHeaderFocus (Cairo.Context cr, Gdk.Rectangle alloc)
+        {
+            double top_offset = 2.0;
+            double right_offset = 2.0;
+
+            double margin = 0.5;
+            double line_width = 0.7;
+
+            Cairo.Color stroke_color = CairoExtensions.ColorShade (
+                Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), 0.8);
+
+            stroke_color.A = 0.1;
+            cr.Color = stroke_color;
+
+            CairoExtensions.RoundedRectangle (cr,
+                alloc.X + margin + line_width + right_offset,
+                alloc.Y + margin + line_width + top_offset,
+                alloc.Width - (margin + line_width)*2.0 - right_offset,
+                alloc.Height - (margin + line_width)*2.0 - top_offset,
+                Context.Radius/2.0, CairoCorners.None);
+
+            cr.Fill ();
+
+            stroke_color.A = 1.0;
+            cr.LineWidth = line_width;
+            cr.Color = stroke_color;
+            CairoExtensions.RoundedRectangle (cr,
+                alloc.X + margin + line_width + right_offset,
+                alloc.Y + margin + line_width + top_offset,
+                alloc.Width - (line_width + margin)*2.0 - right_offset,
+                alloc.Height - (line_width + margin)*2.0 - right_offset,
+                Context.Radius/2.0, CairoCorners.All);
+            cr.Stroke ();
+        }
+
         public override void DrawHeaderSeparator (Cairo.Context cr, Gdk.Rectangle alloc, int x)
         {
             Cairo.Color gtk_background_color = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal);
             Cairo.Color dark_color = CairoExtensions.ColorShade (gtk_background_color, 0.80);
             Cairo.Color light_color = CairoExtensions.ColorShade (gtk_background_color, 1.1);
-            
+
             int y_1 = alloc.Top + 4;
             int y_2 = alloc.Bottom - 3;
-            
+
             cr.LineWidth = 1;
             cr.Antialias = Cairo.Antialias.None;
-            
+
             cr.Color = dark_color;
             cr.MoveTo (x, y_1);
             cr.LineTo (x, y_2);
             cr.Stroke ();
-            
+
             cr.Color = light_color;
             cr.MoveTo (x + 1, y_1);
             cr.LineTo (x + 1, y_2);
             cr.Stroke ();
-            
+
             cr.Antialias = Cairo.Antialias.Default;
         }
-        
+
         public override void DrawListBackground (Context cr, Gdk.Rectangle alloc, Color color)
         {
             color.A = Context.FillAlpha;
@@ -219,7 +264,17 @@ namespace Hyena.Gui.Theming
             cr.Rectangle (alloc.X, alloc.Y, alloc.Width, alloc.Height);
             cr.Fill ();
         }
-        
+
+        public override void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height,
+                                            Cairo.Color color, CairoCorners corners)
+        {
+            cr.LineWidth = 1.25;
+            cr.Color = color;
+            CairoExtensions.RoundedRectangle (cr, x + cr.LineWidth/2.0, y + cr.LineWidth/2.0,
+                width - cr.LineWidth, height - cr.LineWidth, Context.Radius, corners, true);
+            cr.Stroke ();
+        }
+
         public override void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height,
             bool filled, bool stroked, Cairo.Color color, CairoCorners corners)
         {
@@ -228,19 +283,19 @@ namespace Hyena.Gui.Theming
             Cairo.Color selection_stroke = CairoExtensions.ColorShade (selection_color, 0.85);
             selection_highlight.A = 0.5;
             selection_stroke.A = color.A;
-            
+
             if (filled) {
                 Cairo.Color selection_fill_light = CairoExtensions.ColorShade (selection_color, 1.12);
                 Cairo.Color selection_fill_dark = selection_color;
-                
+
                 selection_fill_light.A = color.A;
                 selection_fill_dark.A = color.A;
-                
+
                 LinearGradient grad = new LinearGradient (x, y, x, y + height);
                 grad.AddColorStop (0, selection_fill_light);
                 grad.AddColorStop (0.4, selection_fill_dark);
                 grad.AddColorStop (1, selection_fill_light);
-                
+
                 cr.Pattern = grad;
                 CairoExtensions.RoundedRectangle (cr, x, y, width, height, Context.Radius, corners, true);
                 cr.Fill ();
@@ -258,13 +313,13 @@ namespace Hyena.Gui.Theming
             if (stroked) {
                 cr.LineWidth = 1.0;
                 cr.Color = selection_stroke;
-                CairoExtensions.RoundedRectangle (cr, x + 0.5, y + 0.5, width - 1, height - 1, 
+                CairoExtensions.RoundedRectangle (cr, x + 0.5, y + 0.5, width - 1, height - 1,
                     Context.Radius, corners, true);
                 cr.Stroke ();
             }
         }
-        
-        public override void DrawRowRule(Cairo.Context cr, int x, int y, int width, int height)
+
+        public override void DrawRowRule (Cairo.Context cr, int x, int y, int width, int height)
         {
             cr.Color = new Cairo.Color (rule_color.R, rule_color.G, rule_color.B, Context.FillAlpha);
             cr.Rectangle (x, y, width, height);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs
index f870f4e..5d093c1 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs
@@ -44,7 +44,7 @@ namespace Hyena.Gui.Theming
 
         private Cairo.Color selection_fill;
         private Cairo.Color selection_stroke;
-        
+
         private Cairo.Color view_fill;
         private Cairo.Color view_fill_transparent;
 
@@ -69,7 +69,7 @@ namespace Hyena.Gui.Theming
         {
             selection_fill = colors.GetWidgetColor (GtkColorClass.Dark, StateType.Active);
             selection_stroke = colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected);
-            
+
             view_fill = colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal);
             view_fill_transparent = view_fill;
             view_fill_transparent.A = 0;
@@ -78,55 +78,59 @@ namespace Hyena.Gui.Theming
 #region Drawing
 
         public abstract void DrawPie (double fraction);
-        
+
         public abstract void DrawArrow (Cairo.Context cr, Gdk.Rectangle alloc, Hyena.Data.SortType type);
-        
+
         public void DrawFrame (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor)
         {
             DrawFrameBackground (cr, alloc, baseColor);
             DrawFrameBorder (cr, alloc);
         }
-        
+
         public void DrawFrame (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color)
         {
             DrawFrameBackground (cr, alloc, color);
             DrawFrameBorder (cr, alloc);
         }
-        
+
         public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor)
         {
-            DrawFrameBackground (cr, alloc,  baseColor 
+            DrawFrameBackground (cr, alloc,  baseColor
                 ? colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal)
                 : colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal));
         }
-        
+
         public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color)
         {
             DrawFrameBackground (cr, alloc, color, null);
         }
-        
+
         public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Pattern pattern)
         {
             DrawFrameBackground (cr, alloc, black , pattern);
         }
-        
+
         public abstract void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color, Cairo.Pattern pattern);
-        
+
         public abstract void DrawFrameBorder (Cairo.Context cr, Gdk.Rectangle alloc);
-        
+
+        public abstract void DrawFrameBorderFocused (Cairo.Context cr, Gdk.Rectangle alloc);
+
         public abstract void DrawHeaderBackground (Cairo.Context cr, Gdk.Rectangle alloc);
-        
-        public abstract void DrawHeaderSeparator(Cairo.Context cr, Gdk.Rectangle alloc, int x);
-        
+
+        public abstract void DrawColumnHeaderFocus (Cairo.Context cr, Gdk.Rectangle alloc);
+
+        public abstract void DrawHeaderSeparator (Cairo.Context cr, Gdk.Rectangle alloc, int x);
+
         public void DrawListBackground (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor)
         {
-            DrawListBackground (cr, alloc,  baseColor 
+            DrawListBackground (cr, alloc,  baseColor
                 ? colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal)
                 : colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal));
         }
-        
+
         public abstract void DrawListBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color);
-        
+
         public void DrawColumnHighlight (Cairo.Context cr, double cellWidth, double cellHeight)
         {
             Gdk.Rectangle alloc = new Gdk.Rectangle ();
@@ -134,60 +138,72 @@ namespace Hyena.Gui.Theming
             alloc.Height = (int)cellHeight;
             DrawColumnHighlight (cr, alloc);
         }
-        
+
         public void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc)
         {
-            DrawColumnHighlight (cr, alloc, colors.GetWidgetColor(GtkColorClass.Background, StateType.Selected));
+            DrawColumnHighlight (cr, alloc, colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected));
         }
-        
+
         public abstract void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color);
-        
+
         public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height)
         {
             DrawRowSelection (cr, x, y, width, height, true);
         }
-        
+
         public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled)
         {
-            DrawRowSelection (cr, x, y, width, height, filled, true, 
+            DrawRowSelection (cr, x, y, width, height, filled, true,
                 colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), CairoCorners.All);
         }
-        
+
         public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height,
             bool filled, bool stroked, Cairo.Color color)
         {
             DrawRowSelection (cr, x, y, width, height, filled, stroked, color, CairoCorners.All);
         }
-        
+
+        public void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height)
+        {
+            DrawRowCursor (cr, x, y, width, height, colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected));
+        }
+
+        public void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height, Cairo.Color color)
+        {
+            DrawRowCursor (cr, x, y, width, height, color, CairoCorners.All);
+        }
+
+        public abstract void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height, Cairo.Color color, CairoCorners corners);
+
         public abstract void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height,
             bool filled, bool stroked, Cairo.Color color, CairoCorners corners);
-        
+
         public abstract void DrawRowRule (Cairo.Context cr, int x, int y, int width, int height);
 
         public Cairo.Color ViewFill {
             get { return view_fill; }
         }
-        
+
         public Cairo.Color ViewFillTransparent {
             get { return view_fill_transparent; }
         }
-        
+
         public Cairo.Color SelectionFill {
             get { return selection_fill; }
         }
-        
+
         public Cairo.Color SelectionStroke {
             get { return selection_stroke; }
         }
-        
+
         public virtual int BorderWidth {
             get { return 1; }
         }
-        
+
         public virtual int InnerBorderWidth {
             get { return 4; }
         }
-        
+
         public int TotalBorderWidth {
             get { return BorderWidth + InnerBorderWidth; }
         }
@@ -207,7 +223,7 @@ namespace Hyena.Gui.Theming
                 contexts.Push (context);
             }
         }
-        
+
         public ThemeContext PopContext ()
         {
             lock (this) {
@@ -225,7 +241,7 @@ namespace Hyena.Gui.Theming
 
         public static double Clamp (double min, double max, double value)
         {
-             return Math.Max (min, Math.Min (max, value)); 
+             return Math.Max (min, Math.Min (max, value));
         }
 
 #endregion
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeEngine.cs b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeEngine.cs
index 9a0e8ac..ef3f3bc 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeEngine.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeEngine.cs
@@ -1,21 +1,21 @@
-// 
+//
 // ThemeEngine.cs
-//  
+//
 // Author:
 //     Aaron Bockover <abockover at novell.com>
-// 
+//
 // Copyright 2009 Aaron Bockover
-// 
+//
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
 // in the Software without restriction, including without limitation the rights
 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 // copies of the Software, and to permit persons to whom the Software is
 // furnished to do so, subject to the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be included in
 // all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/BaseWidgetAccessible.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/BaseWidgetAccessible.cs
new file mode 100644
index 0000000..1553728
--- /dev/null
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/BaseWidgetAccessible.cs
@@ -0,0 +1,260 @@
+//
+// BaseWidgetAccessible.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Atk;
+
+namespace Hyena.Gui
+{
+    public class BaseWidgetAccessible : Gtk.Accessible, Atk.ComponentImplementor
+    {
+        private Gtk.Widget widget;
+        private uint focus_id = 0;
+        private Dictionary<uint, Atk.FocusHandler> focus_handlers = new Dictionary<uint, Atk.FocusHandler> ();
+
+        public BaseWidgetAccessible (Gtk.Widget widget)
+        {
+            this.widget = widget;
+            widget.SizeAllocated += OnAllocated;
+            widget.Mapped += OnMap;
+            widget.Unmapped += OnMap;
+            widget.FocusInEvent += OnFocus;
+            widget.FocusOutEvent += OnFocus;
+            widget.AddNotification ("sensitive", (o, a) => NotifyStateChange (StateType.Sensitive, widget.Sensitive));
+            widget.AddNotification ("visible",   (o, a) => NotifyStateChange (StateType.Visible, widget.Visible));
+        }
+
+        public virtual new Atk.Layer Layer {
+            get { return Layer.Widget; }
+        }
+
+        protected override Atk.StateSet OnRefStateSet ()
+        {
+            var s = base.OnRefStateSet ();
+
+            AddStateIf (s, widget.CanFocus,   StateType.Focusable);
+            AddStateIf (s, widget.HasFocus,   StateType.Focused);
+            AddStateIf (s, widget.Sensitive,  StateType.Sensitive);
+            AddStateIf (s, widget.Sensitive,  StateType.Enabled);
+            AddStateIf (s, widget.HasDefault, StateType.Default);
+            AddStateIf (s, widget.Visible,    StateType.Visible);
+            AddStateIf (s, widget.Visible && widget.IsMapped, StateType.Showing);
+
+            return s;
+        }
+
+        private static void AddStateIf (StateSet s, bool condition, StateType t)
+        {
+            if (condition) {
+                s.AddState (t);
+            }
+        }
+
+        private void OnFocus (object o, EventArgs args)
+        {
+            NotifyStateChange (StateType.Focused, widget.HasFocus);
+            var handler = FocusChanged;
+            if (handler != null) {
+                handler (this, widget.HasFocus);
+            }
+        }
+
+        private void OnMap (object o, EventArgs args)
+        {
+            NotifyStateChange (StateType.Showing, widget.Visible && widget.IsMapped);
+        }
+
+        private void OnAllocated (object o, EventArgs args)
+        {
+            var a = widget.Allocation;
+            var bounds = new Atk.Rectangle () { X = a.X, Y = a.Y, Width = a.Width, Height = a.Height };
+            GLib.Signal.Emit (this, "bounds_changed", bounds);
+            /*var handler = BoundsChanged;
+            if (handler != null) {
+                handler (this, new BoundsChangedArgs () { Args = new object [] { bounds } });
+            }*/
+        }
+
+        private event FocusHandler FocusChanged;
+
+        #region Atk.Component
+
+        public uint AddFocusHandler (Atk.FocusHandler handler)
+        {
+            if (!focus_handlers.ContainsValue (handler)) {
+                FocusChanged += handler;
+                focus_handlers[++focus_id] = handler;
+                return focus_id;
+            }
+            return 0;
+        }
+
+        public bool Contains (int x, int y, Atk.CoordType coordType)
+        {
+            int x_extents, y_extents, w, h;
+            GetExtents (out x_extents, out y_extents, out w, out h, coordType);
+            Gdk.Rectangle extents = new Gdk.Rectangle (x_extents, y_extents, w, h);
+            return extents.Contains (x, y);
+        }
+
+        public virtual Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType)
+        {
+            return new NoOpObject (widget);
+        }
+
+        public void GetExtents (out int x, out int y, out int w, out int h, Atk.CoordType coordType)
+        {
+            w = widget.Allocation.Width;
+            h = widget.Allocation.Height;
+
+            GetPosition (out x, out y, coordType);
+        }
+
+        public void GetPosition (out int x, out int y, Atk.CoordType coordType)
+        {
+            Gdk.Window window = null;
+
+            if (!widget.IsDrawable) {
+                x = y = Int32.MinValue;
+                return;
+            }
+
+            if (widget.Parent != null) {
+                x = widget.Allocation.X;
+                y = widget.Allocation.Y;
+                window = widget.ParentWindow;
+            } else {
+                x = 0;
+                y = 0;
+                window = widget.GdkWindow;
+            }
+
+            int x_window, y_window;
+            window.GetOrigin (out x_window, out y_window);
+            x += x_window;
+            y += y_window;
+
+            if (coordType == Atk.CoordType.Window) {
+                window = widget.GdkWindow.Toplevel;
+                int x_toplevel, y_toplevel;
+                window.GetOrigin (out x_toplevel, out y_toplevel);
+
+                x -= x_toplevel;
+                y -= y_toplevel;
+            }
+        }
+
+        public void GetSize (out int w, out int h)
+        {
+            w = widget.Allocation.Width;
+            h = widget.Allocation.Height;
+        }
+
+        public bool GrabFocus ()
+        {
+            if (!widget.CanFocus) {
+                return false;
+            }
+
+            widget.GrabFocus ();
+
+            var toplevel_window = widget.Toplevel as Gtk.Window;
+            if (toplevel_window != null) {
+                toplevel_window.Present ();
+            }
+
+            return true;
+        }
+
+        public void RemoveFocusHandler (uint handlerId)
+        {
+            if (focus_handlers.ContainsKey (handlerId)) {
+                FocusChanged -= focus_handlers[handlerId];
+                focus_handlers.Remove (handlerId);
+            }
+        }
+
+        public bool SetExtents (int x, int y, int w, int h, Atk.CoordType coordType)
+        {
+            return SetSizeAndPosition (x, y, w, h, coordType, true);
+        }
+
+        public bool SetPosition (int x, int y, Atk.CoordType coordType)
+        {
+            return SetSizeAndPosition (x, y, 0, 0, coordType, false);
+        }
+
+        private bool SetSizeAndPosition (int x, int y, int w, int h, Atk.CoordType coordType, bool setSize)
+        {
+            if (!widget.IsTopLevel) {
+                return false;
+            }
+
+            if (coordType == CoordType.Window) {
+                int x_off, y_off;
+                widget.GdkWindow.GetOrigin (out x_off, out y_off);
+                x += x_off;
+                y += y_off;
+
+                if (x < 0 || y < 0) {
+                    return false;
+                }
+            }
+
+            #pragma warning disable 0612
+            widget.SetUposition (x, y);
+            #pragma warning restore 0612
+
+            if (setSize) {
+                widget.SetSizeRequest (w, h);
+            }
+
+            return true;
+        }
+
+        public bool SetSize (int w, int h)
+        {
+            if (widget.IsTopLevel) {
+                widget.SetSizeRequest (w, h);
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        public double Alpha {
+            get { return 1.0; }
+        }
+
+        #endregion Atk.Component
+
+    }
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/CairoExtensions.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
index fc663d9..80c1b67 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
@@ -45,26 +45,26 @@ namespace Hyena.Gui
         BottomRight = 8,
         All = 15
     }
-    
+
     public static class CairoExtensions
     {
         public static Pango.Layout CreateLayout (Gtk.Widget widget, Cairo.Context cairo_context)
         {
             Pango.Layout layout = PangoCairoHelper.CreateLayout (cairo_context);
             layout.FontDescription = widget.PangoContext.FontDescription.Copy ();
-            
+
             double resolution = widget.Screen.Resolution;
             if (resolution != -1) {
                 Pango.Context context = PangoCairoHelper.LayoutGetContext (layout);
                 PangoCairoHelper.ContextSetResolution (context, resolution);
                 context.Dispose ();
             }
-            
+
             Log.Debug ("Creating Pango.Layout, configuring Cairo.Context");
-            
+
             return layout;
         }
-        
+
         public static Surface CreateSurfaceForPixbuf (Cairo.Context cr, Gdk.Pixbuf pixbuf)
         {
             Surface surface = cr.Target.CreateSimilar (cr.Target.Content, pixbuf.Width, pixbuf.Height);
@@ -74,7 +74,7 @@ namespace Hyena.Gui
             ((IDisposable)surface_cr).Dispose ();
             return surface;
         }
-        
+
         public static Cairo.Color AlphaBlend (Cairo.Color ca, Cairo.Color cb, double alpha)
         {
             return new Cairo.Color (
@@ -82,12 +82,12 @@ namespace Hyena.Gui
                 (1.0 - alpha) * ca.G + alpha * cb.G,
                 (1.0 - alpha) * ca.B + alpha * cb.B);
         }
-        
+
         public static Cairo.Color GdkColorToCairoColor(Gdk.Color color)
         {
             return GdkColorToCairoColor(color, 1.0);
         }
-        
+
         public static Cairo.Color GdkColorToCairoColor(Gdk.Color color, double alpha)
         {
             return new Cairo.Color(
@@ -96,40 +96,40 @@ namespace Hyena.Gui
                 (double)(color.Blue >> 8) / 255.0,
                 alpha);
         }
-        
+
         public static Cairo.Color RgbToColor (uint rgbColor)
         {
             return RgbaToColor ((rgbColor << 8) | 0x000000ff);
         }
-        
+
         public static Cairo.Color RgbaToColor (uint rgbaColor)
         {
             return new Cairo.Color (
-                (byte)(rgbaColor >> 24) / 255.0, 
-                (byte)(rgbaColor >> 16) / 255.0, 
-                (byte)(rgbaColor >> 8) / 255.0, 
+                (byte)(rgbaColor >> 24) / 255.0,
+                (byte)(rgbaColor >> 16) / 255.0,
+                (byte)(rgbaColor >> 8) / 255.0,
                 (byte)(rgbaColor & 0x000000ff) / 255.0);
         }
-        
+
         public static bool ColorIsDark (Cairo.Color color)
         {
             double h, s, b;
             HsbFromColor (color, out h, out s, out b);
             return b < 0.5;
         }
-        
-        public static void HsbFromColor(Cairo.Color color, out double hue, 
+
+        public static void HsbFromColor(Cairo.Color color, out double hue,
             out double saturation, out double brightness)
         {
             double min, max, delta;
             double red = color.R;
             double green = color.G;
             double blue = color.B;
-            
+
             hue = 0;
             saturation = 0;
             brightness = 0;
-            
+
             if(red > green) {
                 max = Math.Max(red, blue);
                 min = Math.Min(green, blue);
@@ -137,9 +137,9 @@ namespace Hyena.Gui
                 max = Math.Max(green, blue);
                 min = Math.Min(red, blue);
             }
-            
+
             brightness = (max + min) / 2;
-            
+
             if(Math.Abs(max - min) < 0.0001) {
                 hue = 0;
                 saturation = 0;
@@ -147,9 +147,9 @@ namespace Hyena.Gui
                 saturation = brightness <= 0.5
                     ? (max - min) / (max + min)
                     : (max - min) / (2 - max - min);
-               
+
                 delta = max - min;
-                
+
                 if(red == max) {
                     hue = (green - blue) / delta;
                 } else if(green == max) {
@@ -157,49 +157,49 @@ namespace Hyena.Gui
                 } else if(blue == max) {
                     hue = 4 + (red - green) / delta;
                 }
-                
+
                 hue *= 60;
                 if(hue < 0) {
                     hue += 360;
                 }
             }
         }
-        
+
         private static double Modula(double number, double divisor)
         {
             return ((int)number % divisor) + (number - (int)number);
         }
-        
+
         public static Cairo.Color ColorFromHsb(double hue, double saturation, double brightness)
         {
             int i;
             double [] hue_shift = { 0, 0, 0 };
             double [] color_shift = { 0, 0, 0 };
             double m1, m2, m3;
-            
+
             m2 = brightness <= 0.5
                 ? brightness * (1 + saturation)
                 : brightness + saturation - brightness * saturation;
-            
+
             m1 = 2 * brightness - m2;
-            
+
             hue_shift[0] = hue + 120;
             hue_shift[1] = hue;
             hue_shift[2] = hue - 120;
-            
+
             color_shift[0] = color_shift[1] = color_shift[2] = brightness;
-            
+
             i = saturation == 0 ? 3 : 0;
-            
+
             for(; i < 3; i++) {
                 m3 = hue_shift[i];
-                
+
                 if(m3 > 360) {
                     m3 = Modula(m3, 360);
                 } else if(m3 < 0) {
                     m3 = 360 - Modula(Math.Abs(m3), 360);
                 }
-                
+
                 if(m3 < 60) {
                     color_shift[i] = m1 + (m2 - m1) * m3 / 60;
                 } else if(m3 < 180) {
@@ -208,26 +208,26 @@ namespace Hyena.Gui
                     color_shift[i] = m1 + (m2 - m1) * (240 - m3) / 60;
                 } else {
                     color_shift[i] = m1;
-                }       
+                }
             }
-            
+
             return new Cairo.Color(color_shift[0], color_shift[1], color_shift[2]);
         }
-        
+
         public static Cairo.Color ColorShade (Cairo.Color @base, double ratio)
         {
             double h, s, b;
-            
+
             HsbFromColor (@base, out h, out s, out b);
-            
+
             b = Math.Max (Math.Min (b * ratio, 1), 0);
             s = Math.Max (Math.Min (s * ratio, 1), 0);
-            
+
             Cairo.Color color = ColorFromHsb (h, s, b);
             color.A = @base.A;
             return color;
         }
-        
+
         public static Cairo.Color ColorAdjustBrightness(Cairo.Color @base, double br)
         {
             double h, s, b;
@@ -235,14 +235,14 @@ namespace Hyena.Gui
             b = Math.Max(Math.Min(br, 1), 0);
             return ColorFromHsb(h, s, b);
         }
-        
+
         public static string ColorGetHex (Cairo.Color color, bool withAlpha)
         {
             if (withAlpha) {
-                return String.Format("#{0:x2}{1:x2}{2:x2}{3:x2}", (byte)(color.R * 255), (byte)(color.G * 255), 
+                return String.Format("#{0:x2}{1:x2}{2:x2}{3:x2}", (byte)(color.R * 255), (byte)(color.G * 255),
                     (byte)(color.B * 255), (byte)(color.A * 255));
             } else {
-                return String.Format("#{0:x2}{1:x2}{2:x2}", (byte)(color.R * 255), (byte)(color.G * 255), 
+                return String.Format("#{0:x2}{1:x2}{2:x2}", (byte)(color.R * 255), (byte)(color.G * 255),
                     (byte)(color.B * 255));
             }
         }
@@ -251,13 +251,13 @@ namespace Hyena.Gui
         {
             RoundedRectangle(cr, x, y, w, h, r, CairoCorners.All, false);
         }
-        
+
         public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h,
             double r, CairoCorners corners)
         {
             RoundedRectangle(cr, x, y, w, h, r, corners, false);
         }
-        
+
         public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h,
             double r, CairoCorners corners, bool topBottomFallsThrough)
         {
@@ -271,7 +271,7 @@ namespace Hyena.Gui
                 cr.Rectangle(x, y, w, h);
                 return;
             }
-            
+
             if((corners & (CairoCorners.TopLeft | CairoCorners.TopRight)) == 0 && topBottomFallsThrough) {
                 y -= r;
                 h += r;
@@ -282,14 +282,14 @@ namespace Hyena.Gui
                 } else {
                     cr.MoveTo(x, y);
                 }
-            
+
                 if((corners & CairoCorners.TopRight) != 0) {
                     cr.Arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2);
                 } else {
                     cr.LineTo(x + w, y);
                 }
             }
-            
+
             if((corners & (CairoCorners.BottomLeft | CairoCorners.BottomRight)) == 0 && topBottomFallsThrough) {
                 h += r;
                 cr.LineTo(x + w, y + h);
@@ -302,13 +302,13 @@ namespace Hyena.Gui
                 } else {
                     cr.LineTo(x + w, y + h);
                 }
-                
+
                 if((corners & CairoCorners.BottomLeft) != 0) {
                     cr.Arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI);
                 } else {
                     cr.LineTo(x, y + h);
                 }
-                
+
                 if((corners & CairoCorners.TopLeft) != 0) {
                     cr.Arc(x + r, y + r, r, Math.PI, Math.PI * 1.5);
                 } else {
@@ -322,13 +322,13 @@ namespace Hyena.Gui
             ((IDisposable)cr.Target).Dispose ();
             ((IDisposable)cr).Dispose ();
         }
-        
+
         private struct CairoInteropCall
         {
             public string Name;
             public MethodInfo ManagedMethod;
             public bool CallNative;
-            
+
             public CairoInteropCall (string name)
             {
                 Name = name;
@@ -336,40 +336,40 @@ namespace Hyena.Gui
                 CallNative = false;
             }
         }
-        
+
         private static bool CallCairoMethod (Cairo.Context cr, ref CairoInteropCall call)
         {
             if (call.ManagedMethod == null && !call.CallNative) {
-                MemberInfo [] members = typeof (Cairo.Context).GetMember (call.Name, MemberTypes.Method, 
+                MemberInfo [] members = typeof (Cairo.Context).GetMember (call.Name, MemberTypes.Method,
                     BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public);
-                
+
                 if (members != null && members.Length > 0 && members[0] is MethodInfo) {
                     call.ManagedMethod = (MethodInfo)members[0];
                 } else {
                     call.CallNative = true;
                 }
             }
-            
+
             if (call.ManagedMethod != null) {
                 call.ManagedMethod.Invoke (cr, null);
                 return true;
             }
-            
+
             return false;
         }
-        
+
         private static bool native_push_pop_exists = true;
-        
+
         [DllImport ("libcairo-2.dll")]
         private static extern void cairo_push_group (IntPtr ptr);
         private static CairoInteropCall cairo_push_group_call = new CairoInteropCall ("PushGroup");
-        
+
         public static void PushGroup (Cairo.Context cr)
         {
             if (!native_push_pop_exists) {
                 return;
             }
-            
+
             try {
                 if (!CallCairoMethod (cr, ref cairo_push_group_call)) {
                     cairo_push_group (cr.Handle);
@@ -378,17 +378,17 @@ namespace Hyena.Gui
                 native_push_pop_exists = false;
             }
         }
-        
+
         [DllImport ("libcairo-2.dll")]
         private static extern void cairo_pop_group_to_source (IntPtr ptr);
         private static CairoInteropCall cairo_pop_group_to_source_call = new CairoInteropCall ("PopGroupToSource");
-        
+
         public static void PopGroupToSource (Cairo.Context cr)
         {
             if (!native_push_pop_exists) {
                 return;
             }
-            
+
             try {
                 if (!CallCairoMethod (cr, ref cairo_pop_group_to_source_call)) {
                     cairo_pop_group_to_source (cr.Handle);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/CleanRoomStartup.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/CleanRoomStartup.cs
index c50d02e..9f96b51 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/CleanRoomStartup.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/CleanRoomStartup.cs
@@ -33,29 +33,29 @@ namespace Hyena.Gui
     public static class CleanRoomStartup
     {
         public delegate void StartupInvocationHandler();
-        
+
         public static void Startup(StartupInvocationHandler startup)
         {
             bool disable_clean_room = false;
-            
+
             foreach(string arg in Environment.GetCommandLineArgs ()) {
                 if(arg == "--disable-clean-room") {
                     disable_clean_room = true;
                     break;
                 }
             }
-            
+
             if(disable_clean_room) {
                 startup();
                 return;
             }
-            
+
             try {
                 startup();
             } catch(Exception e) {
                 Console.WriteLine(e.Message);
                 Console.WriteLine(e);
-            
+
                 Gtk.Application.Init();
                 Hyena.Gui.Dialogs.ExceptionDialog dialog = new Hyena.Gui.Dialogs.ExceptionDialog(e);
                 dialog.Run();
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/CompositeUtils.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
index 1b0c0d9..4d93bb8 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
@@ -33,18 +33,18 @@ using Gtk;
 
 namespace Hyena.Gui
 {
-    public static class CompositeUtils 
+    public static class CompositeUtils
     {
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern IntPtr gdk_screen_get_rgba_visual (IntPtr screen);
 
         [DllImport ("libgtk-win32-2.0-0.dll")]
-        private static extern void gtk_widget_input_shape_combine_mask (IntPtr raw, IntPtr shape_mask, 
+        private static extern void gtk_widget_input_shape_combine_mask (IntPtr raw, IntPtr shape_mask,
             int offset_x, int offset_y);
 
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern IntPtr gdk_screen_get_rgba_colormap (IntPtr screen);
-        
+
         public static Colormap GetRgbaColormap (Screen screen)
         {
             try {
@@ -58,10 +58,10 @@ namespace Hyena.Gui
                     return cmap;
                 }
             }
-            
+
             return null;
         }
-        
+
         public static bool SetRgbaColormap (Widget w)
         {
             Gdk.Colormap cmap = GetRgbaColormap (w.Screen);
@@ -73,7 +73,7 @@ namespace Hyena.Gui
 
             return false;
         }
-        
+
         public static Visual GetRgbaVisual (Screen screen)
         {
             try {
@@ -90,13 +90,13 @@ namespace Hyena.Gui
         }
 
         [DllImport ("libgdk-win32-2.0-0.dll")]
-        private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type, 
+        private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type,
             int format, int mode, uint [] data, int nelements);
 
         [DllImport ("libgdk-win32-2.0-0.dll")]
-        private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type, 
+        private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type,
             int format, int mode, byte [] data, int nelements);
-      
+
         public static void ChangeProperty (Gdk.Window win, Atom property, Atom type, PropMode mode, uint [] data)
         {
             gdk_property_change (win.Handle, property.Handle, type.Handle, 32, (int)mode,  data, data.Length * 4);
@@ -123,7 +123,7 @@ namespace Hyena.Gui
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern bool gdk_screen_is_composited (IntPtr screen);
 
-        public static bool IsComposited (Screen screen) 
+        public static bool IsComposited (Screen screen)
         {
             bool composited;
             try {
@@ -138,13 +138,13 @@ namespace Hyena.Gui
             if (!composited) {
                 composited = CompositeUtils.SupportsHint (screen, "_NET_WM_WINDOW_OPACITY");
             }
-            
+
             return composited;
         }
-        
+
         public static void SetWinOpacity (Gtk.Window win, double opacity)
         {
-            CompositeUtils.ChangeProperty (win.GdkWindow, 
+            CompositeUtils.ChangeProperty (win.GdkWindow,
                 Atom.Intern ("_NET_WM_WINDOW_OPACITY", false),
                 Atom.Intern ("CARDINAL", false),
                 PropMode.Replace,
@@ -154,7 +154,7 @@ namespace Hyena.Gui
 
         public static void InputShapeCombineMask (Widget w, Pixmap shape_mask, int offset_x, int offset_y)
         {
-            gtk_widget_input_shape_combine_mask (w.Handle, shape_mask == null ? IntPtr.Zero : shape_mask.Handle, 
+            gtk_widget_input_shape_combine_mask (w.Handle, shape_mask == null ? IntPtr.Zero : shape_mask.Handle,
                 offset_x, offset_y);
         }
     }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/Contrast.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/Contrast.cs
index 831eabd..3b86921 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/Contrast.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/Contrast.cs
@@ -37,7 +37,7 @@ namespace Hyena.Gui
      * but set the enum value to be at the end of the color_regions table
      * in contrast.c to maintain binary compatibility
      */
-    
+
     public enum ContrastPaletteColor
     {
         Aqua        =  0,
@@ -65,12 +65,12 @@ namespace Hyena.Gui
         Yellow      = 22,
         Last        = 23
     };
-    
+
     public static class Contrast
     {
-    
+
         /* Data for color palette optimization.
-         * 
+         *
          * These numbers are completely arbitrary decisions, uninformed by the experts
          * at crayola.  These colors are defined as boxes within the CIE L*a*b* color
          * space -- while they're not fully inclusive, they are "safe" in that anywhere
@@ -115,7 +115,7 @@ namespace Hyena.Gui
             const float a     = 0.055f;
             const float gamma = 2.4f;
 
-            
+
             if (K > 0.04045f)
                 return (float) Math.Pow((K + a) / (1 + a), gamma);
             else
@@ -133,23 +133,23 @@ namespace Hyena.Gui
         private static void rgb_to_lab(ushort R, ushort G, ushort B, out float L, out float a, out float b)
         {
             float x, y, z, gr, gg, gb, fy;
-            
+
             /* This is the reference white point.  Since we're treating "RGB" as
              * sRGB, this is the D65 point.
              */
-            
+
             const float Xn = 0.93819f;
             const float Yn = 0.98705f;
             const float Zn = 1.07475f;
-            
+
             gr = srgb_to_xyz_g(R / 65535.0f);
             gg = srgb_to_xyz_g(G / 65535.0f);
             gb = srgb_to_xyz_g(B / 65535.0f);
-            
+
             x = 0.412424f * gr + 0.357579f * gg + 0.180464f * gb;
             y = 0.212656f * gr + 0.715158f * gg + 0.072186f * gb;
             z = 0.019332f * gr + 0.119193f * gg + 0.950444f * gb;
-            
+
             fy = xyz_to_lab_f(y / Yn);
 
             L = 116.0f * fy - 16.0f;
@@ -162,7 +162,7 @@ namespace Hyena.Gui
             const float a     = 0.055f;
             const float gamma = 2.4f;
 
-            
+
             if (K > 0.00304f)
                 return (1.0f + a) * ((float) Math.Pow(K, (1.0f / gamma))) - a;
             else
@@ -170,19 +170,19 @@ namespace Hyena.Gui
         }
 
         private static void lab_to_rgb(float L, float a, float b, out ushort R, out ushort G, out ushort B)
-        {        
+        {
             float x, y, z, fy, fx, fz, delta, delta2, rs, gs, bs;
 
             const float Xn = 0.93819f;
             const float Yn = 0.98705f;
             const float Zn = 1.07475f;
-            
+
             fy = (L + 16.0f) / 116.0f;
             fx = fy + a / 500.0f;
             fz = fy - b / 200.0f;
             delta = 6.0f / 29.0f;
             delta2 = (float) Math.Pow(delta, 2.0f);
-            
+
             if (fx > delta)
                 x = Xn * ((float) Math.Pow(fx, 3.0f));
             else
@@ -193,13 +193,13 @@ namespace Hyena.Gui
             else
                 y = (fy - 16.0f/116.0f) * 3.0f * delta2 * Yn;
 
-            
+
             if (fz > delta)
                 z = Zn * ((float) Math.Pow(fz, 3.0f));
             else
                 z = (fz - 16.0f/116.0f) * 3.0f * delta2 * Zn;
 
-            
+
             rs =  3.2410f * x - 1.5374f * y - 0.4986f * z;
             gs = -0.9692f * x + 1.8760f * y + 0.0416f * z;
             bs =  0.0556f * x - 0.2040f * y + 1.0570f * z;
@@ -212,7 +212,7 @@ namespace Hyena.Gui
                 R = 65535;
             else
                 R = (ushort) tmp;
-            
+
             tmp = (float) Math.Floor(xyz_to_srgb_C(gs) * 65535.0f + 0.5f);
             if (tmp < 0.0f)
                 G = 0;
@@ -244,7 +244,7 @@ namespace Hyena.Gui
         /* Creates a specific color value for a foreground color, optimizing for
          * maximum readability against the background.
          */
-        
+
         public static Color RenderForegroundColor(Color background, ContrastPaletteColor color)
         {
             float L, a, b;
@@ -253,18 +253,18 @@ namespace Hyena.Gui
             float[,] points = new float[8,3];
             float ld, cd;
             int i;
-            
-            rgb_to_lab((ushort)(background.R * 255), (ushort)(background.G * 255), 
+
+            rgb_to_lab((ushort)(background.R * 255), (ushort)(background.G * 255),
                 (ushort)(background.B * 255), out L, out a, out b);
-            
+
             points[0,0] = color_regions[(int)color,0];
             points[0,1] = color_regions[(int)color,2];
             points[0,2] = color_regions[(int)color,4];
-            
+
             points[1,0] = color_regions[(int)color,0];
             points[1,1] = color_regions[(int)color,2];
             points[1,2] = color_regions[(int)color,5];
-            
+
             points[2,0] = color_regions[(int)color,0];
             points[2,1] = color_regions[(int)color,3];
             points[2,2] = color_regions[(int)color,4];
@@ -284,17 +284,17 @@ namespace Hyena.Gui
             points[6,0] = color_regions[(int)color,1];
             points[6,1] = color_regions[(int)color,3];
             points[6,2] = color_regions[(int)color,4];
-            
+
             points[7,0] = color_regions[(int)color,1];
             points[7,1] = color_regions[(int)color,3];
             points[7,2] = color_regions[(int)color,5];
-            
+
             max_dist = 0;
             max_color = 0;
-            
+
             for (i = 0; i < 8; i++) {
                 float dist = lab_distance(L, a, b, points[i,0], points[i,1], points[i,2]);
-                
+
                 if (dist > max_dist) {
                     max_dist = dist;
                     max_color = i;
@@ -306,13 +306,13 @@ namespace Hyena.Gui
              * is specified in, but it keeps things readable when the background and
              * foreground are really close.
              */
-            
+
             ld = Math.Abs(L - points[max_color,0]);
             cd = (float) Math.Sqrt (Math.Pow (Math.Abs (a - points[max_color,1]), 2.0f) + Math.Pow (Math.Abs (b - points[max_color,2]), 2.0f));
-            
+
             if ((ld < 10.0f) && (cd < 60.0f)) {
                 float dL, da, db;
-                
+
                 dL = points[max_color,0] - L;
                 da = points[max_color,1] - a;
                 db = points[max_color,2] - b;
@@ -322,9 +322,9 @@ namespace Hyena.Gui
             }
 
             ushort red, green, blue;
-            
+
             lab_to_rgb(points[max_color,0], points[max_color,1], points[max_color,2], out red, out green, out blue);
-            
+
             return new Color (red / 255.0, green / 255.0, blue / 255.0);
         }
     }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableEraseAction.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableEraseAction.cs
index 36008fe..e2883d4 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableEraseAction.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableEraseAction.cs
@@ -77,7 +77,7 @@ namespace Hyena.Gui
             }
         }
 
-        public bool CanMerge (IUndoAction action) 
+        public bool CanMerge (IUndoAction action)
         {
             EditableEraseAction erase = action as EditableEraseAction;
             if (erase == null) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableInsertAction.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableInsertAction.cs
index b39688f..d19a4e3 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableInsertAction.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableInsertAction.cs
@@ -66,7 +66,7 @@ namespace Hyena.Gui
             text += ((EditableInsertAction)action).text;
         }
 
-        public bool CanMerge (IUndoAction action) 
+        public bool CanMerge (IUndoAction action)
         {
             EditableInsertAction insert = action as EditableInsertAction;
             if (insert == null || String.IsNullOrEmpty (text)) {
@@ -78,7 +78,7 @@ namespace Hyena.Gui
                insert.index != index + text.Length ||          // Must meet eachother
                text[0] == '\n' ||                              // Don't group more than one line (inclusive)
                insert.text[0] == ' ' || insert.text[0] == '\t' // Don't group more than one word (exclusive)
-            ); 
+            );
         }
 
         public override string ToString ()
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableUndoAdapter.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableUndoAdapter.cs
index eeca006..fdd171d 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/EditableUndoAdapter.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/EditableUndoAdapter.cs
@@ -50,7 +50,7 @@ namespace Hyena.Gui
                 populate_popup_handler = new PopulatePopupHandler (OnPopulatePopup);
             }
         }
-        
+
         public void Connect ()
         {
             editable.KeyPressEvent += OnKeyPressEvent;
@@ -58,7 +58,7 @@ namespace Hyena.Gui
             editable.TextInserted += OnTextInserted;
             TogglePopupConnection (true);
         }
-        
+
         public void Disconnect ()
         {
             editable.KeyPressEvent -= OnKeyPressEvent;
@@ -66,7 +66,7 @@ namespace Hyena.Gui
             editable.TextInserted -= OnTextInserted;
             TogglePopupConnection (false);
         }
-        
+
         private void TogglePopupConnection (bool connect)
         {
             // Ugh, stupid Gtk+/Gtk# and lack of interfaces
@@ -124,8 +124,8 @@ namespace Hyena.Gui
             item = new ImageMenuItem (Stock.Redo, null);
             item.Sensitive = undo_manager.CanRedo;
             item.Activated += delegate { undo_manager.Redo (); };
-            item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z, 
-                Gdk.ModifierType.ControlMask | Gdk.ModifierType.ShiftMask, 
+            item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z,
+                Gdk.ModifierType.ControlMask | Gdk.ModifierType.ShiftMask,
                 AccelFlags.Visible);
             item.Show ();
             menu.Prepend (item);
@@ -133,12 +133,12 @@ namespace Hyena.Gui
             item = new ImageMenuItem (Stock.Undo, null);
             item.Sensitive = undo_manager.CanUndo;
             item.Activated += delegate { undo_manager.Undo (); };
-            item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z, 
+            item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z,
                 Gdk.ModifierType.ControlMask, AccelFlags.Visible);
             item.Show ();
             menu.Prepend (item);
         }
-        
+
         public UndoManager UndoManager {
             get { return undo_manager; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/GtkUtilities.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/GtkUtilities.cs
index 4b94c42..1fc246a 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/GtkUtilities.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/GtkUtilities.cs
@@ -1,4 +1,4 @@
-// 
+//
 // GtkUtilities.cs
 //
 // Author:
@@ -32,23 +32,23 @@ using Gtk;
 namespace Hyena.Gui
 {
     public delegate void WidgetAction<T> (T widget) where T : class;
-    
+
     public static class GtkUtilities
     {
         private static Gdk.ModifierType [] important_modifiers = new Gdk.ModifierType [] {
             Gdk.ModifierType.ControlMask,
             Gdk.ModifierType.ShiftMask
         };
-        
+
         public static bool NoImportantModifiersAreSet ()
         {
             return NoImportantModifiersAreSet (important_modifiers);
         }
-            
+
         public static bool NoImportantModifiersAreSet (params Gdk.ModifierType [] modifiers)
         {
             Gdk.ModifierType state;
-            
+
             if (Global.CurrentEvent is Gdk.EventKey) {
                 state = ((Gdk.EventKey)Global.CurrentEvent).State;
             } else if (Global.CurrentEvent is Gdk.EventButton) {
@@ -56,16 +56,16 @@ namespace Hyena.Gui
             } else {
                 return false;
             }
-            
+
             foreach (Gdk.ModifierType modifier in modifiers) {
                 if ((state & modifier) == modifier) {
                     return false;
                 }
             }
-            
+
             return true;
         }
-        
+
         public static FileFilter GetFileFilter (string name, System.Collections.Generic.IEnumerable<string> extensions)
         {
             FileFilter filter = new FileFilter ();
@@ -76,7 +76,7 @@ namespace Hyena.Gui
             }
             return filter;
         }
-        
+
         public static void SetChooserShortcuts (Gtk.FileChooserDialog chooser, params string [] shortcuts)
         {
             foreach (string shortcut in shortcuts) {
@@ -85,7 +85,7 @@ namespace Hyena.Gui
                 } catch {}
             }
         }
-        
+
         public static Gdk.Color ColorBlend (Gdk.Color a, Gdk.Color b)
         {
             // at some point, might be nice to allow any blend?
@@ -94,7 +94,7 @@ namespace Hyena.Gui
             if (blend < 0.0 || blend > 1.0) {
                 throw new ApplicationException ("blend < 0.0 || blend > 1.0");
             }
-            
+
             double blendRatio = 1.0 - blend;
 
             int aR = a.Red >> 8;
@@ -117,21 +117,21 @@ namespace Hyena.Gui
             Gdk.Colormap.System.AllocColor (ref color, true, true);
             return color;
         }
-        
-        public static void AdaptGtkRcStyle (Widget adaptee, Type adapter) 
+
+        public static void AdaptGtkRcStyle (Widget adaptee, Type adapter)
         {
             GLib.GType type = (GLib.GType)adapter;
             string path = String.Format ("*.{0}", type);
             AdaptGtkRcStyle (adaptee, type, path, path);
         }
-        
+
         public static void AdaptGtkRcStyle (Widget adaptee, GLib.GType adapter, string widgetPath, string classPath)
         {
             Style style = Gtk.Rc.GetStyleByPaths (adaptee.Settings, widgetPath, classPath, adapter);
             if (style == null) {
                 return;
             }
-            
+
             foreach (StateType state in Enum.GetValues (typeof (StateType))) {
                 adaptee.ModifyBase (state, style.Base (state));
                 adaptee.ModifyBg (state, style.Background (state));
@@ -139,19 +139,19 @@ namespace Hyena.Gui
                 adaptee.ModifyText (state, style.Text (state));
             }
         }
-        
+
         public static T StyleGetProperty<T> (Widget widget, string property, T default_value)
         {
             object result = widget.StyleGetProperty (property);
             return result != null && result.GetType () == typeof (T) ? (T)result : default_value;
         }
-        
+
         public static void ForeachWidget<T> (Container container, WidgetAction<T> action) where T : class
         {
             if (container == null) {
                 return;
             }
-            
+
             foreach (Widget child in container.Children) {
                 T widget = child as T;
                 if (widget != null) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/GtkWorkarounds.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/GtkWorkarounds.cs
index ddb055a..fc2b1a0 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/GtkWorkarounds.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/GtkWorkarounds.cs
@@ -37,55 +37,55 @@ namespace Hyena.Gui
         private static MethodInfo g_object_ref;
         private static MethodInfo gdk_window_destroy;
         private static object [] invoke_args;
-    
+
         static GtkWorkarounds ()
         {
             if (!(toggle_ref_supported = Assembly.GetAssembly (typeof (GLib.Object)).GetType (
                 "GLib.ToggleRef") != null)) {
                 return;
             }
-            
+
             // Find the P/Invoke signatures we need so we can avoid a dllmap
-            g_object_ref = typeof (GLib.Object).GetMethod ("g_object_ref", 
+            g_object_ref = typeof (GLib.Object).GetMethod ("g_object_ref",
                 BindingFlags.NonPublic | BindingFlags.Static);
-            
-            gdk_window_destroy = typeof (Gdk.Window).GetMethod ("gdk_window_destroy", 
+
+            gdk_window_destroy = typeof (Gdk.Window).GetMethod ("gdk_window_destroy",
                 BindingFlags.NonPublic | BindingFlags.Static);
         }
-        
+
         public static void WindowDestroy (Gdk.Window window)
         {
             // There is a bug in GDK, and subsequently in Gdk# 2.8.5 through 2.12.1
             // where the managed Gdk.Window.Destroy function does not obtain a
-            // normal reference (non-toggle) on the GdkWindow before calling 
+            // normal reference (non-toggle) on the GdkWindow before calling
             // _destroy on it, which the native function apparently expects.
-            
+
             // https://bugzilla.novell.com/show_bug.cgi?id=382186
             // http://anonsvn.mono-project.com/viewcvs/trunk/gtk-sharp/gdk/Window.custom?rev=101734&r1=42529&r2=101734
-        
+
             if (window == null) {
                 return;
-            } 
-            
+            }
+
             if (!toggle_ref_supported) {
                 window.Destroy ();
                 return;
             }
-            
+
             // If this ever happens I will move out west and start farming...
             if (g_object_ref == null || gdk_window_destroy == null) {
                 window.Destroy ();
                 return;
             }
-            
+
             if (invoke_args == null) {
                 invoke_args = new object[1];
             }
-            
+
             invoke_args[0] = window.Handle;
             g_object_ref.Invoke (null, invoke_args);
             gdk_window_destroy.Invoke (null, invoke_args);
-            
+
             window.Dispose ();
         }
     }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/PangoCairoHelper.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/PangoCairoHelper.cs
index 232d5ba..0de07ad 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/PangoCairoHelper.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/PangoCairoHelper.cs
@@ -35,43 +35,43 @@ namespace Hyena.Gui
     {
         [DllImport ("libpangocairo-1.0-0.dll")]
         private static extern void pango_cairo_show_layout (IntPtr cr, IntPtr layout);
-        
+
         public static void ShowLayout (Cairo.Context cr, Pango.Layout layout)
         {
-            pango_cairo_show_layout (cr == null ? IntPtr.Zero : cr.Handle, 
+            pango_cairo_show_layout (cr == null ? IntPtr.Zero : cr.Handle,
                 layout == null ? IntPtr.Zero : layout.Handle);
         }
-        
+
         [DllImport ("libpangocairo-1.0-0.dll")]
         private static extern IntPtr pango_cairo_create_layout (IntPtr cr);
 
-        public static Pango.Layout CreateLayout (Cairo.Context cr) 
+        public static Pango.Layout CreateLayout (Cairo.Context cr)
         {
             IntPtr raw_ret = pango_cairo_create_layout (cr == null ? IntPtr.Zero : cr.Handle);
             return GLib.Object.GetObject (raw_ret) as Pango.Layout;
         }
-        
+
         [DllImport ("libpangocairo-1.0-0.dll")]
         private static extern void pango_cairo_layout_path (IntPtr cr, IntPtr layout);
 
-        public static void LayoutPath (Cairo.Context cr, Pango.Layout layout, 
-            bool iUnderstandThePerformanceImplications) 
+        public static void LayoutPath (Cairo.Context cr, Pango.Layout layout,
+            bool iUnderstandThePerformanceImplications)
         {
-            pango_cairo_layout_path (cr == null ? IntPtr.Zero : cr.Handle, 
+            pango_cairo_layout_path (cr == null ? IntPtr.Zero : cr.Handle,
                 layout == null ? IntPtr.Zero : layout.Handle);
         }
-        
+
         [DllImport ("libpangocairo-1.0-0.dll")]
         private static extern void pango_cairo_context_set_resolution (IntPtr pango_context, double dpi);
-        
+
         public static void ContextSetResolution (Pango.Context context, double dpi)
         {
             pango_cairo_context_set_resolution (context == null ? IntPtr.Zero : context.Handle, dpi);
         }
-        
+
         [DllImport ("libpangocairo-1.0-0.dll")]
         private static extern IntPtr pango_layout_get_context (IntPtr layout);
-        
+
         public static Pango.Context LayoutGetContext (Pango.Layout layout)
         {
             IntPtr handle = pango_layout_get_context (layout.Handle);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/PixbufImageSurface.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/PixbufImageSurface.cs
index 22311e3..09c13ac 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/PixbufImageSurface.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/PixbufImageSurface.cs
@@ -36,16 +36,16 @@ namespace Hyena.Gui
     public class PixbufImageSurface : ImageSurface, IDisposable
     {
         private delegate void cairo_destroy_func_t (IntPtr userdata);
-    
+
         private static bool is_le = BitConverter.IsLittleEndian;
         private static int user_data_key = 0;
         private static cairo_destroy_func_t destroy_func;
-               
+
         private static void DestroyPixelData (IntPtr data)
         {
             Marshal.FreeHGlobal (data);
         }
-        
+
         static PixbufImageSurface ()
         {
             destroy_func = new cairo_destroy_func_t (DestroyPixelData);
@@ -87,46 +87,46 @@ namespace Hyena.Gui
                 return target;
             }
         }
-        
+
         private IntPtr data;
-        
+
         public PixbufImageSurface (Gdk.Pixbuf pixbuf) : this (pixbuf, false)
         {
         }
-        
-        public PixbufImageSurface (Gdk.Pixbuf pixbuf, bool disposePixbuf) : this (disposePixbuf ? pixbuf : null, 
+
+        public PixbufImageSurface (Gdk.Pixbuf pixbuf, bool disposePixbuf) : this (disposePixbuf ? pixbuf : null,
             pixbuf.Width, pixbuf.Height, pixbuf.NChannels, pixbuf.Rowstride, pixbuf.Pixels)
         {
         }
-        
+
         // This ctor is to avoid multiple queries against the GdkPixbuf for width/height
-        private PixbufImageSurface (Gdk.Pixbuf pixbuf, int width, int height, int channels, int rowstride, IntPtr pixels) 
+        private PixbufImageSurface (Gdk.Pixbuf pixbuf, int width, int height, int channels, int rowstride, IntPtr pixels)
             : this (pixbuf, Marshal.AllocHGlobal (width * height * 4), width, height, channels, rowstride, pixels)
         {
         }
-        
-        private PixbufImageSurface (Gdk.Pixbuf pixbuf, IntPtr data, int width, int height, int channels, int rowstride, IntPtr pixels) 
+
+        private PixbufImageSurface (Gdk.Pixbuf pixbuf, IntPtr data, int width, int height, int channels, int rowstride, IntPtr pixels)
             : base (data, channels == 3 ? Format.Rgb24 : Format.Argb32, width, height, width * 4)
         {
             this.data = data;
-            
+
             CreateSurface (width, height, channels, rowstride, pixels);
             SetDestroyFunc ();
-            
+
             if (pixbuf != null && pixbuf.Handle != IntPtr.Zero) {
                 pixbuf.Dispose ();
             }
         }
-        
+
         private unsafe void CreateSurface (int width, int height, int channels, int gdk_rowstride, IntPtr pixels)
         {
             byte *gdk_pixels = (byte *)pixels;
             byte *cairo_pixels = (byte *)data;
-            
+
             for (int i = height; i > 0; i--) {
                 byte *p = gdk_pixels;
                 byte *q = cairo_pixels;
-                
+
                 if (channels == 3) {
                     byte *end = p + 3 * width;
                     while (p < end) {
@@ -139,7 +139,7 @@ namespace Hyena.Gui
                             q[2] = p[1];
                             q[3] = p[2];
                         }
-                    
+
                         p += 3;
                         q += 4;
                     }
@@ -157,27 +157,27 @@ namespace Hyena.Gui
                             q[2] = Mult (p[1], p[3]);
                             q[3] = Mult (p[2], p[3]);
                         }
-                        
+
                         p += 4;
                         q += 4;
                     }
                 }
-                
+
                 gdk_pixels += gdk_rowstride;
                 cairo_pixels += 4 * width;
             }
         }
-        
+
         private static byte Mult (byte c, byte a)
         {
-            int t = c * a + 0x7f; 
+            int t = c * a + 0x7f;
             return (byte)(((t >> 8) + t) >> 8);
         }
-        
+
         [DllImport ("libcairo-2.dll")]
-        private static extern Cairo.Status cairo_surface_set_user_data (IntPtr surface, 
+        private static extern Cairo.Status cairo_surface_set_user_data (IntPtr surface,
             ref int key, IntPtr userdata, cairo_destroy_func_t destroy);
-            
+
         private void SetDestroyFunc ()
         {
             try {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/RatingRenderer.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/RatingRenderer.cs
index 3e8dca5..8ee9ad6 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/RatingRenderer.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/RatingRenderer.cs
@@ -34,7 +34,7 @@ namespace Hyena.Gui
 {
     public class RatingRenderer
     {
-        private static double [,] star_plot = new double[,] { 
+        private static double [,] star_plot = new double[,] {
             { 0, 0.425 },
             { 0.375, 0.375 },
             { 0.5, 0.05 },
@@ -51,33 +51,33 @@ namespace Hyena.Gui
         public RatingRenderer ()
         {
         }
-        
+
         public virtual void Render (Context cr, Gdk.Rectangle area, Color color, bool showEmptyStars, bool isHovering,
             int hoverValue, double fillOpacity, double hoverFillOpacity, double strokeOpacity)
         {
             if (Value == MinRating && !isHovering && !showEmptyStars) {
                 return;
             }
-            
+
             Cairo.Color fill_color = color;
             fill_color.A = fillOpacity;
             Cairo.Color stroke_color = fill_color;
             stroke_color.A = strokeOpacity;
             Cairo.Color hover_fill_color = fill_color;
             hover_fill_color.A = hoverFillOpacity;
-                
+
             double x, y;
             ComputePosition (area, out x, out y);
-            
+
             cr.LineWidth = 1.0;
             cr.Translate (0.5, 0.5);
-                    
+
             for (int i = MinRating + 1, s = isHovering || showEmptyStars ? MaxRating : Value; i <= s; i++, x += Size) {
                 bool fill = i <= Value && Value > MinRating;
                 bool hover_fill = i <= hoverValue && hoverValue > MinRating;
                 double scale = fill || hover_fill ? Size : Size - 2;
                 double ofs = fill || hover_fill ? 0 : 1;
-                    
+
                 for (int p = 0, n = star_plot.GetLength (0); p < n; p++) {
                     double px = x + ofs + star_plot[p, 0] * scale;
                     double py = y + ofs + star_plot[p, 1] * scale;
@@ -88,7 +88,7 @@ namespace Hyena.Gui
                     }
                 }
                 cr.ClosePath ();
-                
+
                 if (fill || hover_fill) {
                     if (!isHovering || hoverValue >= Value) {
                         cr.Color = fill ? fill_color : hover_fill_color;
@@ -102,80 +102,80 @@ namespace Hyena.Gui
                 }
             }
         }
-        
+
         private void ComputePosition (Gdk.Rectangle area, out double x, out double y)
         {
             double cell_width = area.Width - 2 * Xpad;
             double cell_height = area.Height - 2 * Ypad;
-            
+
             double stars_width = MaxRating * Size;
             double stars_height = Size;
-            
+
             x = area.X + Xpad + (cell_width - stars_width) / 2.0;
             y = area.Y + Ypad + (cell_height - stars_height) / 2.0;
         }
-        
+
         public int RatingFromPosition (Gdk.Rectangle area, double x)
         {
             double r_x, r_y;
             ComputePosition (area, out r_x, out r_y);
             return x <= r_x ? 0 : Clamp (MinRating, MaxRating, (int)Math.Ceiling ((x - r_x) / Size) + MinRating);
         }
-        
+
         private static int Clamp (int min, int max, int value)
         {
             return Math.Max (min, Math.Min (max, value));
         }
-        
+
         public int ClampValue (int value)
         {
             return Clamp (MinRating, MaxRating, value);
         }
-        
+
         private int value;
         public int Value {
             get { return ClampValue (this.value); }
             set { this.value = ClampValue (value); }
         }
-        
+
         private int size = 14;
         public int Size {
             get { return size; }
             set { size = value; }
         }
-        
+
         private int min_rating = 0;
         public int MinRating {
             get { return min_rating; }
             set { min_rating = value; }
         }
-        
+
         private int max_rating = 5;
         public int MaxRating {
             get { return max_rating; }
             set { max_rating = value; }
         }
-        
+
         public int RatingLevels {
             get { return MaxRating - MinRating + 1; }
         }
-        
+
         private int xpad = 2;
         public int Xpad {
             get { return xpad; }
             set { xpad = value; }
         }
-        
+
         public int ypad = 2;
         public int Ypad {
             get { return ypad; }
             set { ypad = value; }
         }
-        
+
         public int Width {
             get { return Xpad * 2 + RatingLevels * Size; }
         }
-        
+
         public int Height {
             get { return Ypad * 2 + Size; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
index a4429c6..d82d67b 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
@@ -34,38 +34,38 @@ namespace Hyena.Gui
     public class ShadingTestWindow : Window
     {
         private int steps = 16;
-    
+
         public ShadingTestWindow () : base ("Shading Test")
         {
             SetSizeRequest (512, 512);
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-            
+
             double step_width = Allocation.Width / (double)steps;
             double step_height = Allocation.Height / (double)steps;
             double h = 1.0;
             double s = 0.0;
-            
+
             for (int xi = 0, i = 0; xi < steps; xi++) {
                 for (int yi = 0; yi < steps; yi++, i++) {
                     double bg_b = (double)(i / 255.0);
                     double fg_b = 1.0 - bg_b;
-                    
+
                     double x = Allocation.X + xi * step_width;
                     double y = Allocation.Y + yi * step_height;
-                
+
                     cr.Rectangle (x, y, step_width, step_height);
                     cr.Color = CairoExtensions.ColorFromHsb (h, s, bg_b);
                     cr.Fill ();
-                    
+
                     int tw, th;
                     Pango.Layout layout = new Pango.Layout (PangoContext);
                     layout.SetText (((int)(bg_b * 255.0)).ToString ());
                     layout.GetPixelSize (out tw, out th);
-                    
+
                     cr.Translate (0.5, 0.5);
                     cr.MoveTo (x + (step_width - tw) / 2.0, y + (step_height - th) / 2.0);
                     cr.Color = CairoExtensions.ColorFromHsb (h, s, fg_b);
@@ -73,7 +73,7 @@ namespace Hyena.Gui
                     cr.Translate (-0.5, -0.5);
                 }
             }
-            
+
             CairoExtensions.DisposeContext (cr);
             return true;
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleAttribute.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleAttribute.cs
index cc04904..6b24d9b 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleAttribute.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleAttribute.cs
@@ -33,12 +33,12 @@ namespace Hyena.Gui
     internal class TestModuleAttribute : Attribute
     {
         private string name;
-        public string Name {    
+        public string Name {
             get { return name; }
             set { name = value; }
         }
-        
-        public TestModuleAttribute (string name) 
+
+        public TestModuleAttribute (string name)
         {
             this.name = name;
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleRunner.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleRunner.cs
index ad63679..35c1cbc 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleRunner.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/TestModuleRunner.cs
@@ -42,37 +42,37 @@ namespace Hyena.Gui
             runner.ShowAll ();
             Application.Run ();
         }
-    
+
         private TreeStore store;
-    
+
         public TestModuleRunner () : base ("Hyena.Gui Module Tester")
         {
             SetSizeRequest (-1, 300);
             Move (100, 100);
-            
+
             BuildModuleList ();
             BuildView ();
         }
-        
+
         private void BuildModuleList ()
         {
             store = new TreeStore (typeof (string), typeof (Type));
-            
+
             foreach (Type type in Assembly.GetExecutingAssembly ().GetTypes ()) {
                 foreach (TestModuleAttribute attr in type.GetCustomAttributes (typeof (TestModuleAttribute), false)) {
                     store.AppendValues (attr.Name, type);
                 }
             }
         }
-        
+
         private void BuildView ()
         {
             VBox box = new VBox ();
             Add (box);
-            
+
             ScrolledWindow sw = new ScrolledWindow ();
             sw.HscrollbarPolicy = PolicyType.Never;
-            
+
             TreeView view = new TreeView ();
             view.RowActivated += delegate (object o, RowActivatedArgs args) {
                 TreeIter iter;
@@ -86,15 +86,15 @@ namespace Hyena.Gui
             };
             view.Model = store;
             view.AppendColumn ("Module", new CellRendererText (), "text", 0);
-            
+
             sw.Add (view);
             box.PackStart (sw, true, true, 0);
             sw.ShowAll ();
-            
+
             Button button = new Button (Stock.Quit);
             button.Clicked += delegate { Destroy (); Application.Quit (); };
             box.PackStart (button, false, false, 0);
-            
+
             box.ShowAll ();
         }
     }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Gui/TooltipSetter.cs b/src/Libraries/Hyena.Gui/Hyena.Gui/TooltipSetter.cs
index 915f78d..48323e7 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Gui/TooltipSetter.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Gui/TooltipSetter.cs
@@ -39,15 +39,15 @@ namespace Hyena.Gui
         private static MethodInfo host_set_tip_method;
         private static PropertyInfo tooltip_text_property;
         private static bool reflected;
-    
+
         public static object CreateHost ()
         {
             if (tooltip_text_property != null) {
                 return null;
-            } 
-            
+            }
+
             Type type = reflected ? null : typeof (Widget);
-            
+
             if (type != null) {
                 tooltip_text_property = type.GetProperty ("TooltipText", BindingFlags.Instance | BindingFlags.Public);
                 if (tooltip_text_property != null) {
@@ -55,24 +55,24 @@ namespace Hyena.Gui
                     return null;
                 }
             }
-            
+
             if (host_set_tip_method == null && !reflected) {
                 reflected = true;
                 host_type = Type.GetType (String.Format ("Gtk.Tooltips, {0}", type.Assembly.FullName));
                 if (type == null) {
                     return null;
                 }
-                
-                host_set_tip_method = host_type.GetMethod ("SetTip", BindingFlags.Instance | 
+
+                host_set_tip_method = host_type.GetMethod ("SetTip", BindingFlags.Instance |
                     BindingFlags.Public | BindingFlags.InvokeMethod);
                 if (host_set_tip_method == null) {
                     return null;
                 }
             }
-            
+
             return host_set_tip_method != null ? Activator.CreateInstance (host_type) : null;
         }
-        
+
         public static void Set (object host, Widget widget, string textTip)
         {
             if (tooltip_text_property != null) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
index f03f79c..ba9ea15 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
@@ -71,7 +71,7 @@ namespace Hyena.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 spin_button.ValueChanged -= HandleValueChanged;
                 combo.Changed -= HandleValueChanged;
                 query_value = value as FileSizeQueryValue;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/IntegerQueryValueEntry.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/IntegerQueryValueEntry.cs
index 95560f3..f4ed1a9 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/IntegerQueryValueEntry.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/IntegerQueryValueEntry.cs
@@ -50,7 +50,7 @@ namespace Hyena.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 spin_button.ValueChanged -= HandleValueChanged;
                 query_value = value as IntegerQueryValue;
                 spin_button.SetRange (query_value.MinValue, query_value.MaxValue);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
index 207fa14..0fe4562 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
@@ -75,7 +75,7 @@ namespace Hyena.Query.Gui
             Alignment matchesAlignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
             matchesAlignment.SetPadding (5, 5, 5, 5);
             matchesAlignment.Add (terms_box);
-        
+
             matchesFrame = new Frame (null);
             matchesFrame.Add (matchesAlignment);
             matchesFrame.LabelWidget = BuildMatchHeader ();
@@ -100,27 +100,27 @@ namespace Hyena.Query.Gui
         {
             HBox header = new HBox ();
             header.Show ();
-            
+
             terms_enabled_checkbox = new CheckButton (Catalog.GetString ("_Match"));
             terms_enabled_checkbox.Show ();
             terms_enabled_checkbox.Active = true;
             terms_enabled_checkbox.Toggled += OnMatchCheckBoxToggled;
             header.PackStart (terms_enabled_checkbox, false, false, 0);
-            
+
             terms_logic_combo = ComboBox.NewText ();
             terms_logic_combo.AppendText (Catalog.GetString ("all"));
             terms_logic_combo.AppendText (Catalog.GetString ("any"));
             terms_logic_combo.Show ();
             terms_logic_combo.Active = 0;
             header.PackStart (terms_logic_combo, false, false, 0);
-            
+
             terms_label = new Label (Catalog.GetString ("of the following:"));
             terms_label.Show ();
             terms_label.Xalign = 0.0f;
             header.PackStart (terms_label, true, true, 0);
-            
+
             header.Spacing = 5;
-            
+
             return header;
         }
 
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryDebugger.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryDebugger.cs
index d2643b1..df8060e 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryDebugger.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryDebugger.cs
@@ -43,13 +43,13 @@ namespace Hyena.Query.Gui
         private TextView input;
         private TextView sql;
         private TextView xml;
-        
+
         private QueryFieldSet query_field_set;
-    
+
         public QueryDebugger () : base ("Hyena.Query Debugger")
         {
             SetDefaultSize (800, 600);
-            
+
             VBox input_box = new VBox ();
             input_box.Spacing = 8;
             ScrolledWindow sw = new ScrolledWindow ();
@@ -71,7 +71,7 @@ namespace Hyena.Query.Gui
             parse.Clicked += OnParseUserQuery;
             button_box.PackStart (parse, false, false, 0);
             input_box.PackStart (button_box, false, false, 0);
-            
+
             HBox output_box = new HBox ();
             output_box.Spacing = 8;
             sw = new ScrolledWindow ();
@@ -88,20 +88,20 @@ namespace Hyena.Query.Gui
             xml.WrapMode = WrapMode.Word;
             sw.Add (xml);
             output_box.PackStart (sw, true, true, 0);
-            
+
             VPaned pane = new VPaned ();
             pane.Add1 (input_box);
             pane.Add2 (output_box);
             pane.Position = 100;
-            
+
             Add (pane);
             pane.ShowAll ();
-            
+
             input.HasFocus = true;
-            
+
             LoadQueryFieldSet ();
         }
-        
+
         private void LoadQueryFieldSet ()
         {
             Assembly asm = Assembly.LoadFile ("Banshee.Services.dll");
@@ -109,23 +109,23 @@ namespace Hyena.Query.Gui
             FieldInfo f = t.GetField ("FieldSet", BindingFlags.Public | BindingFlags.Static);
             query_field_set = (QueryFieldSet)f.GetValue (null);
         }
-        
+
         private StreamReader StringToStream (string s)
         {
             return new StreamReader (new MemoryStream (System.Text.Encoding.UTF8.GetBytes (s)));
         }
-        
+
         private void OnParseUserQuery (object o, EventArgs args)
         {
             UserQueryParser parser = new UserQueryParser ();
             parser.InputReader = StringToStream (input.Buffer.Text);
             QueryNode node = parser.BuildTree (query_field_set);
-            
+
             sql.Buffer.Text = node.ToSql (query_field_set) ?? String.Empty;
-            
+
             XmlDocument doc = new XmlDocument ();
             doc.LoadXml (node.ToXml (query_field_set));
-            
+
             MemoryStream s = new MemoryStream ();
             XmlTextWriter w = new XmlTextWriter (s, System.Text.Encoding.UTF8);
             w.Formatting = Formatting.Indented;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
index 6a1814a..545b9e3 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
@@ -54,21 +54,21 @@ namespace Hyena.Query.Gui
             this.limits = limits;
 
             Spacing = 5;
-            
+
             enabled_checkbox = new CheckButton (Catalog.GetString ("_Limit to"));
             enabled_checkbox.Toggled += OnEnabledToggled;
-            
+
             count_spin = new SpinButton (0, Double.MaxValue, 1);
             count_spin.Numeric = true;
             count_spin.Digits = 0;
             count_spin.Value = 25;
             count_spin.SetSizeRequest (60, -1);
-            
+
             limit_combo = ComboBox.NewText ();
             foreach (QueryLimit limit in limits) {
                 limit_combo.AppendText (limit.Label);
             }
-                
+
             order_combo = ComboBox.NewText ();
             order_combo.RowSeparatorFunc = IsRowSeparator;
             foreach (QueryOrder order in orders) {
@@ -84,7 +84,7 @@ namespace Hyena.Query.Gui
             PackStart (limit_combo, false, false, 0);
             PackStart (new Label (Catalog.GetString ("selected by")), false, false, 0);
             PackStart (order_combo, false, false, 0);
-                
+
             enabled_checkbox.Active = false;
             limit_combo.Active = 0;
             order_combo.Active = 0;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
index 917b620..f5413d7 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
@@ -84,17 +84,17 @@ namespace Hyena.Query.Gui
         {
             field_chooser = ComboBox.NewText ();
             field_chooser.Changed += HandleFieldChanged;
-            
+
             op_chooser = ComboBox.NewText ();
             op_chooser.RowSeparatorFunc = IsRowSeparator;
             op_chooser.Changed += HandleOperatorChanged;
-            
+
             value_box = new HBox ();
 
             remove_button = new Button (new Image ("gtk-remove", IconSize.Button));
             remove_button.Relief = ReliefStyle.None;
             remove_button.Clicked += OnButtonRemoveClicked;
-            
+
             add_button = new Button (new Image ("gtk-add", IconSize.Button));
             add_button.Relief = ReliefStyle.None;
             add_button.Clicked += OnButtonAddClicked;
@@ -123,7 +123,7 @@ namespace Hyena.Query.Gui
             value_box.ShowAll ();
             button_box.ShowAll ();
         }
-        
+
         private bool first = true;
         private void SetValueEntry (QueryValueEntry entry)
         {
@@ -187,7 +187,7 @@ namespace Hyena.Query.Gui
             op_chooser.Changed += HandleOperatorChanged;
             op_chooser.Active = 0;
         }
-        
+
         private void HandleOperatorChanged (object o, EventArgs args)
         {
             if (op_chooser.Active < 0 || op_chooser.Active >= operators.Count) {
@@ -201,26 +201,26 @@ namespace Hyena.Query.Gui
 
             //value_entry = new QueryValueEntry <field.ValueType> ();
         }
-        
+
         private void OnButtonAddClicked (object o, EventArgs args)
         {
             EventHandler handler = AddRequest;
             if (handler != null)
                 handler (this, new EventArgs ());
         }
-        
+
         private void OnButtonRemoveClicked (object o, EventArgs args)
         {
             EventHandler handler = RemoveRequest;
             if (handler != null)
                 handler (this, new EventArgs ());
         }
-        
+
         public bool CanDelete {
             get { return remove_button.Sensitive; }
             set { remove_button.Sensitive = value; }
         }
-        
+
         public QueryTermNode QueryNode {
             get {
                 QueryTermNode node = new QueryTermNode ();
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs
index c75be37..5a9949d 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs
@@ -48,7 +48,7 @@ namespace Hyena.Query.Gui
         public QueryTermBox FirstRow {
             get { return terms.Count > 0 ? terms[0] : null; }
         }
-        
+
         public QueryTermsBox (QueryFieldSet fieldSet) : base (1, 4, false)
         {
             // Sort the fields alphabetically by their label
@@ -117,13 +117,13 @@ namespace Hyena.Query.Gui
 
             return row;
         }
-        
+
         protected void OnRowAddRequest (object o, EventArgs args)
         {
             CreateRow (true);
             UpdateCanDelete ();
         }
-        
+
         protected void OnRowRemoveRequest (object o, EventArgs args)
         {
             RemoveRow (terms.IndexOf (o as QueryTermBox));
@@ -162,7 +162,7 @@ namespace Hyena.Query.Gui
             terms.Remove (row);
             UpdateCanDelete ();
         }
-        
+
         protected void UpdateCanDelete ()
         {
             if (FirstRow != null) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/StringQueryValueEntry.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/StringQueryValueEntry.cs
index d07b438..f3bd1c7 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/StringQueryValueEntry.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/StringQueryValueEntry.cs
@@ -48,7 +48,7 @@ namespace Hyena.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 entry.Changed -= HandleChanged;
                 query_value = value as StringQueryValue;
                 entry.Text = (query_value.Value as string) ?? String.Empty;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
index e543b72..0158ad1 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
@@ -72,7 +72,7 @@ namespace Hyena.Query.Gui
 
         public override QueryValue QueryValue {
             get { return query_value; }
-            set { 
+            set {
                 spin_button.ValueChanged -= HandleValueChanged;
                 combo.Changed -= HandleValueChanged;
 
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
index 1b4f7bd..da888ad 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
@@ -42,7 +42,7 @@ namespace Hyena.Widgets
         private readonly LinkedList<AnimatedWidget> children = new LinkedList<AnimatedWidget> ();
         private readonly SingleActorStage border_stage = new Hyena.Gui.Theatrics.SingleActorStage ();
         private readonly bool horizontal;
-        
+
         private uint duration = 500;
         private Easing easing = Easing.Linear;
         private Blocking blocking = Blocking.Upstage;
@@ -52,13 +52,13 @@ namespace Hyena.Widgets
         private int start_spacing;
         private int end_spacing;
         private int active_count;
-        
+
         private int start_border;
         private int end_border;
         private double border_bias;
         private Easing border_easing;
         private AnimationState border_state;
-        
+
         protected AnimatedBox (bool horizontal)
         {
             WidgetFlags |= WidgetFlags.NoWindow;
@@ -66,13 +66,13 @@ namespace Hyena.Widgets
             stage.ActorStep += OnActorStep;
             border_stage.Iteration += OnBorderIteration;
         }
-        
+
 #region Private
-        
+
         private double Percent {
             get { return border_stage.Actor.Percent * border_bias + (1.0 - border_bias); }
         }
-        
+
         private bool OnActorStep (Actor<AnimatedWidget> actor)
         {
             switch (actor.Target.AnimationState) {
@@ -98,10 +98,10 @@ namespace Hyena.Widgets
                 }
                 break;
             }
-            
+
             return true;
         }
-        
+
         private void OnBorderIteration (object sender, EventArgs args)
         {
             if (border_stage.Actor == null) {
@@ -119,16 +119,16 @@ namespace Hyena.Widgets
             }
             QueueResizeNoRedraw ();
         }
-        
+
         private void OnWidgetDestroyed (object sender, EventArgs args)
         {
             RemoveCore ((AnimatedWidget)sender);
         }
-        
+
         private void RecalculateSpacings ()
         {
             int skip_count = 0;
-            
+
             foreach (AnimatedWidget animated_widget in Widgets) {
                 animated_widget.QueueResizeNoRedraw ();
                 if (skip_count > 1) {
@@ -136,14 +136,14 @@ namespace Hyena.Widgets
                     continue;
                 }
                 AnimatedWidget widget = animated_widget;
-                
+
                 if (skip_count == 0) {
                     widget.StartPadding = start_spacing;
                 } else {
                     skip_count--;
                 }
                 widget.EndPadding = end_spacing;
-                
+
                 if (widget.Node.Previous == null) {
                     while (true) {
                         widget.StartPadding = 0;
@@ -156,7 +156,7 @@ namespace Hyena.Widgets
                         skip_count++;
                     }
                 }
-                
+
                 if (widget.Node.Next == null) {
                     while (true) {
                         widget.EndPadding = 0;
@@ -170,27 +170,27 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region Protected Overrides
-        
+
         protected override void OnAdded (Widget widget)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             int width = 0;
             int height = 0;
-            
+
             if (horizontal) {
                 width = start_border + end_border;
             } else {
                 height = start_border + end_border;
             }
-            
+
             foreach (AnimatedWidget widget in Widgets) {
                 Requisition req = widget.SizeRequest ();
                 if (horizontal) {
@@ -201,7 +201,7 @@ namespace Hyena.Widgets
                     height += req.Height;
                 }
             }
-            
+
             requisition.Width = width;
             requisition.Height = height;
         }
@@ -218,7 +218,7 @@ namespace Hyena.Widgets
                 allocation.Y += start_border;
                 allocation.Width -= (int)BorderWidth * 2;
             }
-            
+
             foreach (AnimatedWidget widget in Widgets) {
                 if (horizontal) {
                     allocation.Width = widget.Width;
@@ -231,35 +231,35 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         protected override void ForAll (bool include_internals, Callback callback)
         {
             foreach (AnimatedWidget child in Widgets) {
                 callback (child);
             }
         }
-        
+
 #endregion
-        
+
 #region Public
-                
+
 #region Properties
-        
+
         public uint Duration {
             get { return duration; }
             set { duration = value; }
         }
-        
+
         public Easing Easing {
             get { return easing; }
             set { easing = value; }
         }
-        
+
         public Blocking Blocking {
             get { return blocking; }
             set { blocking = value; }
         }
-        
+
         public int Spacing {
             get { return spacing; }
             set {
@@ -269,17 +269,17 @@ namespace Hyena.Widgets
                 end_spacing = (int)Math.Floor (half);
             }
         }
-        
+
         public int StartPadding {
             get { return start_padding - (int)BorderWidth; }
             set { start_padding = value + (int)BorderWidth; }
         }
-        
+
         public int EndPadding {
             get { return end_padding - (int)BorderWidth; }
             set { end_padding = value + (int)BorderWidth; }
         }
-        
+
         internal IEnumerable<AnimatedWidget> Widgets {
             get {
                 foreach (AnimatedWidget child in children) {
@@ -287,105 +287,105 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
 #endregion
-    
+
 #region Pack Methods
-        
+
         public void PackStart (Widget widget)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, uint duration)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, Easing easing)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, uint duration, Easing easing)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, Blocking blocking)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, uint duration, Blocking blocking)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, Easing easing, Blocking blocking)
         {
             PackStart (widget, duration, easing, blocking);
         }
-        
+
         public void PackStart (Widget widget, uint duration, Easing easing, Blocking blocking)
         {
             Pack (widget, duration, easing, blocking, false);
         }
-        
+
         public void PackEnd (Widget widget)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, uint duration)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, Easing easing)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, uint duration, Easing easing)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, Blocking blocking)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, uint duration, Blocking blocking)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, Easing easing, Blocking blocking)
         {
             PackEnd (widget, duration, easing, blocking);
         }
-        
+
         public void PackEnd (Widget widget, uint duration, Easing easing, Blocking blocking)
         {
             Pack (widget, duration, easing, blocking, true);
         }
-        
+
         private void Pack (Widget widget, uint duration, Easing easing, Blocking blocking, bool end)
         {
             if (widget == null) {
                 throw new ArgumentNullException ("widget");
             }
-            
+
             AnimatedWidget animated_widget = new AnimatedWidget (widget, duration, easing, blocking, horizontal);
             animated_widget.Parent = this;
             animated_widget.WidgetDestroyed += OnWidgetDestroyed;
             stage.Add (animated_widget, duration);
-            animated_widget.Node = end 
+            animated_widget.Node = end
                 ? children.AddLast (animated_widget)
                 : children.AddFirst (animated_widget);
-            
+
             RecalculateSpacings ();
             if (active_count == 0) {
                 if (border_state == AnimationState.Going) {
@@ -399,57 +399,57 @@ namespace Hyena.Widgets
             }
             active_count++;
         }
-        
+
 #endregion
-        
+
 #region Remove Methods
-        
+
         public new void Remove (Widget widget)
         {
             RemoveCore (widget, 0, 0, 0, false, false);
         }
-        
+
         public void Remove (Widget widget, uint duration)
         {
             RemoveCore (widget, duration, 0, 0, false, false);
         }
-        
+
         public void Remove (Widget widget, Easing easing)
         {
             RemoveCore (widget, 0, easing, 0, true, false);
         }
-        
+
         public void Remove (Widget widget, uint duration, Easing easing)
         {
             RemoveCore (widget, duration, easing, 0, true, false);
         }
-        
+
         public void Remove (Widget widget, Blocking blocking)
         {
             RemoveCore (widget, 0, 0, blocking, false, true);
         }
-        
+
         public void Remove (Widget widget, uint duration, Blocking blocking)
         {
             RemoveCore (widget, duration, 0, blocking, false, true);
         }
-        
+
         public void Remove (Widget widget, Easing easing, Blocking blocking)
         {
             RemoveCore (widget, 0, easing, blocking, true, true);
         }
-        
+
         public void Remove (Widget widget, uint duration, Easing easing, Blocking blocking)
         {
             RemoveCore (widget, duration, easing, blocking, true, true);
         }
-        
+
         private void RemoveCore (Widget widget, uint duration, Easing easing, Blocking blocking, bool use_easing, bool use_blocking)
         {
             if (widget == null) {
                 throw new ArgumentNullException ("widget");
             }
-            
+
             AnimatedWidget animated_widget = null;
             foreach (AnimatedWidget child in Widgets) {
                 if (child.Widget == widget) {
@@ -457,34 +457,34 @@ namespace Hyena.Widgets
                     break;
                 }
             }
-            
+
             if (animated_widget == null) {
                 throw new ArgumentException ("Cannot remove the specified widget because it has not been added to this container or it has already been removed.", "widget");
             }
-            
+
             RemoveCore (animated_widget, duration, easing, blocking, use_easing, use_blocking);
             RecalculateSpacings ();
         }
-        
+
         private void RemoveCore (AnimatedWidget widget)
         {
             RemoveCore (widget, widget.Duration, 0, 0, false, false);
         }
-        
+
         private void RemoveCore (AnimatedWidget widget, uint duration, Easing easing, Blocking blocking, bool use_easing, bool use_blocking)
         {
             if (duration > 0) {
                 widget.Duration = duration;
             }
-            
+
             if (use_easing) {
                 widget.Easing = easing;
             }
-            
+
             if (use_blocking) {
                 widget.Blocking = blocking;
             }
-        
+
             if (widget.AnimationState == AnimationState.Coming) {
                 widget.AnimationState = AnimationState.IntendingToGo;
             } else {
@@ -500,10 +500,10 @@ namespace Hyena.Widgets
                 widget.AnimationState = AnimationState.Going;
                 stage.Add (widget, widget.Duration);
             }
-            
+
             duration = widget.Duration;
             easing = widget.Easing;
-            
+
             active_count--;
             if (active_count == 0) {
                 if (border_state == AnimationState.Coming) {
@@ -516,7 +516,7 @@ namespace Hyena.Widgets
                 border_stage.Reset ((uint)(duration * border_bias));
             }
         }
-        
+
         public void RemoveAll ()
         {
             foreach (AnimatedWidget child in Widgets) {
@@ -526,9 +526,9 @@ namespace Hyena.Widgets
             }
             RecalculateSpacings ();
         }
-        
+
 #endregion
-        
+
         public bool Contains (Widget widget)
         {
             foreach (AnimatedWidget child in Widgets) {
@@ -538,8 +538,8 @@ namespace Hyena.Widgets
             }
             return false;
         }
-        
+
 #endregion
-        
+
     }
 }
\ No newline at end of file
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedImage.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedImage.cs
index 027e273..fe31d4c 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedImage.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedImage.cs
@@ -43,68 +43,68 @@ namespace Hyena.Widgets
         private int frame_height;
         private int max_frames;
         private bool active_frozen;
-        
+
         private SingleActorStage stage = new SingleActorStage ();
-        
+
         public AnimatedImage ()
         {
             stage.Iteration += OnIteration;
             stage.Reset ();
             stage.Actor.CanExpire = false;
         }
-        
+
         protected override void OnShown ()
         {
             base.OnShown ();
-            
+
             if (active_frozen && !stage.Playing) {
                 stage.Play ();
             }
         }
-        
+
         protected override void OnHidden ()
         {
             base.OnHidden ();
-            
+
             active_frozen = Active;
             if (stage.Playing) {
                 stage.Pause ();
             }
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             if (allocation != Allocation) {
                 base.OnSizeAllocated (allocation);
             }
         }
-        
+
         public void Load ()
         {
             ExtractFrames ();
             base.Pixbuf = frames[0];
         }
-        
+
         private void OnIteration (object o, EventArgs args)
         {
             if (!Visible) {
                 return;
             }
-            
+
             if (frames == null || frames.Length == 0) {
                 return;
             } else if (frames.Length == 1) {
                 base.Pixbuf = frames[0];
                 return;
             }
-            
+
             // The first frame is the idle frame, so skip it when animating
             int index = (int)Math.Round ((double)(frames.Length - 2) * stage.Actor.Percent) + 1;
             if (base.Pixbuf != frames[index]) {
                 base.Pixbuf = frames[index];
             }
         }
-        
+
         private void ExtractFrames ()
         {
             if (pixbuf == null) {
@@ -112,28 +112,28 @@ namespace Hyena.Widgets
             } else if (pixbuf.Width % frame_width != 0 || pixbuf.Height % frame_height != 0) {
                 throw new ApplicationException ("Invalid frame dimensions");
             }
-            
+
             int rows = pixbuf.Height / frame_height;
             int cols = pixbuf.Width / frame_width;
             int frame_count = rows * cols;
-            
+
             frames = new Gdk.Pixbuf[max_frames > 0 ? max_frames : frame_count];
-            
+
             for (int y = 0, n = 0; y < rows; y++) {
                 for (int x = 0; x < cols; x++, n++) {
-                    frames[n] = new Gdk.Pixbuf (pixbuf, x * frame_width, y * frame_height, 
+                    frames[n] = new Gdk.Pixbuf (pixbuf, x * frame_width, y * frame_height,
                         frame_width, frame_height);
-                    
+
                     if (max_frames > 0 && n >= max_frames - 1) {
                         return;
                     }
                 }
             }
         }
-        
+
         public bool Active {
             get { return !Visible ? active_frozen : stage.Playing; }
-            set { 
+            set {
                 if (value) {
                     active_frozen = true;
                     if (Visible) {
@@ -144,7 +144,7 @@ namespace Hyena.Widgets
                     if (stage.Playing) {
                         stage.Pause ();
                     }
-                    
+
                     if (inactive_pixbuf != null) {
                         base.Pixbuf = inactive_pixbuf;
                     } else if (frames != null && frames.Length > 1) {
@@ -155,27 +155,27 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         public int FrameWidth {
             get { return frame_width; }
             set { frame_width = value; }
         }
-        
+
         public int FrameHeight {
             get { return frame_height; }
             set { frame_height = value; }
         }
-        
+
         public int MaxFrames {
             get { return max_frames; }
             set { max_frames = value; }
         }
-        
+
         public new Gdk.Pixbuf Pixbuf {
             get { return pixbuf; }
             set { pixbuf = value; }
         }
-        
+
         public Gdk.Pixbuf InactivePixbuf {
             get { return inactive_pixbuf; }
             set {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
index a56b0e8..a77eadf 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
@@ -42,11 +42,11 @@ namespace Hyena.Widgets
         IntendingToGo,
         Going
     }
-    
+
     internal class AnimatedWidget : Container
     {
         public event EventHandler WidgetDestroyed;
-        
+
         public Widget Widget;
         public Easing Easing;
         public Blocking Blocking;
@@ -58,12 +58,12 @@ namespace Hyena.Widgets
         public int StartPadding;
         public int EndPadding;
         public LinkedListNode <AnimatedWidget> Node;
-        
+
         private readonly bool horizontal;
         private double percent;
         private Rectangle widget_alloc;
         private Pixmap canvas;
-        
+
         public AnimatedWidget (Widget widget, uint duration, Easing easing, Blocking blocking, bool horizontal)
         {
             this.horizontal = horizontal;
@@ -77,11 +77,11 @@ namespace Hyena.Widgets
             Widget.Destroyed += OnWidgetDestroyed;
             ShowAll ();
         }
-        
+
         protected AnimatedWidget (IntPtr raw) : base (raw)
         {
         }
-        
+
         public double Percent {
             get { return percent; }
             set {
@@ -89,24 +89,24 @@ namespace Hyena.Widgets
                 QueueResizeNoRedraw ();
             }
         }
-        
+
         private void OnWidgetDestroyed (object sender, EventArgs args)
         {
             if (!IsRealized) {
                 return;
             }
-            
+
             canvas = new Pixmap (GdkWindow, widget_alloc.Width, widget_alloc.Height);
             canvas.DrawDrawable (Style.BackgroundGC (State), GdkWindow,
                 widget_alloc.X, widget_alloc.Y, 0, 0, widget_alloc.Width, widget_alloc.Height);
-            
+
             if (AnimationState != AnimationState.Going) {
                 WidgetDestroyed (this, args);
             }
         }
-        
+
 #region Overrides
-        
+
         protected override void OnRemoved (Widget widget)
         {
             if (widget == Widget) {
@@ -114,22 +114,22 @@ namespace Hyena.Widgets
                 Widget = null;
             }
         }
-        
+
         protected override void OnRealized ()
         {
             WidgetFlags |= WidgetFlags.Realized;
-            
+
             Gdk.WindowAttr attributes = new Gdk.WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
             attributes.Wclass = Gdk.WindowClass.InputOutput;
             attributes.EventMask = (int)Gdk.EventMask.ExposureMask;
-                
+
             GdkWindow = new Gdk.Window (Parent.GdkWindow, attributes, 0);
             GdkWindow.UserData = Handle;
             GdkWindow.Background = Style.Background (State);
             Style.Attach (GdkWindow);
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             if (Widget != null) {
@@ -137,7 +137,7 @@ namespace Hyena.Widgets
                 widget_alloc.Width = req.Width;
                 widget_alloc.Height = req.Height;
             }
-            
+
             if (horizontal) {
                 Width = Choreographer.PixelCompose (percent, widget_alloc.Width + StartPadding + EndPadding, Easing);
                 Height = widget_alloc.Height;
@@ -145,11 +145,11 @@ namespace Hyena.Widgets
                 Width = widget_alloc.Width;
                 Height = Choreographer.PixelCompose (percent, widget_alloc.Height + StartPadding + EndPadding, Easing);
             }
-            
+
             requisition.Width = Width;
             requisition.Height = Height;
         }
-        
+
         protected override void OnSizeAllocated (Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
@@ -167,10 +167,13 @@ namespace Hyena.Widgets
                         widget_alloc.Y = allocation.Height - widget_alloc.Height;
                     }
                 }
-                Widget.SizeAllocate (widget_alloc);
+
+                if (widget_alloc.Height > 0 && widget_alloc.Width > 0) {
+                    Widget.SizeAllocate (widget_alloc);
+                }
             }
         }
-        
+
         protected override bool OnExposeEvent (EventExpose evnt)
         {
             if (canvas != null) {
@@ -188,8 +191,8 @@ namespace Hyena.Widgets
                 callback (Widget);
             }
         }
-        
+
 #endregion
-        
+
     }
-}
\ No newline at end of file
+}
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
index f9d046b..a6191fd 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
@@ -1,4 +1,4 @@
-// 
+//
 // ComplexMenuItem.cs
 //
 // Author:
@@ -54,7 +54,7 @@ namespace Hyena.Widgets
         protected override void OnRemoved (Widget widget)
         {
         }
-        
+
         protected void ConnectChildExpose(Widget widget)
         {
             widget.ExposeEvent += OnChildExposeEvent;
@@ -67,7 +67,7 @@ namespace Hyena.Widgets
             // into a GtkMenuItem without breaking the theme (leaving an unstyled void in the item).
             // This method is called before the EventBox child does its drawing and the background
             // is filled in with the proper style.
-            
+
             int x, y, width, height;
             Widget widget = (Widget)o;
 
@@ -76,17 +76,17 @@ namespace Hyena.Widgets
                 y = Allocation.Y - widget.Allocation.Y;
                 width = Allocation.Width;
                 height = Allocation.Height;
-                
+
                 ShadowType shadow_type = (ShadowType)StyleGetProperty("selected-shadow-type");
                 Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Prelight, shadow_type,
                     args.Event.Area, widget, "menuitem", x, y, width, height);
             } else {
                 // Fill only the visible area in solid color, to be most efficient
-                widget.GdkWindow.DrawRectangle(Parent.Style.BackgroundGC(StateType.Normal), 
+                widget.GdkWindow.DrawRectangle(Parent.Style.BackgroundGC(StateType.Normal),
                     true, 0, 0, widget.Allocation.Width, widget.Allocation.Height);
-               
-                // FIXME: The above should not be necessary, but Clearlooks-based themes apparently 
-                // don't provide any style for the menu background so we have to fill it first with 
+
+                // FIXME: The above should not be necessary, but Clearlooks-based themes apparently
+                // don't provide any style for the menu background so we have to fill it first with
                 // the correct theme color. Weak.
                 //
                 // Do a complete style paint based on the size of the entire menu to be compatible with
@@ -95,35 +95,35 @@ namespace Hyena.Widgets
                 y = Parent.Allocation.Y - widget.Allocation.Y;
                 width = Parent.Allocation.Width;
                 height = Parent.Allocation.Height;
-                
+
                 Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Normal, ShadowType.Out,
                     args.Event.Area, widget, "menu", x, y, width, height);
             }
         }
-        
+
         protected override void OnSelected()
         {
             base.OnSelected();
             is_selected = true;
         }
-        
+
         protected override void OnDeselected()
         {
             base.OnDeselected();
             is_selected = false;
         }
-        
+
         protected override void OnParentSet(Widget previous_parent)
         {
             if(previous_parent != null) {
                 previous_parent.KeyPressEvent -= OnKeyPressEventProxy;
             }
-            
+
             if(Parent != null) {
                 Parent.KeyPressEvent += OnKeyPressEventProxy;
             }
         }
-        
+
         [GLib.ConnectBefore]
         private void OnKeyPressEventProxy(object o, KeyPressEventArgs args)
         {
@@ -145,7 +145,7 @@ namespace Hyena.Widgets
         {
             return false;
         }
-        
+
         protected bool IsSelected {
             get { return is_selected; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs
index a3db0b0..9431b0a 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs
@@ -33,20 +33,32 @@ namespace Hyena.Widgets
 {
     public class ImageButton : Button
     {
+        private Image image;
+        private Label label;
+        private HBox hbox;
+
+        public Image ImageWidget { get { return image; } }
+        public Label LabelWidget { get { return label; } }
+
+        public uint InnerPadding {
+            get { return hbox.BorderWidth; }
+            set { hbox.BorderWidth = value; }
+        }
+
         public ImageButton (string text, string iconName) : this (text, iconName, Gtk.IconSize.Button)
         {
         }
-        
+
         public ImageButton (string text, string iconName, Gtk.IconSize iconSize) : base ()
         {
-            Image image = new Image ();
+            image = new Image ();
             image.IconName = iconName;
             image.IconSize = (int) iconSize;
 
-            Label label = new Label ();
+            label = new Label ();
             label.MarkupWithMnemonic = text;
 
-            HBox hbox = new HBox ();
+            hbox = new HBox ();
             hbox.Spacing = 2;
             hbox.PackStart (image, false, false, 0);
             hbox.PackStart (label, true, true, 0);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/MenuButton.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/MenuButton.cs
index fa25d84..138bb86 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/MenuButton.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/MenuButton.cs
@@ -40,32 +40,32 @@ namespace Hyena.Widgets
         private Widget button_widget;
         private Menu menu;
         private Widget size_widget;
-        
+
         public MenuButton ()
         {
         }
-        
+
         public MenuButton (Widget buttonWidget, Menu menu, bool showArrow)
         {
             Construct (buttonWidget, menu, showArrow);
         }
-        
+
         protected void Construct (Widget buttonWidget, Menu menu, bool showArrow)
         {
             WidgetFlags |= WidgetFlags.NoWindow;
-            
+
             button_widget = buttonWidget;
             this.menu = menu;
             menu.Deactivated += delegate { toggle_button.Active = false; };
-            
+
             toggle_button.Parent = this;
             toggle_button.FocusOnClick = false;
             toggle_button.Relief = ReliefStyle.None;
             toggle_button.Pressed += delegate { ShowMenu (); toggle_button.Active = true; };
             toggle_button.Activated += delegate { ShowMenu (); };
-            
+
             box.Parent = this;
-            
+
             if (showArrow) {
                 box.PackStart (button_widget, true, true, 0);
                 alignment = new Alignment (0f, 0.5f, 0f, 0f);
@@ -73,74 +73,75 @@ namespace Hyena.Widgets
                 alignment.Add (arrow);
                 box.PackStart (alignment, false, false, 5);
                 size_widget = box;
+                FocusChain = new Widget[] {toggle_button, box};
             } else {
                 toggle_button.Add (button_widget);
                 size_widget = toggle_button;
             }
-            
+
             ShowAll ();
         }
-        
+
         public Widget ButtonWidget {
             get { return button_widget; }
         }
-        
+
         public Menu Menu {
             get { return menu; }
         }
-        
+
         protected ToggleButton ToggleButton {
             get { return toggle_button; }
         }
-        
+
         protected Arrow Arrow {
             get { return arrow; }
         }
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             requisition = size_widget.SizeRequest ();
         }
-        
+
         protected override void OnSizeAllocated (Rectangle allocation)
         {
             box.SizeAllocate (allocation);
             toggle_button.SizeAllocate (allocation);
             base.OnSizeAllocated (allocation);
         }
-        
+
         protected override void ForAll (bool include_internals, Callback callback)
         {
             callback (toggle_button);
             callback (box);
         }
-        
+
         protected override void OnAdded (Widget widget)
         {
         }
-        
+
         protected override void OnRemoved (Widget widget)
         {
         }
-        
+
         protected void ShowMenu ()
         {
             menu.Popup (null, null, PositionMenu, 1, Gtk.Global.CurrentEventTime);
         }
 
-        private void PositionMenu (Menu menu, out int x, out int y, out bool push_in) 
+        private void PositionMenu (Menu menu, out int x, out int y, out bool push_in)
         {
             Gtk.Requisition menu_req = menu.SizeRequest ();
             int monitor_num = Screen.GetMonitorAtWindow (GdkWindow);
             Gdk.Rectangle monitor = Screen.GetMonitorGeometry (monitor_num < 0 ? 0 : monitor_num);
 
             GdkWindow.GetOrigin (out x, out y);
-            
+
             y += Allocation.Y;
             x += Allocation.X + (Direction == TextDirection.Ltr
                 ? Math.Max (Allocation.Width - menu_req.Width, 0)
                 : - (menu_req.Width - Allocation.Width));
-            
+
             if (y + Allocation.Height + menu_req.Height <= monitor.Y + monitor.Height) {
                 y += Allocation.Height;
             } else if (y - menu_req.Height >= monitor.Y) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/MessageBar.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/MessageBar.cs
index 8ea5c31..1934697 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/MessageBar.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/MessageBar.cs
@@ -35,22 +35,22 @@ using Hyena.Gui.Theming;
 namespace Hyena.Widgets
 {
     public class MessageBar : Alignment
-    {   
+    {
         private HBox box;
         private HBox button_box;
         private AnimatedImage image;
-        private Label label;
+        private WrapLabel label;
         private Button close_button;
 
         private Window win;
-        
+
         private Theme theme;
-        
+
         public event EventHandler CloseClicked {
             add { close_button.Clicked += value; }
             remove { close_button.Clicked -= value; }
         }
-        
+
         public MessageBar () : base (0.0f, 0.5f, 1.0f, 0.0f)
         {
             win = new Window (WindowType.Popup);
@@ -62,10 +62,10 @@ namespace Hyena.Widgets
 
             HBox shell_box = new HBox ();
             shell_box.Spacing = 10;
-        
+
             box = new HBox ();
             box.Spacing = 10;
-            
+
             image = new AnimatedImage ();
             try {
                 image.Pixbuf = Gtk.IconTheme.Default.LoadIcon ("process-working", 22, IconLookupFlags.NoSvg);
@@ -75,68 +75,67 @@ namespace Hyena.Widgets
                 image.Load ();
             } catch {
             }
-            
-            label = new Label ();
-            label.Xalign = 0.0f;
+
+            label = new WrapLabel ();
             label.Show ();
-            
+
             box.PackStart (image, false, false, 0);
             box.PackStart (label, true, true, 0);
             box.Show ();
-            
+
             button_box = new HBox ();
             button_box.Spacing = 3;
-            
+
             close_button = new Button (new Image (Stock.Close, IconSize.Menu));
             close_button.Relief = ReliefStyle.None;
             close_button.Clicked += delegate { Hide (); };
             close_button.ShowAll ();
             close_button.Hide ();
-            
+
             shell_box.PackStart (box, true, true, 0);
             shell_box.PackStart (button_box, false, false, 0);
             shell_box.PackStart (close_button, false, false, 0);
             shell_box.Show ();
-            
+
             Add (shell_box);
-            
+
             EnsureStyle ();
 
             BorderWidth = 3;
         }
-        
+
         protected override void OnShown ()
         {
             base.OnShown ();
             image.Show ();
         }
-        
+
         protected override void OnHidden ()
         {
             base.OnHidden ();
             image.Hide ();
         }
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
             theme = Hyena.Gui.Theming.ThemeEngine.CreateTheme (this);
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
             QueueDraw ();
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (!IsDrawable) {
                 return false;
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-                
+
             try {
                 Gdk.Color color = Style.Background (StateType.Normal);
                 theme.DrawFrame (cr, Allocation, CairoExtensions.GdkColorToCairoColor (color));
@@ -146,60 +145,60 @@ namespace Hyena.Widgets
                 ((IDisposable)cr).Dispose ();
             }
         }
-        
+
         private bool changing_style = false;
         protected override void OnStyleSet (Gtk.Style previousStyle)
         {
             if (changing_style) {
                 return;
             }
-            
+
             changing_style = true;
             Style = win.Style;
             label.Style = Style;
             changing_style = false;
         }
-        
+
         public void RemoveButton (Button button)
         {
             button_box.Remove (button);
         }
-        
+
         public void ClearButtons ()
         {
             foreach (Widget child in button_box.Children) {
                 button_box.Remove (child);
             }
         }
-        
+
         public void AddButton (Button button)
         {
             button_box.Show ();
             button.Show ();
             button_box.PackStart (button, false, false, 0);
         }
-        
+
         public bool ShowCloseButton {
             set {
                 close_button.Visible = value;
                 QueueDraw ();
             }
         }
-        
+
         public string Message {
             set {
                 label.Markup = value;
                 QueueDraw ();
             }
         }
-        
+
         public Gdk.Pixbuf Pixbuf {
             set {
                 image.InactivePixbuf = value;
                 QueueDraw ();
             }
         }
-        
+
         public bool Spinning {
             get { return image.Active; }
             set { image.Active = value; }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/PulsingButton.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
index 49d31bc..c7b57eb 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
@@ -38,63 +38,63 @@ namespace Hyena.Widgets
     {
         private static Stage<PulsingButton> default_stage;
         public static Stage<PulsingButton> DefaultStage {
-            get { 
+            get {
                 if (default_stage == null) {
                     default_stage = new Stage<PulsingButton> ();
                     default_stage.DefaultActorDuration = 1250;
                 }
-                
+
                 return default_stage;
             }
         }
-        
+
         private Pulsator<PulsingButton> pulsator = new Pulsator<PulsingButton> ();
-        
+
         public Stage<PulsingButton> Stage {
             get { return pulsator.Stage; }
             set { pulsator.Stage = value; }
         }
-        
+
         public PulsingButton () : base ()
         {
             Setup ();
         }
-        
+
         public PulsingButton (string stock_id) : base (stock_id)
         {
             Setup ();
         }
-        
+
         public PulsingButton (Widget widget) : base (widget)
         {
             Setup ();
         }
-        
+
         protected PulsingButton (IntPtr raw) : base (raw)
         {
             Setup ();
         }
-        
+
         private void Setup ()
         {
             Stage = DefaultStage;
             pulsator.Target = this;
             pulsator.Pulse += delegate { QueueDraw (); };
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (!pulsator.IsPulsing) {
                 return base.OnExposeEvent (evnt);
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow);
-            
+
             double x = Allocation.X + Allocation.Width / 2;
             double y = Allocation.Y + Allocation.Height / 2;
             double r = Math.Min (Allocation.Width, Allocation.Height) / 2;
             double alpha = Choreographer.Compose (pulsator.Percent, Easing.Sine);
-            
+
             Cairo.Color color = CairoExtensions.GdkColorToCairoColor (Style.Background (StateType.Selected));
             Cairo.RadialGradient fill = new Cairo.RadialGradient (x, y, 0, x, y, r);
             color.A = alpha;
@@ -102,28 +102,28 @@ namespace Hyena.Widgets
             fill.AddColorStop (0.5, color);
             color.A = 0;
             fill.AddColorStop (1, color);
-            
+
             cr.Arc (x, y, r, 0, 2 * Math.PI);
             cr.Pattern = fill;
             cr.Fill ();
             fill.Destroy ();
-            
+
             ((IDisposable)cr).Dispose ();
             return base.OnExposeEvent (evnt);
         }
-        
+
         public void StartPulsing ()
         {
             if (IsMapped && Sensitive) {
                 pulsator.StartPulsing ();
             }
         }
-        
+
         public void StopPulsing ()
         {
             pulsator.StopPulsing ();
         }
-        
+
         protected override void OnStateChanged (StateType previous_state)
         {
             base.OnStateChanged (previous_state);
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingEntry.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
index e315058..393c238 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
@@ -1,4 +1,4 @@
-// 
+//
 // RatingEntry.cs
 //
 // Authors:
@@ -43,11 +43,18 @@ namespace Hyena.Widgets
         private bool interior_focus;
         private int focus_width;
         private Gdk.Window event_window;
-        
+
         public event EventHandler Changing;
         public event EventHandler Changed;
-        
-        public RatingEntry () : this (0) 
+
+        static RatingEntry ()
+        {
+#if ENABLE_ATK
+            RatingAccessibleFactory.Init ();
+#endif
+        }
+
+        public RatingEntry () : this (0)
         {
             WidgetFlags |= Gtk.WidgetFlags.NoWindow;
         }
@@ -59,7 +66,7 @@ namespace Hyena.Widgets
             CanFocus = true;
             Name = "GtkEntry";
         }
-        
+
         protected virtual void OnChanging ()
         {
             EventHandler handler = Changing;
@@ -82,7 +89,7 @@ namespace Hyena.Widgets
         {
             Value = renderer.RatingFromPosition (event_alloc, x);
         }
-        
+
 #region Public Properties
 
         private bool always_show_empty_stars = false;
@@ -113,27 +120,27 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         public int MaxRating {
             get { return renderer.MaxRating; }
             set { renderer.MaxRating = value; }
         }
-        
+
         public int MinRating {
             get { return renderer.MinRating; }
             set { renderer.MinRating = value; }
         }
-        
+
         public int RatingLevels {
             get { return renderer.RatingLevels; }
         }
-        
+
         private object rated_object;
         public object RatedObject {
             get { return rated_object; }
             set { rated_object = value; }
         }
-        
+
 #endregion
 
 #region Protected Gtk.Widget Overrides
@@ -142,7 +149,7 @@ namespace Hyena.Widgets
         {
             WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow;
             GdkWindow = Parent.GdkWindow;
-            
+
             Gdk.WindowAttr attributes = new Gdk.WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
             attributes.X = Allocation.X;
@@ -159,37 +166,37 @@ namespace Hyena.Widgets
                 Gdk.EventMask.ButtonPressMask |
                 Gdk.EventMask.ButtonReleaseMask |
                 Gdk.EventMask.ExposureMask);
-                
+
             Gdk.WindowAttributesType attributes_mask =
-                Gdk.WindowAttributesType.X | 
+                Gdk.WindowAttributesType.X |
                 Gdk.WindowAttributesType.Y |
                 Gdk.WindowAttributesType.Wmclass;
-            
+
             event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask);
             event_window.UserData = Handle;
-            
+
             Style = Gtk.Rc.GetStyleByPaths (Settings, "*.GtkEntry", "*.GtkEntry", GType);
-            
+
             base.OnRealized ();
         }
-         
+
         protected override void OnUnrealized ()
         {
             WidgetFlags &= ~WidgetFlags.Realized;
-            
+
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
             event_window = null;
-            
+
             base.OnUnrealized ();
         }
-        
+
         protected override void OnMapped ()
         {
             WidgetFlags |= WidgetFlags.Mapped;
             event_window.Show ();
         }
-        
+
         protected override void OnUnmapped ()
         {
             WidgetFlags &= ~WidgetFlags.Mapped;
@@ -202,15 +209,15 @@ namespace Hyena.Widgets
             if (changing_style) {
                 return;
             }
-            
+
             base.OnStyleSet (previous_style);
-            
+
             changing_style = true;
             focus_width = (int)StyleGetProperty ("focus-line-width");
             interior_focus = (bool)StyleGetProperty ("interior-focus");
             changing_style = false;
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
@@ -219,15 +226,15 @@ namespace Hyena.Widgets
                 event_window.MoveResize (allocation);
             }
         }
-        
+
         protected override void OnSizeRequested (ref Gtk.Requisition requisition)
         {
             EnsureStyle ();
-            
+
             Pango.FontMetrics metrics = PangoContext.GetMetrics (Style.FontDescription, PangoContext.Language);
             renderer.Size = ((int)(metrics.Ascent + metrics.Descent) + 512) >> 10; // PANGO_PIXELS(d)
             metrics.Dispose ();
-            
+
             if (HasFrame) {
                 renderer.Xpad = Style.Xthickness + (interior_focus ? focus_width : 0) + 2;
                 renderer.Ypad = Style.Ythickness + (interior_focus ? focus_width : 0) + 2;
@@ -235,30 +242,30 @@ namespace Hyena.Widgets
                 renderer.Xpad = 0;
                 renderer.Ypad = 0;
             }
-            
+
             requisition.Width = renderer.Width;
             requisition.Height = renderer.Height;
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (evnt.Window != GdkWindow) {
                 return true;
             }
-            
+
             if (HasFrame) {
                 int y_mid = (int)Math.Round ((Allocation.Height - renderer.Height) / 2.0);
-                Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.None, evnt.Area, this, "entry", 
+                Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.None, evnt.Area, this, "entry",
                     Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height);
                 Gtk.Style.PaintShadow (Style, GdkWindow, State, ShadowType.In,
                     evnt.Area, this, "entry", Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height);
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow);
-            renderer.Render (cr, Allocation, 
+            renderer.Render (cr, Allocation,
                 CairoExtensions.GdkColorToCairoColor (HasFrame ? Parent.Style.Text (State) : Parent.Style.Foreground (State)),
                 AlwaysShowEmptyStars, PreviewOnHover && hover_value >= renderer.MinRating, hover_value,
-                State == StateType.Insensitive ? 1 : 0.90, 
+                State == StateType.Insensitive ? 1 : 0.90,
                 State == StateType.Insensitive ? 1 : 0.55,
                 State == StateType.Insensitive ? 1 : 0.45);
             ((IDisposable)cr.Target).Dispose ();
@@ -272,30 +279,30 @@ namespace Hyena.Widgets
             if (evnt.Button != 1) {
                 return false;
             }
-            
+
             HasFocus = true;
             Value = renderer.RatingFromPosition (event_alloc, evnt.X);
-            
+
             return true;
         }
-        
+
         protected override bool OnEnterNotifyEvent (Gdk.EventCrossing evnt)
         {
             hover_value = renderer.MinRating;
             QueueDraw ();
             return true;
         }
-        
+
         protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing crossing)
         {
             return HandleLeaveNotify (crossing);
         }
-        
+
         protected override bool OnMotionNotifyEvent (Gdk.EventMotion motion)
         {
             return HandleMotionNotify (motion.State, motion.X);
         }
-        
+
         protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
         {
             switch (evnt.Key) {
@@ -305,22 +312,22 @@ namespace Hyena.Widgets
                 case Gdk.Key.equal:
                     Value++;
                     return true;
-                
+
                 case Gdk.Key.Down:
                 case Gdk.Key.Left:
                 case Gdk.Key.minus:
                     Value--;
                     return true;
             }
-            
+
             if (evnt.KeyValue >= (48 + MinRating) && evnt.KeyValue <= (48 + MaxRating) && evnt.KeyValue <= 59) {
                 Value = (int)evnt.KeyValue - 48;
                 return true;
             }
-            
+
             return false;
         }
-        
+
         protected override bool OnScrollEvent (Gdk.EventScroll args)
         {
             return HandleScroll (args);
@@ -329,7 +336,7 @@ namespace Hyena.Widgets
 #endregion
 
 #region Internal API, primarily for RatingMenuItem
-        
+
         internal void ClearHover ()
         {
             hover_value = renderer.MinRating - 1;
@@ -347,40 +354,110 @@ namespace Hyena.Widgets
                 case Gdk.ScrollDirection.Right:
                     Value++;
                     return true;
-                
+
                 case Gdk.ScrollDirection.Down:
                 case Gdk.ScrollDirection.Left:
                     Value--;
                     return true;
             }
-            
+
             return false;
         }
-        
+
         internal bool HandleMotionNotify (Gdk.ModifierType state, double x)
         {
             hover_value = renderer.RatingFromPosition (event_alloc, x);
             /*if ((state & Gdk.ModifierType.Button1Mask) != 0) {
                 Value = hover_value;
             }*/
-            
+
             QueueDraw ();
             return true;
         }
-        
+
         internal bool HandleLeaveNotify (Gdk.EventCrossing crossing)
         {
             ClearHover ();
             QueueDraw ();
             return true;
         }
-        
+
 #endregion
 
     }
-    
+
 #region Test Module
 
+    public class RatingAccessible : Atk.Object, Atk.Value, Atk.ValueImplementor
+    {
+        private RatingEntry rating;
+
+        public RatingAccessible (IntPtr raw) : base (raw)
+        {
+            Hyena.Log.Information ("RatingAccessible raw ctor..");
+        }
+
+        public RatingAccessible (GLib.Object widget): base ()
+        {
+            rating = widget as RatingEntry;
+            Name = "Rating entry";
+            Description = "Rating entry, from 0 to 5 stars";
+            Role = Atk.Role.Slider;
+        }
+
+        public void GetMaximumValue (ref GLib.Value val)
+        {
+            val = new GLib.Value (5);
+        }
+
+        public void GetMinimumIncrement (ref GLib.Value val)
+        {
+            val = new GLib.Value (1);
+        }
+
+        public void GetMinimumValue (ref GLib.Value val)
+        {
+            val = new GLib.Value (0);
+        }
+
+        public void GetCurrentValue (ref GLib.Value val)
+        {
+            val = new GLib.Value (rating.Value);
+        }
+
+        public bool SetCurrentValue (GLib.Value val)
+        {
+            int r = (int) val.Val;
+            if (r <= 0 || r > 5) {
+                return false;
+            }
+
+            rating.Value = (int) val.Val;
+            return true;
+        }
+    }
+
+#if ENABLE_ATK
+    internal class RatingAccessibleFactory : Atk.ObjectFactory
+    {
+        public static void Init ()
+        {
+            new RatingAccessibleFactory ();
+            Atk.Global.DefaultRegistry.SetFactoryType ((GLib.GType)typeof (RatingEntry), (GLib.GType)typeof (RatingAccessibleFactory));
+        }
+
+        protected override Atk.Object OnCreateAccessible (GLib.Object obj)
+        {
+            return new RatingAccessible (obj);
+        }
+
+        protected override GLib.GType OnGetAccessibleType ()
+        {
+            return RatingAccessible.GType;
+        }
+    }
+#endif
+
     [Hyena.Gui.TestModule ("Rating Entry")]
     internal class RatingEntryTestModule : Gtk.Window
     {
@@ -388,7 +465,7 @@ namespace Hyena.Widgets
         {
             VBox pbox = new VBox ();
             Add (pbox);
-            
+
             Menu m = new Menu ();
             MenuBar b = new MenuBar ();
             MenuItem item = new MenuItem ("Rate Me!");
@@ -400,30 +477,30 @@ namespace Hyena.Widgets
             m.Append (new ImageMenuItem ("gtk-remove", null));
             m.ShowAll ();
             pbox.PackStart (b, false, false, 0);
-            
+
             VBox box = new VBox ();
             box.BorderWidth = 10;
             box.Spacing = 10;
             pbox.PackStart (box, true, true, 0);
-            
+
             RatingEntry entry1 = new RatingEntry ();
             box.PackStart (entry1, true, true, 0);
-            
+
             RatingEntry entry2 = new RatingEntry ();
             box.PackStart (entry2, false, false, 0);
-            
+
             box.PackStart (new Entry ("Normal GtkEntry"), false, false, 0);
-            
+
             RatingEntry entry3 = new RatingEntry ();
             Pango.FontDescription fd = entry3.PangoContext.FontDescription.Copy ();
             fd.Size = (int)(fd.Size * Pango.Scale.XXLarge);
             entry3.ModifyFont (fd);
             box.PackStart (entry3, true, true, 0);
-            
+
             pbox.ShowAll ();
         }
     }
-    
+
 #endregion
 
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs
index 01f71f0..a4276db 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs
@@ -1,4 +1,4 @@
-// 
+//
 // RatingMenuItem.cs
 //
 // Author:
@@ -42,20 +42,20 @@ namespace Hyena.Widgets
         {
             box = new HBox ();
             box.Spacing = 5;
-            
+
             Label label = new Label ();
-            label.Markup = String.Format ("<i>{0}</i>", 
+            label.Markup = String.Format ("<i>{0}</i>",
                 GLib.Markup.EscapeText (Catalog.GetString ("Rating:")));
             box.PackStart (label, false, false, 0);
             label.Show ();
-            
+
             entry = new RatingEntry ();
             entry.HasFrame = false;
             entry.PreviewOnHover = true;
             entry.AlwaysShowEmptyStars = true;
             entry.Changed += OnEntryChanged;
             box.PackStart (entry, false, false, 0);
-            
+
             box.ShowAll ();
             Add (box);
         }
@@ -86,7 +86,7 @@ namespace Hyena.Widgets
         {
             return entry.HandleMotionNotify (evnt.State, TransformX (evnt.X));
         }
-        
+
         protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt)
         {
             return entry.HandleLeaveNotify (evnt);
@@ -101,14 +101,14 @@ namespace Hyena.Widgets
         {
             return entry.HandleKeyPress (evnt);
         }
-        
+
         private void OnEntryChanged (object o, EventArgs args)
         {
             if (can_activate) {
                 Activate ();
             }
         }
-        
+
         public void Reset (int value)
         {
             can_activate = false;
@@ -116,12 +116,12 @@ namespace Hyena.Widgets
             entry.ClearHover ();
             can_activate = true;
         }
-        
+
         public int Value {
             get { return entry.Value; }
             set { entry.Value = value; }
         }
-        
+
         public RatingEntry RatingEntry {
             get { return entry; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
index ddee186..0e5d9f6 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
@@ -42,9 +42,9 @@ namespace Hyena.Widgets
         protected Theme Theme {
             get { return theme; }
         }
-        
+
         private int frame_width = 3;
-        
+
         private Widget child;
         private Gdk.Rectangle child_allocation;
         private bool fill_color_set;
@@ -56,24 +56,24 @@ namespace Hyena.Widgets
         protected RoundedFrame (IntPtr ptr) : base (ptr)
         {
         }
-        
+
         public RoundedFrame ()
         {
         }
-        
+
         public void SetFillColor (Cairo.Color color)
         {
             fill_color = color;
             fill_color_set = true;
             QueueDraw ();
         }
-        
+
         public void UnsetFillColor ()
         {
             fill_color_set = false;
             QueueDraw ();
         }
-        
+
         public Pattern FillPattern {
             get { return fill_pattern; }
             set {
@@ -81,12 +81,12 @@ namespace Hyena.Widgets
                 QueueDraw ();
             }
         }
-        
+
         public bool DrawBorder {
             get { return draw_border; }
             set { draw_border = value; QueueDraw (); }
         }
-        
+
 #region Gtk.Widget Overrides
 
         protected override void OnRealized ()
@@ -98,7 +98,7 @@ namespace Hyena.Widgets
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             if (child != null && child.Visible) {
-                // Add the child's width/height        
+                // Add the child's width/height
                 Requisition child_requisition = child.SizeRequest ();
                 requisition.Width = Math.Max (0, child_requisition.Width);
                 requisition.Height = child_requisition.Height;
@@ -106,7 +106,7 @@ namespace Hyena.Widgets
                 requisition.Width = 0;
                 requisition.Height = 0;
             }
-            
+
             // Add the frame border
             requisition.Width += ((int)BorderWidth + frame_width) * 2;
             requisition.Height += ((int)BorderWidth + frame_width) * 2;
@@ -115,40 +115,40 @@ namespace Hyena.Widgets
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             base.OnSizeAllocated (allocation);
-            
+
             child_allocation = new Gdk.Rectangle ();
-            
+
             if (child == null || !child.Visible) {
                 return;
             }
-            
+
             child_allocation.X = (int)BorderWidth + frame_width;
             child_allocation.Y = (int)BorderWidth + frame_width;
             child_allocation.Width = (int)Math.Max (1, Allocation.Width - child_allocation.X * 2);
-            child_allocation.Height = (int)Math.Max (1, Allocation.Height - child_allocation.Y - 
+            child_allocation.Height = (int)Math.Max (1, Allocation.Height - child_allocation.Y -
                 (int)BorderWidth - frame_width);
-                
+
             child_allocation.X += Allocation.X;
             child_allocation.Y += Allocation.Y;
-            
+
             child.SizeAllocate (child_allocation);
         }
-        
+
         protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj)
         {
-            // This is to satisfy the gtk_widget_set_scroll_adjustments 
-            // inside of GtkScrolledWindow so it doesn't complain about 
+            // This is to satisfy the gtk_widget_set_scroll_adjustments
+            // inside of GtkScrolledWindow so it doesn't complain about
             // its child not being scrollable.
         }
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (!IsDrawable) {
                 return false;
             }
- 
+
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-                
+
             try {
                 DrawFrame (cr, evnt.Area);
                 if (child != null) {
@@ -160,18 +160,18 @@ namespace Hyena.Widgets
                 ((IDisposable)cr).Dispose ();
             }
         }
-        
+
         private void DrawFrame (Cairo.Context cr, Gdk.Rectangle clip)
         {
             int x = child_allocation.X - frame_width;
             int y = child_allocation.Y - frame_width;
             int width = child_allocation.Width + 2 * frame_width;
             int height = child_allocation.Height + 2 * frame_width;
-            
+
             Gdk.Rectangle rect = new Gdk.Rectangle (x, y, width, height);
-            
+
             theme.Context.ShowStroke = draw_border;
-            
+
             if (fill_color_set) {
                 theme.DrawFrameBackground (cr, rect, fill_color);
             } else if (fill_pattern != null) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/ScrolledWindow.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/ScrolledWindow.cs
index f2dbff3..91bb0a2 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/ScrolledWindow.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/ScrolledWindow.cs
@@ -42,21 +42,21 @@ namespace Hyena.Widgets
     {
         private Widget adjustable;
         private RoundedFrame rounded_frame;
-    
+
         public ScrolledWindow ()
         {
         }
-        
+
         public void AddWithFrame (Widget widget)
         {
             RoundedFrame frame = new RoundedFrame ();
             frame.Add (widget);
             frame.Show ();
-            
+
             Add (frame);
             ProbeAdjustable (widget);
         }
-        
+
         protected override void OnAdded (Widget widget)
         {
             if (widget is RoundedFrame) {
@@ -64,10 +64,10 @@ namespace Hyena.Widgets
                 rounded_frame.Added += OnFrameWidgetAdded;
                 rounded_frame.Removed += OnFrameWidgetRemoved;
             }
-            
+
             base.OnAdded (widget);
         }
-        
+
         protected override void OnRemoved (Widget widget)
         {
             if (widget == rounded_frame) {
@@ -75,17 +75,17 @@ namespace Hyena.Widgets
                 rounded_frame.Removed -= OnFrameWidgetRemoved;
                 rounded_frame = null;
             }
-            
+
             base.OnRemoved (widget);
         }
-        
+
         private void OnFrameWidgetAdded (object o, AddedArgs args)
         {
             if (rounded_frame != null) {
                 ProbeAdjustable (args.Widget);
             }
         }
-        
+
         private void OnFrameWidgetRemoved (object o, RemovedArgs args)
         {
             if (adjustable != null && adjustable == args.Widget) {
@@ -94,27 +94,27 @@ namespace Hyena.Widgets
                 adjustable = null;
             }
         }
-        
+
         private void ProbeAdjustable (Widget widget)
         {
             Type type = widget.GetType ();
-            
+
             PropertyInfo hadj_prop = type.GetProperty ("Hadjustment");
             PropertyInfo vadj_prop = type.GetProperty ("Vadjustment");
-            
+
             if (hadj_prop == null || vadj_prop == null) {
                 return;
             }
-            
+
             object hadj_value = hadj_prop.GetValue (widget, null);
             object vadj_value = vadj_prop.GetValue (widget, null);
-            
-            if (hadj_value == null || vadj_value == null 
+
+            if (hadj_value == null || vadj_value == null
                 || hadj_value.GetType () != typeof (Adjustment)
                 || vadj_value.GetType () != typeof (Adjustment)) {
                 return;
             }
-            
+
             Hadjustment = (Adjustment)hadj_value;
             Vadjustment = (Adjustment)vadj_value;
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
index 0ea36b2..5f5f0a2 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
@@ -39,19 +39,19 @@ namespace Hyena.Widgets
     public class SegmentedBar : Widget
     {
         public delegate string BarValueFormatHandler (Segment segment);
-    
+
         public class Segment
         {
             private string title;
             private double percent;
             private Cairo.Color color;
             private bool show_in_bar;
-            
-            public Segment (string title, double percent, Cairo.Color color) 
+
+            public Segment (string title, double percent, Cairo.Color color)
                 : this (title, percent, color, true)
             {
             }
-            
+
             public Segment (string title, double percent, Cairo.Color color, bool showInBar)
             {
                 this.title = title;
@@ -59,36 +59,36 @@ namespace Hyena.Widgets
                 this.color = color;
                 this.show_in_bar = showInBar;
             }
-            
+
             public string Title {
                 get { return title; }
                 set { title = value; }
             }
-            
+
             public double Percent {
                 get { return percent; }
                 set { percent = value; }
             }
-            
+
             public Cairo.Color Color {
                 get { return color; }
                 set { color = value; }
             }
-            
+
             public bool ShowInBar {
                 get { return show_in_bar; }
                 set { show_in_bar = value; }
             }
-            
+
             internal int LayoutWidth;
             internal int LayoutHeight;
         }
-        
+
         // State
         private List<Segment> segments = new List<Segment> ();
         private int layout_width;
         private int layout_height;
-        
+
         // Properties
         private int bar_height = 26;
         private int bar_label_spacing = 8;
@@ -96,37 +96,37 @@ namespace Hyena.Widgets
         private int segment_box_size = 12;
         private int segment_box_spacing = 6;
         private int h_padding = 0;
-        
+
         private bool show_labels = true;
         private bool reflect = true;
-        
+
         private Color remainder_color = CairoExtensions.RgbToColor (0xeeeeee);
-    
+
         private BarValueFormatHandler format_handler;
-    
+
         public SegmentedBar ()
         {
             WidgetFlags |= WidgetFlags.NoWindow;
         }
-        
+
         protected override void OnRealized ()
         {
             GdkWindow = Parent.GdkWindow;
             base.OnRealized ();
         }
-        
+
 #region Size Calculations
-        
+
         protected override void OnSizeRequested (ref Requisition requisition)
         {
             requisition.Width = 200;
             requisition.Height = 0;
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             int _bar_height = reflect ? (int)Math.Ceiling (bar_height * 1.75) : bar_height;
-            
+
             if (show_labels) {
                 ComputeLayoutSize ();
                 HeightRequest = Math.Max (bar_height + bar_label_spacing + layout_height, _bar_height);
@@ -135,69 +135,69 @@ namespace Hyena.Widgets
                 HeightRequest = _bar_height;
                 WidthRequest = bar_height + (2 * h_padding);
             }
-            
+
             base.OnSizeAllocated (allocation);
         }
-        
+
         private void ComputeLayoutSize ()
         {
             if (segments.Count == 0) {
                 return;
             }
-            
+
             Pango.Layout layout = null;
-            
+
             layout_width = layout_height = 0;
-            
+
             for (int i = 0, n = segments.Count; i < n; i++) {
                 int aw, ah, bw, bh;
-                
+
                 layout = CreateAdaptLayout (layout, false, true);
                 layout.SetText (FormatSegmentText (segments[i]));
                 layout.GetPixelSize (out aw, out ah);
-                
+
                 layout = CreateAdaptLayout (layout, true, false);
                 layout.SetText (FormatSegmentValue (segments[i]));
                 layout.GetPixelSize (out bw, out bh);
-                
+
                 int w = Math.Max (aw, bw);
                 int h = ah + bh;
-                
+
                 segments[i].LayoutWidth = w;
                 segments[i].LayoutHeight = Math.Max (h, segment_box_size * 2);
-                
-                layout_width += segments[i].LayoutWidth + segment_box_size + segment_box_spacing 
+
+                layout_width += segments[i].LayoutWidth + segment_box_size + segment_box_spacing
                     + (i < n - 1 ? segment_label_spacing : 0);
                 layout_height = Math.Max (layout_height, segments[i].LayoutHeight);
             }
-            
+
             layout.Dispose ();
         }
-        
+
 #endregion
-        
+
 #region Public Methods
-        
+
         public void AddSegmentRgba (string title, double percent, uint rgbaColor)
         {
             AddSegment (title, percent, CairoExtensions.RgbaToColor (rgbaColor));
         }
-        
+
         public void AddSegmentRgb (string title, double percent, uint rgbColor)
         {
             AddSegment (title, percent, CairoExtensions.RgbToColor (rgbColor));
         }
-        
+
         public void AddSegment (string title, double percent, Color color)
         {
             AddSegment (new Segment (title, percent, color, true));
         }
-        
+
         public void AddSegment (string title, double percent, Color color, bool showInBar)
         {
             AddSegment (new Segment (title, percent, color, showInBar));
         }
-        
+
         public void AddSegment (Segment segment)
         {
             lock (segments) {
@@ -205,30 +205,30 @@ namespace Hyena.Widgets
                 QueueDraw ();
             }
         }
-        
+
         public void UpdateSegment (int index, double percent)
         {
             segments[index].Percent = percent;
             QueueDraw ();
         }
-        
+
 #endregion
 
-#region Public Properties                
-        
+#region Public Properties
+
         public BarValueFormatHandler ValueFormatter {
             get { return format_handler; }
             set { format_handler = value; }
         }
-        
+
         public Color RemainderColor {
             get { return remainder_color; }
-            set { 
+            set {
                 remainder_color = value;
                 QueueDraw ();
             }
         }
-        
+
         public int BarHeight {
             get { return bar_height; }
             set {
@@ -238,7 +238,7 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         public bool ShowReflection {
             get { return reflect; }
             set {
@@ -248,7 +248,7 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         public bool ShowLabels {
             get { return show_labels; }
             set {
@@ -258,10 +258,10 @@ namespace Hyena.Widgets
                 }
             }
         }
-        
+
         public int SegmentLabelSpacing {
             get { return segment_label_spacing; }
-            set { 
+            set {
                 if (segment_label_spacing != value) {
                     segment_label_spacing = value;
                     QueueResize ();
@@ -270,202 +270,202 @@ namespace Hyena.Widgets
         }
         public int SegmentBoxSize {
             get { return segment_box_size; }
-            set { 
+            set {
                 if (segment_box_size != value) {
                     segment_box_size = value;
                     QueueResize ();
                 }
             }
         }
-        
+
         public int SegmentBoxSpacing {
             get { return segment_box_spacing; }
-            set { 
+            set {
                 if (segment_box_spacing != value) {
                     segment_box_spacing = value;
                     QueueResize ();
                 }
             }
         }
-        
+
         public int BarLabelSpacing {
             get { return bar_label_spacing; }
-            set { 
+            set {
                 if (bar_label_spacing != value) {
                     bar_label_spacing = value;
                     QueueResize ();
                 }
             }
         }
-        
+
         public int HorizontalPadding {
             get { return h_padding; }
-            set { 
+            set {
                 if (h_padding != value) {
                     h_padding = value;
                     QueueResize ();
                 }
             }
         }
-        
+
 #endregion
-        
+
 #region Rendering
-        
+
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (evnt.Window != GdkWindow) {
                 return base.OnExposeEvent (evnt);
             }
-            
+
             Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
-            
+
             if (reflect) {
                 CairoExtensions.PushGroup (cr);
             }
-            
+
             cr.Operator = Operator.Over;
             cr.Translate (Allocation.X + h_padding, Allocation.Y);
-            cr.Rectangle (0, 0, Allocation.Width - h_padding, Math.Max (2 * bar_height, 
+            cr.Rectangle (0, 0, Allocation.Width - h_padding, Math.Max (2 * bar_height,
                 bar_height + bar_label_spacing + layout_height));
             cr.Clip ();
-            
+
             Pattern bar = RenderBar (Allocation.Width - 2 * h_padding, bar_height);
-            
+
             cr.Save ();
             cr.Source = bar;
             cr.Paint ();
             cr.Restore ();
-            
+
             if (reflect) {
                 cr.Save ();
-    
+
                 cr.Rectangle (0, bar_height, Allocation.Width - h_padding, bar_height);
                 cr.Clip ();
-                
+
                 Matrix matrix = new Matrix ();
                 matrix.InitScale (1, -1);
                 matrix.Translate (0, -(2 * bar_height) + 1);
                 cr.Transform (matrix);
-                
+
                 cr.Pattern = bar;
-                
+
                 LinearGradient mask = new LinearGradient (0, 0, 0, bar_height);
-                
+
                 mask.AddColorStop (0.25, new Color (0, 0, 0, 0));
                 mask.AddColorStop (0.5, new Color (0, 0, 0, 0.125));
                 mask.AddColorStop (0.75, new Color (0, 0, 0, 0.4));
                 mask.AddColorStop (1.0, new Color (0, 0, 0, 0.7));
-                
+
                 cr.Mask (mask);
                 mask.Destroy ();
-                
+
                 cr.Restore ();
-                
+
                 CairoExtensions.PopGroupToSource (cr);
                 cr.Paint ();
             }
-            
+
             if (show_labels) {
-                cr.Translate ((reflect ? Allocation.X : -h_padding) + (Allocation.Width - layout_width) / 2, 
+                cr.Translate ((reflect ? Allocation.X : -h_padding) + (Allocation.Width - layout_width) / 2,
                      (reflect ? Allocation.Y : 0) + bar_height + bar_label_spacing);
-                
+
                 RenderLabels (cr);
             }
-            
+
             bar.Destroy ();
             ((IDisposable)cr.Target).Dispose ();
             ((IDisposable)cr).Dispose ();
-            
+
             return true;
         }
-        
+
         private Pattern RenderBar (int w, int h)
         {
             ImageSurface s = new ImageSurface (Format.Argb32, w, h);
             Context cr = new Context (s);
             RenderBar (cr, w, h, h / 2);
 // TODO Implement the new ctor - see http://bugzilla.gnome.org/show_bug.cgi?id=561394
-#pragma warning disable 0618 
+#pragma warning disable 0618
             Pattern pattern = new Pattern (s);
-#pragma warning restore 0618 
+#pragma warning restore 0618
             s.Destroy ();
             ((IDisposable)cr).Dispose ();
             return pattern;
         }
-        
+
         private void RenderBar (Context cr, int w, int h, int r)
         {
             RenderBarSegments (cr, w, h, r);
             RenderBarStrokes (cr, w, h, r);
         }
-        
+
         private void RenderBarSegments (Context cr, int w, int h, int r)
         {
             LinearGradient grad = new LinearGradient (0, 0, w, 0);
             double last = 0.0;
-            
+
             foreach (Segment segment in segments) {
                 if (segment.Percent > 0) {
                     grad.AddColorStop (last, segment.Color);
                     grad.AddColorStop (last += segment.Percent, segment.Color);
                 }
             }
-            
-            CairoExtensions.RoundedRectangle (cr, 0, 0, w, h, r); 
+
+            CairoExtensions.RoundedRectangle (cr, 0, 0, w, h, r);
             cr.Pattern = grad;
             cr.FillPreserve ();
             cr.Pattern.Destroy ();
-            
+
             grad = new LinearGradient (0, 0, 0, h);
             grad.AddColorStop (0.0, new Color (1, 1, 1, 0.125));
             grad.AddColorStop (0.35, new Color (1, 1, 1, 0.255));
             grad.AddColorStop (1, new Color (0, 0, 0, 0.4));
-            
+
             cr.Pattern = grad;
             cr.Fill ();
             cr.Pattern.Destroy ();
         }
-        
+
         private void RenderBarStrokes (Context cr, int w, int h, int r)
         {
             LinearGradient stroke = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0x00000040));
             LinearGradient seg_sep_light = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0xffffff20));
             LinearGradient seg_sep_dark = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0x00000020));
-            
+
             cr.LineWidth = 1;
-            
+
             double seg_w = 20;
             double x = seg_w > r ? seg_w : r;
-            
+
             while (x <= w - r) {
                 cr.MoveTo (x - 0.5, 1);
                 cr.LineTo (x - 0.5, h - 1);
                 cr.Pattern = seg_sep_light;
                 cr.Stroke ();
-                
+
                 cr.MoveTo (x + 0.5, 1);
                 cr.LineTo (x + 0.5, h - 1);
                 cr.Pattern = seg_sep_dark;
                 cr.Stroke ();
-                
+
                 x += seg_w;
             }
-            
+
             CairoExtensions.RoundedRectangle (cr, 0.5, 0.5, w - 1, h - 1, r);
             cr.Pattern = stroke;
             cr.Stroke ();
-            
+
             stroke.Destroy ();
             seg_sep_light.Destroy ();
             seg_sep_dark.Destroy ();
         }
-        
+
         private LinearGradient MakeSegmentGradient (int h, Color color)
         {
             return MakeSegmentGradient (h, color, false);
         }
-        
+
         private LinearGradient MakeSegmentGradient (int h, Color color, bool diag)
         {
             LinearGradient grad = new LinearGradient (0, 0, 0, h);
@@ -474,19 +474,19 @@ namespace Hyena.Widgets
             grad.AddColorStop (1, CairoExtensions.ColorShade (color, 0.8));
             return grad;
         }
-        
+
         private void RenderLabels (Context cr)
         {
             if (segments.Count == 0) {
                 return;
             }
-            
+
             Pango.Layout layout = null;
             Color text_color = CairoExtensions.GdkColorToCairoColor (Style.Foreground (State));
             Color box_stroke_color = new Color (0, 0, 0, 0.6);
-            
+
             int x = 0;
-            
+
             foreach (Segment segment in segments) {
                 cr.LineWidth = 1;
                 cr.Rectangle (x + 0.5, 2 + 0.5, segment_box_size - 1, segment_box_size - 1);
@@ -496,41 +496,41 @@ namespace Hyena.Widgets
                 cr.Color = box_stroke_color;
                 cr.Stroke ();
                 grad.Destroy ();
-                
+
                 x += segment_box_size + segment_box_spacing;
-                
+
                 int lw, lh;
                 layout = CreateAdaptLayout (layout, false, true);
                 layout.SetText (FormatSegmentText (segment));
                 layout.GetPixelSize (out lw, out lh);
-                
+
                 cr.MoveTo (x, 0);
                 text_color.A = 0.9;
                 cr.Color = text_color;
                 PangoCairoHelper.ShowLayout (cr, layout);
                 cr.Fill ();
-                
+
                 layout = CreateAdaptLayout (layout, true, false);
                 layout.SetText (FormatSegmentValue (segment));
-                
+
                 cr.MoveTo (x, lh);
                 text_color.A = 0.75;
                 cr.Color = text_color;
                 PangoCairoHelper.ShowLayout (cr, layout);
                 cr.Fill ();
-                
+
                 x += segment.LayoutWidth + segment_label_spacing;
             }
-            
+
             layout.Dispose ();
         }
-        
+
 #endregion
 
 #region Utilities
-        
+
         private int pango_size_normal;
-        
+
         private Pango.Layout CreateAdaptLayout (Pango.Layout layout, bool small, bool bold)
         {
             if (layout == null) {
@@ -538,38 +538,38 @@ namespace Hyena.Widgets
                 layout = new Pango.Layout (context);
                 layout.FontDescription = context.FontDescription;
                 pango_size_normal = layout.FontDescription.Size;
-            } 
-            
-            layout.FontDescription.Size = small 
+            }
+
+            layout.FontDescription.Size = small
                 ? (int)(layout.FontDescription.Size * Pango.Scale.Small)
                 : pango_size_normal;
-            
+
             layout.FontDescription.Weight = bold
                 ? Pango.Weight.Bold
                 : Pango.Weight.Normal;
-            
+
             return layout;
         }
-        
-                
+
+
         private string FormatSegmentText (Segment segment)
         {
             return segment.Title;
         }
-        
+
         private string FormatSegmentValue (Segment segment)
         {
             return format_handler == null
                 ? String.Format ("{0}%", segment.Percent * 100.0)
                 : format_handler (segment);
         }
-        
+
 #endregion
 
     }
-    
-#region Test Module    
-    
+
+#region Test Module
+
     [TestModule ("Segmented Bar")]
     internal class SegmentedBarTestModule : Window
     {
@@ -579,11 +579,11 @@ namespace Hyena.Widgets
         {
             BorderWidth = 10;
             AppPaintable = true;
-            
+
             box = new VBox ();
             box.Spacing = 10;
             Add (box);
-            
+
             int space = 55;
             bar = new SegmentedBar ();
             bar.HorizontalPadding = bar.BarHeight / 2;
@@ -591,39 +591,39 @@ namespace Hyena.Widgets
             bar.AddSegmentRgb ("Other", 0.0788718162651326, 0xf57900);
             bar.AddSegmentRgb ("Video", 0.0516869922033282, 0x73d216);
             bar.AddSegment ("Free Space", 0.867561266964516, bar.RemainderColor, false);
-           
+
             bar.ValueFormatter = delegate (SegmentedBar.Segment segment) {
                 return String.Format ("{0} GB", space * segment.Percent);
             };
-            
+
             HBox controls = new HBox ();
             controls.Spacing = 5;
-            
+
             Label label = new Label ("Height:");
             controls.PackStart (label, false, false, 0);
-            
+
             SpinButton height = new SpinButton (new Adjustment (bar.BarHeight, 5, 100, 1, 1, 1), 1, 0);
             height.Activated += delegate { bar.BarHeight = height.ValueAsInt; };
             height.Changed += delegate { bar.BarHeight = height.ValueAsInt; bar.HorizontalPadding = bar.BarHeight / 2; };
             controls.PackStart (height, false, false, 0);
-            
+
             CheckButton reflect = new CheckButton ("Reflection");
             reflect.Active = bar.ShowReflection;
             reflect.Toggled += delegate { bar.ShowReflection = reflect.Active; };
             controls.PackStart (reflect, false, false, 0);
-            
+
             CheckButton labels = new CheckButton ("Labels");
             labels.Active = bar.ShowLabels;
             labels.Toggled += delegate { bar.ShowLabels = labels.Active; };
             controls.PackStart (labels, false, false, 0);
-            
+
             box.PackStart (controls, false, false, 0);
             box.PackStart (new HSeparator (), false, false, 0);
             box.PackStart (bar, false, false, 0);
             box.ShowAll ();
-            
+
             SetSizeRequest (350, -1);
-            
+
             Gdk.Geometry limits = new Gdk.Geometry ();
             limits.MinWidth = SizeRequest ().Width;
             limits.MaxWidth = Gdk.Screen.Default.Width;
@@ -632,7 +632,7 @@ namespace Hyena.Widgets
             SetGeometryHints (this, limits, Gdk.WindowHints.MaxSize | Gdk.WindowHints.MinSize);
         }
     }
-    
+
 #endregion
-    
+
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs
index 97073af..9b0ed79 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs
@@ -36,41 +36,41 @@ namespace Hyena.Widgets
         private double value;
         private double target_value;
         private double velocity = 0;
-        
+
         private double Accelerate (double velocity)
         {
             return AccelerateCore (velocity);
         }
-        
+
         private double Decelerate (double velocity)
         {
             return Math.Max (DecelerateCore (velocity), 0);
         }
-        
+
         protected virtual double AccelerateCore (double velocity)
         {
             return velocity + 8;
         }
-        
+
         protected virtual double DecelerateCore (double velocity)
         {
             return velocity - Math.Max (3, 0.2 * velocity);
         }
-        
+
         private double TargetValue {
             get { return target_value; }
             set {
                 if (value == target_value) {
                     return;
                 }
-                
+
                 target_value = value;
                 if (timeout == 0) {
                     timeout = GLib.Timeout.Add (20, OnTimeout);
                 }
             }
         }
-        
+
         // Smoothly get us to the target value
         private bool OnTimeout ()
         {
@@ -80,17 +80,17 @@ namespace Hyena.Widgets
                 timeout = 0;
                 return false;
             }
-            
+
             int sign = Math.Sign (delta);
             delta = Math.Abs (delta);
-            
+
             double hypothetical = delta;
             double v = Accelerate (velocity);
             while (v > 0 && hypothetical > 0) {
                 hypothetical -= v;
                 v = Decelerate (v);
             }
-            
+
             velocity = hypothetical <= 0 ? Decelerate (velocity) : Accelerate (velocity);
 
             // Minimum speed: 2 px / 20 ms = 100px / second
@@ -102,10 +102,10 @@ namespace Hyena.Widgets
             ignore_value_changed = true;
             Vadjustment.Value = Math.Round (value);
             ignore_value_changed = false;
-            
+
             return true;
         }
-        
+
         protected override bool OnScrollEvent (Gdk.EventScroll evnt)
         {
             switch (evnt.Direction) {
@@ -120,19 +120,19 @@ namespace Hyena.Widgets
             }
             return true;
         }
-        
+
         protected override void OnRealized ()
         {
             base.OnRealized ();
             Vadjustment.ValueChanged += OnValueChanged;
         }
-        
+
         protected override void OnUnrealized ()
         {
             Vadjustment.ValueChanged -= OnValueChanged;
             base.OnUnrealized ();
         }
-        
+
         private void OnValueChanged (object o, EventArgs args)
         {
             if (!ignore_value_changed) {
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/TextViewEditable.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/TextViewEditable.cs
index fa224ef..5b25c80 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/TextViewEditable.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/TextViewEditable.cs
@@ -32,18 +32,18 @@ using Gtk;
 namespace Hyena.Widgets
 {
     public class TextViewEditable : TextView, Editable
-    {       
+    {
         public TextViewEditable ()
         {
             Buffer.Changed += OnBufferChanged;
             Buffer.InsertText += OnBufferInsertText;
             Buffer.DeleteRange += OnBufferDeleteRange;
         }
-        
+
         public event EventHandler Changed;
         public event TextDeletedHandler TextDeleted;
         public event TextInsertedHandler TextInserted;
-        
+
         private void OnBufferChanged (object o, EventArgs args)
         {
             EventHandler handler = Changed;
@@ -51,13 +51,13 @@ namespace Hyena.Widgets
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         private void OnBufferInsertText (object o, InsertTextArgs args)
         {
             TextInsertedHandler handler = TextInserted;
             if (handler != null) {
                 TextInsertedArgs raise_args = new TextInsertedArgs ();
-                raise_args.Args = new object [] { 
+                raise_args.Args = new object [] {
                     args.Text,
                     args.Length,
                     args.Pos.Offset
@@ -65,79 +65,79 @@ namespace Hyena.Widgets
                 handler (this, raise_args);
             }
         }
-        
+
         private void OnBufferDeleteRange (object o, DeleteRangeArgs args)
         {
             TextDeletedHandler handler = TextDeleted;
             if (handler != null) {
                 TextDeletedArgs raise_args = new TextDeletedArgs ();
-                raise_args.Args = new object [] { 
+                raise_args.Args = new object [] {
                     args.Start.Offset,
                     args.End.Offset
                 };
                 handler (this, raise_args);
             }
         }
-        
+
         void Editable.PasteClipboard ()
         {
         }
-        
+
         void Editable.CutClipboard ()
         {
         }
-        
+
         void Editable.CopyClipboard ()
         {
         }
-           
+
         public void DeleteText (int start_pos, int end_pos)
         {
             start_pos--;
             end_pos--;
-        
+
             TextIter start_iter = Buffer.GetIterAtOffset (start_pos);
             TextIter end_iter = Buffer.GetIterAtOffset (start_pos + (end_pos - start_pos));
             Buffer.Delete (ref start_iter, ref end_iter);
         }
-        
+
         public void InsertText (string new_text, ref int position)
         {
             TextIter iter = Buffer.GetIterAtOffset (position - 1);
             Buffer.Insert (ref iter, new_text);
             position = iter.Offset + 1;
         }
-        
+
         public string GetChars (int start_pos, int end_pos)
         {
             start_pos--;
             end_pos--;
-            
+
             TextIter start_iter = Buffer.GetIterAtOffset (start_pos);
             TextIter end_iter = Buffer.GetIterAtOffset (start_pos + (end_pos - start_pos));
             return Buffer.GetText (start_iter, end_iter, true);
         }
-        
+
         public void SelectRegion (int start, int end)
         {
             Buffer.SelectRange (Buffer.GetIterAtOffset (start - 1), Buffer.GetIterAtOffset (end - 1));
         }
-        
+
         public bool GetSelectionBounds (out int start, out int end)
         {
             TextIter start_iter, end_iter;
             start = 0;
             end = 0;
-            
+
             if (Buffer.GetSelectionBounds (out start_iter, out end_iter)) {
                 start = start_iter.Offset + 1;
                 end = end_iter.Offset + 1;
                 return true;
             }
-            
+
             return true;
         }
-        
+
         public void DeleteSelection ()
         {
             TextIter start, end;
@@ -145,13 +145,13 @@ namespace Hyena.Widgets
                 Buffer.Delete (ref start, ref end);
             }
         }
-        
-        public int Position { 
+
+        public int Position {
             get { return Buffer.CursorPosition; }
             set { Buffer.PlaceCursor (Buffer.GetIterAtOffset (Position)); }
         }
-        
-        public bool IsEditable { 
+
+        public bool IsEditable {
             get { return Editable; }
             set { Editable = value; }
         }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Widgets/WrapLabel.cs b/src/Libraries/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
index 582a208..c2a4923 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
@@ -37,94 +37,99 @@ namespace Hyena.Widgets
         private bool use_markup = false;
         private bool wrap = true;
         private Pango.Layout layout;
-        
+
         public WrapLabel ()
         {
             WidgetFlags |= WidgetFlags.NoWindow;
         }
-        
+
         private void CreateLayout ()
         {
             if (layout != null) {
                 layout.Dispose ();
             }
-            
+
             layout = new Pango.Layout (PangoContext);
             layout.Wrap = Pango.WrapMode.Word;
         }
-        
+
         private void UpdateLayout ()
         {
             if (layout == null) {
                 CreateLayout ();
             }
-            
+
             layout.Ellipsize = wrap ? Pango.EllipsizeMode.None : Pango.EllipsizeMode.End;
 
             if (text == null) {
                 text = "";
             }
-            
+
             if (use_markup) {
                 layout.SetMarkup (text);
             } else {
                 layout.SetText (text);
             }
-            
+
             QueueResize ();
         }
-        
+
         protected override void OnStyleSet (Style previous_style)
         {
             CreateLayout ();
             UpdateLayout ();
             base.OnStyleSet (previous_style);
         }
-        
+
         protected override void OnRealized ()
         {
             GdkWindow = Parent.GdkWindow;
             base.OnRealized ();
         }
-        
+
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
         {
             int lw, lh;
-            
+
             layout.Width = (int)(allocation.Width * Pango.Scale.PangoScale);
             layout.GetPixelSize (out lw, out lh);
-            
+
             HeightRequest = lh;
-            
+
             base.OnSizeAllocated (allocation);
         }
 
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             if (evnt.Window == GdkWindow) {
-                Gtk.Style.PaintLayout (Style, GdkWindow, State, false, 
-                    evnt.Area, this, null, Allocation.X, Allocation.Y, layout);
+                // Center the text vertically
+                int lw, lh;
+                layout.GetPixelSize (out lw, out lh);
+                int y = Allocation.Y + (Allocation.Height - lh) / 2;
+
+                Gtk.Style.PaintLayout (Style, GdkWindow, State, false,
+                    evnt.Area, this, null, Allocation.X, y, layout);
             }
 
             return true;
         }
-        
+
         public void MarkupFormat (string format, params object [] args)
         {
             if (args == null || args.Length == 0) {
                 Markup = format;
                 return;
             }
-            
+
             for (int i = 0; i < args.Length; i++) {
                 if (args[i] is string) {
                     args[i] = GLib.Markup.EscapeText ((string)args[i]);
                 }
             }
-            
+
             Markup = String.Format (format, args);
         }
-        
+
         public bool Wrap {
             get { return wrap; }
             set {
@@ -132,7 +137,7 @@ namespace Hyena.Widgets
                 UpdateLayout ();
             }
         }
-        
+
         public string Markup {
             get { return text; }
             set {
@@ -141,7 +146,7 @@ namespace Hyena.Widgets
                 UpdateLayout ();
             }
         }
-        
+
         public string Text {
             get { return text; }
             set {
@@ -149,6 +154,6 @@ namespace Hyena.Widgets
                 text = value;
                 UpdateLayout ();
             }
-        }       
+        }
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Makefile.am b/src/Libraries/Hyena.Gui/Makefile.am
index b17a50d..e8b3de6 100644
--- a/src/Libraries/Hyena.Gui/Makefile.am
+++ b/src/Libraries/Hyena.Gui/Makefile.am
@@ -3,6 +3,13 @@ ASSEMBLY_BUILD_FLAGS = -unsafe
 TARGET = library
 LINK = $(REF_HYENA_GUI)
 SOURCES =  \
+	Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs \
 	Hyena.Data.Gui/CellContext.cs \
 	Hyena.Data.Gui/Column.cs \
 	Hyena.Data.Gui/ColumnCell.cs \
@@ -18,6 +25,7 @@ SOURCES =  \
 	Hyena.Data.Gui/ITextCell.cs \
 	Hyena.Data.Gui/ITooltipCell.cs \
 	Hyena.Data.Gui/ListView/ListView.cs \
+	Hyena.Data.Gui/ListView/ListView_Accessible.cs \
 	Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs \
 	Hyena.Data.Gui/ListView/ListView_Header.cs \
 	Hyena.Data.Gui/ListView/ListView_Interaction.cs \
@@ -42,6 +50,7 @@ SOURCES =  \
 	Hyena.Gui.Theming/Theme.cs \
 	Hyena.Gui.Theming/ThemeContext.cs \
 	Hyena.Gui.Theming/ThemeEngine.cs \
+	Hyena.Gui/BaseWidgetAccessible.cs \
 	Hyena.Gui/CairoExtensions.cs \
 	Hyena.Gui/CleanRoomStartup.cs \
 	Hyena.Gui/CompositeUtils.cs \
diff --git a/src/Libraries/Hyena.Gui/Makefile.in b/src/Libraries/Hyena.Gui/Makefile.in
index b391aaf..eac62fd 100644
--- a/src/Libraries/Hyena.Gui/Makefile.in
+++ b/src/Libraries/Hyena.Gui/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -346,6 +355,13 @@ ASSEMBLY_BUILD_FLAGS = -unsafe
 TARGET = library
 LINK = $(REF_HYENA_GUI) $(am__append_1)
 SOURCES = \
+	Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs \
+	Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs \
 	Hyena.Data.Gui/CellContext.cs \
 	Hyena.Data.Gui/Column.cs \
 	Hyena.Data.Gui/ColumnCell.cs \
@@ -361,6 +377,7 @@ SOURCES = \
 	Hyena.Data.Gui/ITextCell.cs \
 	Hyena.Data.Gui/ITooltipCell.cs \
 	Hyena.Data.Gui/ListView/ListView.cs \
+	Hyena.Data.Gui/ListView/ListView_Accessible.cs \
 	Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs \
 	Hyena.Data.Gui/ListView/ListView_Header.cs \
 	Hyena.Data.Gui/ListView/ListView_Interaction.cs \
@@ -385,6 +402,7 @@ SOURCES = \
 	Hyena.Gui.Theming/Theme.cs \
 	Hyena.Gui.Theming/ThemeContext.cs \
 	Hyena.Gui.Theming/ThemeEngine.cs \
+	Hyena.Gui/BaseWidgetAccessible.cs \
 	Hyena.Gui/CairoExtensions.cs \
 	Hyena.Gui/CleanRoomStartup.cs \
 	Hyena.Gui/CompositeUtils.cs \
@@ -455,6 +473,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -558,11 +577,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -580,6 +600,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -609,6 +630,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -629,14 +651,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Hyena.Gui/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Hyena.Gui/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Hyena.Gui/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Hyena.Gui/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -654,25 +676,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -702,13 +740,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -740,6 +782,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -760,6 +803,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -768,18 +813,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -840,7 +895,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -857,6 +912,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Hyena/Hyena.Collections/CollectionExtensions.cs b/src/Libraries/Hyena/Hyena.Collections/CollectionExtensions.cs
index a42435c..99ed0a1 100644
--- a/src/Libraries/Hyena/Hyena.Collections/CollectionExtensions.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/CollectionExtensions.cs
@@ -31,7 +31,7 @@ using System.Text;
 using System.Collections.Generic;
 
 namespace Hyena.Collections
-{   
+{
     public static class CollectionExtensions
     {
         public static void SortedInsert<T> (List<T> list, T value) where T : IComparable
@@ -45,42 +45,42 @@ namespace Hyena.Collections
                 list.Insert (index < 0 ? ~index : index, value);
             }
         }
-        
+
         public static string Join<T> (IList<T> list)
         {
             return Join<T> (list, ", ");
         }
-        
+
         public static string Join<T> (IList<T> list, string separator)
         {
             return Join<T> (list, null, null, separator);
         }
-        
+
         public static string Join<T> (IList<T> list, string wrapper, string separator)
         {
             return Join<T> (list, wrapper, wrapper, separator);
         }
-        
+
         public static string Join<T> (IList<T> list, string front, string back, string separator)
         {
             StringBuilder builder = new StringBuilder ();
-            
+
             for (int i = 0, n = list.Count; i < n; i++) {
                 if (front != null) {
                     builder.Append (front);
                 }
-                
+
                 builder.Append (list[i]);
-                
+
                 if (back != null) {
                     builder.Append (back);
                 }
-                
+
                 if (i < n - 1) {
                     builder.Append (separator);
                 }
             }
-            
+
             return builder.ToString ();
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.Collections/IntervalHeap.cs b/src/Libraries/Hyena/Hyena.Collections/IntervalHeap.cs
index 641ae98..2db698c 100644
--- a/src/Libraries/Hyena/Hyena.Collections/IntervalHeap.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/IntervalHeap.cs
@@ -35,36 +35,36 @@ namespace Hyena.Collections
     public class IntervalHeap<T> : ICollection<T>, ICollection
     {
         private const int MIN_CAPACITY = 16;
-    
+
         private int count;
         private int generation;
-        
+
         private Interval [] heap;
-        
+
         public IntervalHeap ()
         {
             Clear ();
         }
-        
+
         public virtual T Pop ()
         {
             if (count == 0) {
                 throw new InvalidOperationException ();
             }
-            
+
             T item = heap[0].Item;
             MoveDown (0, heap[--count]);
             generation++;
-            
+
             return item;
         }
-        
+
         public virtual T Peek ()
         {
             if (count == 0) {
                 throw new InvalidOperationException ();
             }
-            
+
             return heap[0].Item;
         }
 
@@ -73,22 +73,22 @@ namespace Hyena.Collections
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
+
             if (count == heap.Length) {
                 OptimalArrayResize (ref heap, 1);
             }
-            
+
             MoveUp (++count - 1, new Interval (item, priority));
             generation++;
         }
-        
+
         public virtual void Clear ()
         {
             generation = 0;
             count = 0;
             heap = new Interval[MIN_CAPACITY];
         }
-        
+
         void ICollection.CopyTo (Array array, int index)
         {
             if (array == null) {
@@ -101,7 +101,7 @@ namespace Hyena.Collections
 
             Array.Copy (heap, 0, array, index, count);
         }
-        
+
         public virtual void CopyTo (T [] array, int index)
         {
             if (array == null) {
@@ -120,63 +120,63 @@ namespace Hyena.Collections
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
+
             return FindItemHeapIndex (item) >= 0;
         }
-        
+
         public virtual void Add (T item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
+
             Push (item, 0);
         }
-        
+
         public virtual bool Remove (T item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
+
             int index = FindItemHeapIndex (item);
-            
+
             if (index < 0) {
                 return false;
             }
-        
+
             MoveDown (index, heap[--count]);
             generation++;
-            
+
             return true;
         }
-        
+
         public virtual void TrimExcess ()
         {
             if (count < heap.Length * 0.9) {
                 Array.Resize (ref heap, count);
             }
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         public virtual IEnumerator<T> GetEnumerator ()
         {
             return new IntervalHeapEnumerator (this);
         }
-        
+
         public static IntervalHeap<T> Synchronized (IntervalHeap<T> heap)
         {
             if (heap == null) {
                 throw new ArgumentNullException ("heap");
             }
-            
+
             return new SyncIntervalHeap (heap);
         }
-        
+
         private int FindItemHeapIndex (T item)
         {
             for (int i = 0; i < count; i++) {
@@ -184,22 +184,22 @@ namespace Hyena.Collections
                     return i;
                 }
             }
-            
+
             return -1;
         }
-        
+
         private int GetLeftChildIndex (int index)
         {
             return index * 2 + 1;
         }
-        
+
         private int GetParentIndex (int index)
         {
             return (index - 1) / 2;
         }
-        
+
         private static void OptimalArrayResize (ref Interval [] array, int grow)
-        { 
+        {
             int new_capacity = array.Length == 0 ? 1 : array.Length;
             int min_capacity = array.Length == 0 ? MIN_CAPACITY : array.Length + grow;
 
@@ -213,193 +213,192 @@ namespace Hyena.Collections
         private void MoveUp (int index, Interval node)
         {
             int parent_index = GetParentIndex (index);
-            
+
             while (index > 0 && heap[parent_index].Priority < node.Priority) {
                 heap[index] = heap[parent_index];
                 index = parent_index;
                 parent_index = GetParentIndex (index);
             }
-            
+
             heap[index] = node;
         }
-        
+
         private void MoveDown (int index, Interval node)
         {
             int child_index = GetLeftChildIndex (index);
-            
+
             while (child_index < count) {
-                if (child_index + 1 < count 
+                if (child_index + 1 < count
                     && heap[child_index].Priority < heap[child_index + 1].Priority) {
                     child_index++;
                 }
-                
+
                 heap[index] = heap[child_index];
                 index = child_index;
                 child_index = GetLeftChildIndex (index);
             }
-            
+
             MoveUp (index, node);
         }
 
         public virtual int Count {
             get { return count; }
         }
-        
+
         public bool IsReadOnly {
             get { return false; }
         }
-        
+
         public virtual object SyncRoot {
             get { return this; }
         }
-        
+
         public virtual bool IsSynchronized {
             get { return false; }
         }
-        
+
         private struct Interval
         {
             private T item;
             private int priority;
-            
+
             public Interval (T item, int priority)
             {
                 this.item = item;
                 this.priority = priority;
             }
-            
+
             public T Item {
                 get { return item; }
             }
-            
-            public int Priority { 
+
+            public int Priority {
                 get { return priority; }
             }
         }
-        
+
         private class SyncIntervalHeap : IntervalHeap<T>
         {
             private IntervalHeap<T> heap;
-            
+
             internal SyncIntervalHeap (IntervalHeap<T> heap)
             {
                 this.heap = heap;
             }
-            
+
             public override int Count {
                 get { lock (heap) { return heap.Count; } }
             }
-            
+
             public override bool IsSynchronized {
                 get { return true; }
             }
-            
+
             public override object SyncRoot {
                 get { return heap.SyncRoot; }
             }
-            
+
             public override void Clear ()
             {
                 lock (heap) { heap.Clear (); }
             }
-            
+
             public override bool Contains(T item)
             {
                 lock (heap) { return heap.Contains (item); }
             }
-            
+
             public override T Pop()
             {
                 lock (heap) { return heap.Pop (); }
             }
-            
+
             public override T Peek ()
             {
                 lock (heap) { return heap.Peek (); }
             }
-            
+
             public override void Push (T item, int priority)
             {
                 lock (heap) { heap.Push (item, priority); }
             }
-            
+
             public override void Add (T item)
             {
                 lock (heap) { heap.Add (item); }
             }
-            
+
             public override bool Remove (T item)
             {
                 lock (heap) { return heap.Remove (item); }
             }
-            
+
             public override void TrimExcess ()
             {
                 lock (heap) { heap.TrimExcess (); }
             }
-            
+
             public override void CopyTo (T [] array, int index)
             {
                 lock (heap) { heap.CopyTo (array, index); }
             }
-            
+
             public override IEnumerator<T> GetEnumerator ()
             {
                 lock (heap) { return new IntervalHeapEnumerator (this); }
             }
         }
-    
+
         private class IntervalHeapEnumerator : IEnumerator<T>, IEnumerator
         {
             private IntervalHeap<T> heap;
             private int index;
             private int generation;
-            
+
             public IntervalHeapEnumerator (IntervalHeap<T> heap)
             {
                 this.heap = heap;
                 Reset ();
             }
-            
+
             public void Reset ()
             {
                 generation = heap.generation;
                 index = -1;
             }
-            
+
             public void Dispose ()
             {
                 heap = null;
             }
- 
+
             public bool MoveNext ()
             {
                 if (generation != heap.generation) {
                     throw new InvalidOperationException ();
                 }
-                
+
                 if (index + 1 == heap.count) {
                     return false;
                 }
-                
+
                 index++;
                 return true;
             }
-            
+
             object IEnumerator.Current {
                 get { return Current; }
             }
- 
+
             public T Current {
                 get {
                     if (generation != heap.generation) {
                         throw new InvalidOperationException ();
                     }
-                    
+
                     return heap.heap[index].Item;
                 }
             }
         }
     }
 }
- 
\ No newline at end of file
diff --git a/src/Libraries/Hyena/Hyena.Collections/LruCache.cs b/src/Libraries/Hyena/Hyena.Collections/LruCache.cs
index 7520e03..86b42fe 100644
--- a/src/Libraries/Hyena/Hyena.Collections/LruCache.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/LruCache.cs
@@ -39,13 +39,13 @@ namespace Hyena.Collections
             get { return key; }
             set { key = value; }
         }
-    
+
         private TValue value;
         public TValue Value {
             get { return this.value; }
             set { this.value = value; }
         }
-        
+
         internal DateTime LastUsed;
         internal int UsedCount;
     }
@@ -54,17 +54,17 @@ namespace Hyena.Collections
     {
         private Dictionary<TKey, CacheEntry<TKey, TValue>> cache;
         private int max_count;
-        
+
         public LruCache () : this (1024)
         {
         }
-        
+
         public LruCache (int maxCount)
         {
             max_count = maxCount;
             cache = new Dictionary<TKey, CacheEntry<TKey, TValue>> ();
         }
-        
+
         public void Add (TKey key, TValue value)
         {
             lock (cache) {
@@ -74,12 +74,12 @@ namespace Hyena.Collections
                     cache[key] = entry;
                     return;
                 }
-                
+
                 entry.Key = key;
                 entry.Value = value;
                 Ref (ref entry);
                 cache.Add (key, entry);
-                
+
                 if (Count >= max_count) {
                     TKey expire = FindOldestEntry ();
                     ExpireItem (cache[expire].Value);
@@ -87,14 +87,14 @@ namespace Hyena.Collections
                 }
             }
         }
-        
+
         public bool Contains (TKey key)
         {
             lock (cache) {
                 return cache.ContainsKey (key);
             }
         }
-        
+
         public bool TryGetValue (TKey key, out TValue value)
         {
             lock (cache) {
@@ -105,23 +105,23 @@ namespace Hyena.Collections
                     cache[key] = entry;
                     return true;
                 }
-                
+
                 value = default (TValue);
                 return false;
             }
         }
-        
+
         private void Ref (ref CacheEntry<TKey, TValue> entry)
         {
             entry.LastUsed = DateTime.Now;
             entry.UsedCount++;
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         public IEnumerator<CacheEntry<TKey, TValue>> GetEnumerator ()
         {
             lock (cache) {
@@ -130,12 +130,12 @@ namespace Hyena.Collections
                 }
             }
         }
-        
+
         // Ok, this blows. I have no time to implement anything clever or proper here.
         // Using a hashtable generally sucks for this, but it's not bad for a 15 minute
         // hack. max_count will be sufficiently small in our case that this can't be
         // felt anyway. Meh.
-        
+
         private TKey FindOldestEntry ()
         {
             lock (cache) {
@@ -150,16 +150,16 @@ namespace Hyena.Collections
                 return oldest_key;
             }
         }
-        
+
         protected virtual void ExpireItem (TValue item)
         {
         }
-        
+
         public int MaxCount {
             get { lock (cache) { return max_count; } }
             set { lock (cache) { max_count = value; } }
         }
-        
+
         public int Count {
             get { lock (cache) { return cache.Count; } }
         }
diff --git a/src/Libraries/Hyena/Hyena.Collections/QueuePipeline.cs b/src/Libraries/Hyena/Hyena.Collections/QueuePipeline.cs
index 541e893..6c869a3 100644
--- a/src/Libraries/Hyena/Hyena.Collections/QueuePipeline.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/QueuePipeline.cs
@@ -38,16 +38,16 @@ namespace Hyena.Collections
         #pragma warning restore 0067
 
         private object sync = new object ();
-        
+
         private QueuePipelineElement<T> first_element;
         internal QueuePipelineElement<T> FirstElement {
             get { return first_element; }
         }
-        
+
         public QueuePipeline ()
         {
         }
-        
+
         public void AddElement (QueuePipelineElement<T> element)
         {
             element.Finished += OnElementFinished;
@@ -56,7 +56,7 @@ namespace Hyena.Collections
                     first_element = element;
                     return;
                 }
-            
+
                 QueuePipelineElement<T> current = first_element;
 
                 while (current != null) {
@@ -64,21 +64,21 @@ namespace Hyena.Collections
                         current.NextElement = element;
                         break;
                     }
-                    
+
                     current = current.NextElement;
                 }
             }
         }
-        
+
         public virtual void Enqueue (T item)
         {
             if (first_element == null) {
                 throw new InvalidOperationException ("There are no elements in this pipeline");
             }
-            
+
             first_element.Enqueue (item);
         }
-        
+
         public virtual void Cancel ()
         {
             if (first_element != null) {
diff --git a/src/Libraries/Hyena/Hyena.Collections/QueuePipelineElement.cs b/src/Libraries/Hyena/Hyena.Collections/QueuePipelineElement.cs
index dc95885..a088d6c 100644
--- a/src/Libraries/Hyena/Hyena.Collections/QueuePipelineElement.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/QueuePipelineElement.cs
@@ -55,14 +55,14 @@ namespace Hyena.Collections
         public int ProcessedCount {
             get { return processed_count; }
         }
-        
+
         private int total_count;
         public int TotalCount {
             get { return total_count; }
         }
-        
+
         protected abstract T ProcessItem (T item);
-        
+
         protected virtual void OnFinished ()
         {
             lock (this) {
@@ -73,7 +73,7 @@ namespace Hyena.Collections
                 total_count = 0;
                 processed_count = 0;
             }
-            
+
             EventHandler handler = Finished;
             if (handler != null) {
                 handler (this, EventArgs.Empty);
@@ -87,7 +87,7 @@ namespace Hyena.Collections
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnCanceled ()
         {
             lock (queue) {
@@ -96,24 +96,24 @@ namespace Hyena.Collections
                 processed_count = 0;
             }
         }
-        
+
         public virtual void Enqueue (T item)
         {
-            lock (this) {                
+            lock (this) {
                 lock (queue) {
                     queue.Enqueue (item);
                     total_count++;
                 }
-                
+
                 if (!threaded) {
                     Processor (null);
                     return;
                 }
-                
+
                 if (thread_wait == null) {
                     thread_wait = new AutoResetEvent (false);
                 }
-                
+
                 if (Monitor.TryEnter (monitor)) {
                     Monitor.Exit (monitor);
                     ThreadPool.QueueUserWorkItem (Processor);
@@ -121,35 +121,35 @@ namespace Hyena.Collections
                 }
             }
         }
-        
+
         protected virtual void EnqueueDownstream (T item)
         {
             if (NextElement != null && item != null) {
                 NextElement.Enqueue (item);
             }
         }
-        
+
         private void Processor (object state)
         {
             lock (monitor) {
                 if (threaded) {
                     thread_wait.Set ();
                 }
-            
+
                 lock (this) {
                     processing = true;
                 }
-                
+
                 try {
                     while (queue.Count > 0) {
                         CheckForCanceled ();
-                        
+
                         T item = null;
                         lock (queue) {
                             item = queue.Dequeue ();
                             processed_count++;
                         }
-                        
+
                         EnqueueDownstream (ProcessItem (item));
                         OnProcessedItem ();
                     }
@@ -165,11 +165,11 @@ namespace Hyena.Collections
                     thread_wait.Close ();
                     thread_wait = null;
                 }
-                
+
                 OnFinished ();
             }
         }
-        
+
         protected virtual void CheckForCanceled ()
         {
             lock (this) {
@@ -178,39 +178,39 @@ namespace Hyena.Collections
                 }
             }
         }
-        
+
         public void Cancel ()
         {
             lock (this) {
                 if (processing) {
                     canceled = true;
                 }
-                
+
                 if (NextElement != null) {
                     NextElement.Cancel ();
                 }
             }
         }
-        
+
         public bool Processing {
             get { lock (this) { return processing; } }
         }
-        
+
         public bool Threaded {
             get { return threaded; }
-            set { 
+            set {
                 if (processing) {
                     throw new InvalidOperationException ("Cannot change threading model while the element is processing");
                 }
-                
-                threaded = value; 
+
+                threaded = value;
             }
         }
-        
+
         protected Queue<T> Queue {
             get { return queue; }
         }
-        
+
         private QueuePipelineElement<T> next_element;
         internal QueuePipelineElement<T> NextElement {
             get { return next_element; }
diff --git a/src/Libraries/Hyena/Hyena.Collections/RangeCollection.cs b/src/Libraries/Hyena/Hyena.Collections/RangeCollection.cs
index 4c4fd63..7973e18 100644
--- a/src/Libraries/Hyena/Hyena.Collections/RangeCollection.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/RangeCollection.cs
@@ -42,11 +42,11 @@ namespace Hyena.Collections
 #if NET_1_1
     internal
 #else
-    public 
+    public
 #endif
 
     class RangeCollection :
-        ICloneable, 
+        ICloneable,
 #if NET_2_0
         ICollection<int>
 #else
@@ -57,7 +57,7 @@ namespace Hyena.Collections
         {
             private int start;
             private int end;
-            
+
             public Range (int start, int end)
             {
                 this.start = start;
@@ -73,12 +73,12 @@ namespace Hyena.Collections
                 get { return start; }
                 set { start = value; }
             }
-            
+
             public int End {
                 get { return end; }
                 set { end = value; }
             }
-            
+
             public int Count {
                 get { return End - Start + 1; }
             }
@@ -104,23 +104,23 @@ namespace Hyena.Collections
             if (delta < 0) {
                 start -= delta;
             }
-            
+
             if (start < range_count) {
                 Array.Copy (ranges, start, ranges, start + delta, range_count - start);
             }
-            
+
             range_count += delta;
         }
 
         private void EnsureCapacity (int growBy)
-        { 
+        {
             int new_capacity = ranges.Length == 0 ? 1 : ranges.Length;
             int min_capacity = ranges.Length == 0 ? MIN_CAPACITY : ranges.Length + growBy;
 
             while (new_capacity < min_capacity) {
                 new_capacity <<= 1;
             }
-            
+
 #if NET_2_0
             Array.Resize (ref ranges, new_capacity);
 #else
@@ -129,34 +129,34 @@ namespace Hyena.Collections
             ranges = new_ranges;
 #endif
         }
-        
+
         private void Insert (int position, Range range)
         {
             if (range_count == ranges.Length) {
                 EnsureCapacity (1);
             }
-            
+
             Shift (position, 1);
             ranges[position] = range;
         }
-       
+
         private void RemoveAt (int position)
         {
             Shift (position, -1);
             Array.Clear (ranges, range_count, 1);
         }
-        
+
 #endregion
 
 #region Private Range Logic
-        
+
         private bool RemoveIndexFromRange (int index)
         {
             int range_index = FindRangeIndexForValue (index);
             if (range_index < 0) {
                 return false;
             }
-            
+
             Range range = ranges[range_index];
             if (range.Start == index && range.End == index) {
                 RemoveAt (range_index);
@@ -169,7 +169,7 @@ namespace Hyena.Collections
                 ranges[range_index].End = index - 1;
                 Insert (range_index + 1, split_range);
             }
-            
+
             index_count--;
             return true;
         }
@@ -177,7 +177,7 @@ namespace Hyena.Collections
         private void InsertRange (Range range)
         {
             int position = FindInsertionPosition (range);
-            bool merged_left = MergeLeft (range, position); 
+            bool merged_left = MergeLeft (range, position);
             bool merged_right = MergeRight (range, position);
 
             if (!merged_left && !merged_right) {
@@ -208,7 +208,7 @@ namespace Hyena.Collections
 
             return false;
         }
-        
+
         private static int CompareRanges (Range a, Range b)
         {
             return (a.Start + (a.End - a.Start)).CompareTo (b.Start + (b.End - b.Start));
@@ -218,29 +218,29 @@ namespace Hyena.Collections
         {
             int min = 0;
             int max = range_count - 1;
-            
+
             while (min <= max) {
                 int mid = min + ((max - min) / 2);
                 int cmp = CompareRanges (ranges[mid], range);
-                 
+
                 if (cmp == 0) {
                     return mid;
                 } else if (cmp > 0) {
                     if (mid > 0 && CompareRanges (ranges[mid - 1], range) < 0) {
                         return mid;
                     }
-                    
+
                     max = mid - 1;
                 } else {
                     min = mid + 1;
                 }
             }
-            
+
             return min;
         }
-        
+
         public int FindRangeIndexForValue (int value)
-        {  
+        {
             int min = 0;
 			int max = range_count - 1;
 			
@@ -258,8 +258,8 @@ namespace Hyena.Collections
 
 			return ~min;
         }
-        
-#endregion 
+
+#endregion
 
 #region Public RangeCollection API
 
@@ -270,45 +270,45 @@ namespace Hyena.Collections
                 return ranges_copy;
             }
         }
-        
+
         public int RangeCount {
             get { return range_count; }
         }
-          
+
 #if NET_2_0
         [Obsolete ("Do not use the Indexes property in 2.0 profiles if enumerating only; Indexes allocates an array to avoid boxing in the 1.1 profile")]
 #endif
         public int [] Indexes {
-            get { 
+            get {
                 if (indexes_cache != null && generation == indexes_cache_generation) {
                     return indexes_cache;
                 }
-                
+
                 indexes_cache = new int[Count];
                 indexes_cache_generation = generation;
-                
+
                 for (int i = 0, j = 0; i < range_count; i++) {
                     for (int k = ranges[i].Start; k <= ranges[i].End; j++, k++) {
                         indexes_cache[j] = k;
                     }
                 }
-                
+
                 return indexes_cache;
             }
         }
-        
+
         public int IndexOf (int value)
         {
             int offset = 0;
-            
+
             foreach (Range range in ranges) {
                 if (value >= range.Start && value <= range.End) {
                     return offset + (value - range.Start);
                 }
-                
+
                 offset += range.End - range.Start + 1;
             }
-            
+
             return -1;
         }
 
@@ -319,7 +319,7 @@ namespace Hyena.Collections
                         return ranges[i].End - (cuml_count - index) + 1;
                     }
                 }
-                
+
                 throw new IndexOutOfRangeException (index.ToString ());
             }
         }
@@ -336,10 +336,10 @@ namespace Hyena.Collections
                 index_count++;
                 return true;
             }
-            
+
             return false;
         }
-        
+
         void
 #if NET_2_0
         ICollection<int>.
@@ -350,63 +350,63 @@ namespace Hyena.Collections
         {
             Add (value);
         }
-                
+
         public bool Remove (int value)
         {
             generation++;
             return RemoveIndexFromRange (value);
         }
-        
+
         public void Clear ()
         {
             range_count = 0;
             index_count = 0;
             generation++;
-            ranges = new Range[MIN_CAPACITY];   
+            ranges = new Range[MIN_CAPACITY];
         }
-        
+
         public bool Contains (int value)
         {
             return FindRangeIndexForValue (value) >= 0;
         }
-        
+
         public void CopyTo (int [] array, int index)
         {
             throw new NotImplementedException ();
         }
-        
+
         public void CopyTo (Array array, int index)
         {
             throw new NotImplementedException ();
         }
-        
+
         public int Count {
             get { return index_count; }
         }
-        
+
         public bool IsReadOnly {
             get { return false; }
         }
 
-#if !NET_2_0        
+#if !NET_2_0
         public bool IsSynchronized {
             get { return false; }
         }
-        
+
         public object SyncRoot {
             get { return this; }
         }
 #endif
 
 #endregion
-        
+
 #region ICloneable Implementation
 
         public object Clone ()
         {
             return MemberwiseClone ();
         }
-        
+
 #endregion
 
 #region IEnumerable Implementation
@@ -420,7 +420,7 @@ namespace Hyena.Collections
                 }
             }
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
diff --git a/src/Libraries/Hyena/Hyena.Collections/Selection.cs b/src/Libraries/Hyena/Hyena.Collections/Selection.cs
index 75768dd..39a86b1 100644
--- a/src/Libraries/Hyena/Hyena.Collections/Selection.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/Selection.cs
@@ -39,9 +39,9 @@ namespace Hyena.Collections
 #if NET_1_1
     internal
 #else
-    public 
+    public
 #endif
-    
+
     class Selection :
 #if NET_2_0
         IEnumerable<int>
@@ -52,17 +52,24 @@ namespace Hyena.Collections
         RangeCollection ranges = new RangeCollection ();
         private int max_index;
         private int first_selected_index;
-        private int focused_index = -1;
-        
+
         public event EventHandler Changed;
-        
+        public event EventHandler FocusChanged;
+        private int focused_index = -1;
+
         public Selection ()
         {
         }
-        
+
         public int FocusedIndex {
             get { return focused_index; }
-            set { focused_index = value; }
+            set {
+                focused_index = value;
+                var handler = FocusChanged;
+                if (handler != null) {
+                    handler (this, EventArgs.Empty);
+                }
+            }
         }
 
         protected virtual void OnChanged ()
@@ -72,16 +79,16 @@ namespace Hyena.Collections
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public void ToggleSelect (int index)
         {
             if (!ranges.Remove (index)) {
                 ranges.Add (index);
             }
-            
+
             OnChanged ();
         }
-        
+
         public void Select (int index)
         {
             ranges.Add (index);
@@ -96,7 +103,7 @@ namespace Hyena.Collections
             if (Count == 1)
                 first_selected_index = index;
         }
-        
+
         public void Unselect (int index)
         {
             if (ranges.Remove (index))
@@ -107,7 +114,7 @@ namespace Hyena.Collections
         {
             ranges.Remove (index);
         }
-                    
+
         public bool Contains(int index)
         {
             return ranges.Contains (index);
@@ -125,7 +132,7 @@ namespace Hyena.Collections
             else
                 Select (end);
         }
-        
+
         public void SelectRange (int a, int b)
         {
             int start = Math.Min (a, b);
@@ -138,7 +145,7 @@ namespace Hyena.Collections
 
             if (Count == i)
                 first_selected_index = a;
-            
+
             OnChanged ();
         }
 
@@ -160,64 +167,64 @@ namespace Hyena.Collections
             SelectRange (0, max_index);
         }
 
-        public void Clear () 
+        public void Clear ()
         {
             Clear (true);
         }
-        
+
         public void Clear (bool raise)
         {
             if (ranges.Count <= 0) {
                 return;
             }
-            
+
             ranges.Clear ();
             if (raise)
                 OnChanged ();
         }
-        
+
         public int Count {
             get { return ranges.Count; }
         }
-        
+
         public int MaxIndex {
             set { max_index = value; }
             get { return max_index; }
         }
-        
+
         public virtual bool AllSelected {
-            get { 
+            get {
                 if (ranges.RangeCount == 1) {
                     RangeCollection.Range range = ranges.Ranges[0];
                     return range.Start == 0 && range.End == max_index;
                 }
-                
+
                 return false;
             }
         }
 
-        protected RangeCollection RangeCollection {
+        public RangeCollection RangeCollection {
             get { return ranges; }
         }
 
         public RangeCollection.Range [] Ranges {
             get { return ranges.Ranges; }
         }
-        
+
         public int FirstIndex {
             get { return Count > 0 ? ranges[0] : -1; }
         }
-        
+
         public int LastIndex {
             get { return Count > 0 ? ranges[Count - 1]: -1; }
         }
-        
+
 #if NET_2_0
         public IEnumerator<int> GetEnumerator ()
         {
             return ranges.GetEnumerator ();
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
diff --git a/src/Libraries/Hyena/Hyena.Collections/Tests/IntervalHeapTests.cs b/src/Libraries/Hyena/Hyena.Collections/Tests/IntervalHeapTests.cs
index 01fa7db..4fdf49e 100644
--- a/src/Libraries/Hyena/Hyena.Collections/Tests/IntervalHeapTests.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/Tests/IntervalHeapTests.cs
@@ -40,7 +40,7 @@ namespace Hyena.Collections.Tests
     {
         private IntervalHeap<int> heap;
         private static int [] heap_data = new int[2048];
-        
+
         [TestFixtureSetUp]
         public void Init()
         {
@@ -53,11 +53,11 @@ namespace Hyena.Collections.Tests
         private void PopulateHeap()
         {
             heap.Clear();
-            
+
             foreach(int i in heap_data) {
                 heap.Push(i, 0);
             }
-            
+
             Assert.AreEqual(heap.Count, heap_data.Length);
         }
 
@@ -65,7 +65,7 @@ namespace Hyena.Collections.Tests
         public void PopHeap()
         {
             PopulateHeap();
-            
+
             int i = 0;
             while(heap.Count > 0) {
                 heap.Pop();
@@ -118,7 +118,7 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual(h.Pop(), 3);
             Assert.AreEqual(h.Pop(), 1);
 
-            Assert.AreEqual(h.Count, 0);        
+            Assert.AreEqual(h.Count, 0);
         }
     }
 }
diff --git a/src/Libraries/Hyena/Hyena.Collections/Tests/QueuePipelineTests.cs b/src/Libraries/Hyena/Hyena.Collections/Tests/QueuePipelineTests.cs
index 35237df..1b96058 100644
--- a/src/Libraries/Hyena/Hyena.Collections/Tests/QueuePipelineTests.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/Tests/QueuePipelineTests.cs
@@ -47,7 +47,7 @@ namespace Hyena.Collections.Tests
                 return null;
             }
         }
-    
+
         [Test]
         public void BuildPipeline ()
         {
@@ -57,21 +57,21 @@ namespace Hyena.Collections.Tests
             BuildPipeline (10);
             BuildPipeline (1000);
         }
-        
+
         private void BuildPipeline (int count)
         {
             List<FakeElement> elements = new List<FakeElement> ();
             for (int i = 0; i < count; i++) {
                 elements.Add (new FakeElement ());
             }
-        
+
             QueuePipeline<object> qp = new QueuePipeline<object> ();
             foreach (FakeElement s in elements) {
                 qp.AddElement (s);
             }
-            
+
             Assert.AreEqual (elements[0], qp.FirstElement);
-            
+
             int index = 0;
             FakeElement element = (FakeElement)qp.FirstElement;
             while (element != null) {
diff --git a/src/Libraries/Hyena/Hyena.Collections/Tests/RangeCollectionTests.cs b/src/Libraries/Hyena/Hyena.Collections/Tests/RangeCollectionTests.cs
index bb81b8c..b461573 100644
--- a/src/Libraries/Hyena/Hyena.Collections/Tests/RangeCollectionTests.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/Tests/RangeCollectionTests.cs
@@ -43,16 +43,16 @@ namespace Hyena.Collections.Tests
         {
             _TestRanges (new RangeCollection (), new int [] { 1, 11, 5, 7, 15, 32, 3, 9, 34 });
         }
-        
+
         [Test]
         public void MergedRanges ()
         {
             RangeCollection range = new RangeCollection ();
             int [] indexes = new int [] { 0, 7, 5, 9, 1, 6, 8, 2, 10, 12 };
-            
+
             _TestRanges (range, indexes);
             Assert.AreEqual (3, range.RangeCount);
-            
+
             int i= 0;
             foreach (RangeCollection.Range r in range.Ranges) {
                 switch (i++) {
@@ -74,94 +74,94 @@ namespace Hyena.Collections.Tests
                 }
             }
         }
-        
+
         [Test]
         public void LargeSequentialContains ()
         {
             RangeCollection range = new RangeCollection ();
             int i, n = 1000000;
-            
+
             for (i = 0; i < n; i++) {
                 range.Add (i);
             }
-            
+
             for (i = 0; i < n; i++) {
                 Assert.AreEqual (true, range.Contains (i));
             }
         }
-        
+
         [Test]
         public void LargeSequential ()
-        { 
+        {
             RangeCollection range = new RangeCollection ();
             int i, n = 1000000;
-            
+
             for (i = 0; i < n; i++) {
                 range.Add (i);
                 Assert.AreEqual (1, range.RangeCount);
             }
-            
+
             Assert.AreEqual (n, range.Count);
-            
+
             i = 0;
             foreach (int j in range) {
                 Assert.AreEqual (i++, j);
             }
-            
+
             Assert.AreEqual (n, i);
         }
-    
+
         [Test]
         public void LargeNonAdjacent ()
-        { 
+        {
             RangeCollection range = new RangeCollection ();
             int i, n = 1000000;
-            
+
             for (i = 0; i < n; i += 2) {
                 range.Add (i);
             }
-            
+
             Assert.AreEqual (n / 2, range.Count);
-            
+
             i = 0;
             foreach (int j in range) {
                 Assert.AreEqual (i, j);
                 i += 2;
             }
-            
+
             Assert.AreEqual (n, i);
         }
-    
+
         private static void _TestRanges (RangeCollection range, int [] indexes)
         {
             foreach (int index in indexes) {
                 range.Add (index);
             }
-            
+
             Assert.AreEqual (indexes.Length, range.Count);
-            
+
             Array.Sort (indexes);
-            
+
             int i = 0;
             foreach (int index in range) {
                 Assert.AreEqual (indexes[i++], index);
             }
-            
+
             #pragma warning disable 0618
-    
+
             i = 0;
             foreach (int index in range.Indexes) {
                 Assert.AreEqual (indexes[i++], index);
             }
-            
+
             for (i = 0; i < range.Indexes.Length; i++) {
                 Assert.AreEqual (indexes[i], range.Indexes[i]);
             }
-    
+
             #pragma warning restore 0618
-    
+
         }
-        
+
         [Test]
         public void RemoveSingles ()
         {
@@ -170,29 +170,29 @@ namespace Hyena.Collections.Tests
             foreach (int index in indexes) {
                 range.Add (index);
             }
-            
+
             foreach (int index in indexes) {
                 Assert.AreEqual (true, range.Remove (index));
             }
         }
-        
+
         [Test]
         public void RemoveStarts ()
         {
             RangeCollection range = _SetupTestRemoveMerges ();
-            
+
             Assert.AreEqual (true, range.Contains (0));
             range.Remove (0);
             Assert.AreEqual (false, range.Contains (0));
             Assert.AreEqual (4, range.RangeCount);
-            
+
             Assert.AreEqual (true, range.Contains (2));
             range.Remove (2);
             Assert.AreEqual (false, range.Contains (2));
             Assert.AreEqual (4, range.RangeCount);
             Assert.AreEqual (3, range.Ranges[0].Start);
             Assert.AreEqual (5, range.Ranges[0].End);
-            
+
             Assert.AreEqual (true, range.Contains (14));
             range.Remove (14);
             Assert.AreEqual (false, range.Contains (14));
@@ -200,19 +200,19 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (15, range.Ranges[2].Start);
             Assert.AreEqual (15, range.Ranges[2].End);
         }
-         
+
         [Test]
         public void RemoveEnds ()
         {
             RangeCollection range = _SetupTestRemoveMerges ();
-            
+
             Assert.AreEqual (true, range.Contains (5));
             range.Remove (5);
             Assert.AreEqual (false, range.Contains (5));
             Assert.AreEqual (5, range.RangeCount);
             Assert.AreEqual (2, range.Ranges[1].Start);
             Assert.AreEqual (4, range.Ranges[1].End);
-            
+
             Assert.AreEqual (true, range.Contains (15));
             range.Remove (15);
             Assert.AreEqual (false, range.Contains (15));
@@ -220,12 +220,12 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (14, range.Ranges[3].Start);
             Assert.AreEqual (14, range.Ranges[3].End);
         }
-        
+
         [Test]
         public void RemoveMids ()
         {
             RangeCollection range = _SetupTestRemoveMerges ();
-            
+
             Assert.AreEqual (5, range.RangeCount);
             Assert.AreEqual (14, range.Ranges[3].Start);
             Assert.AreEqual (15, range.Ranges[3].End);
@@ -240,22 +240,22 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (14, range.Ranges[4].Start);
             Assert.AreEqual (15, range.Ranges[4].End);
         }
-        
+
         private static RangeCollection _SetupTestRemoveMerges ()
         {
             RangeCollection range = new RangeCollection ();
-            int [] indexes = new int [] { 
-                0, 
+            int [] indexes = new int [] {
+                0,
                 2, 3, 4, 5,
                 7, 8, 9, 10, 11,
                 14, 15,
                 17, 18, 19
             };
-            
+
             foreach (int index in indexes) {
                 range.Add (index);
             }
-            
+
             int i = 0;
             foreach (RangeCollection.Range r in range.Ranges) {
                 switch (i++) {
@@ -284,43 +284,43 @@ namespace Hyena.Collections.Tests
                         break;
                 }
             }
-            
+
             return range;
         }
-        
+
         #pragma warning disable 0618
-        
+
         [Test]
         public void IndexesCacheGeneration ()
         {
             RangeCollection range = new RangeCollection ();
             int [] index_cache = range.Indexes;
-            
+
             Assert.AreSame (index_cache, range.Indexes);
-            
+
             range.Add (0);
             range.Add (5);
-            
+
             if (index_cache == range.Indexes) {
                 Assert.Fail ("Indexes Cache not regenerated after change");
             }
-            
+
             index_cache = range.Indexes;
             range.Remove (0);
             range.Add (3);
-    
+
             if (index_cache == range.Indexes) {
                 Assert.Fail ("Indexes Cache not regenerated after change");
             }
         }
-        
+
         #pragma warning restore 0618
-    
+
         [Test]
         public void IndexOf ()
         {
             RangeCollection range = new RangeCollection ();
-            
+
             range.Add (0);
             range.Add (2);
             range.Add (3);
@@ -331,7 +331,7 @@ namespace Hyena.Collections.Tests
             range.Add (11);
             range.Add (12);
             range.Add (13);
-            
+
             Assert.AreEqual (0, range.IndexOf (0));
             Assert.AreEqual (1, range.IndexOf (2));
             Assert.AreEqual (2, range.IndexOf (3));
@@ -344,27 +344,27 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (9, range.IndexOf (13));
             Assert.AreEqual (-1, range.IndexOf (99));
         }
-        
+
         [Test]
         public void IndexerForGoodIndexes ()
         {
             RangeCollection range = new RangeCollection ();
-            
+
             /*
             Range  Idx  Value
             0-2    0 -> 0
                    1 -> 1
                    2 -> 2
-            
+
             7-9    3 -> 7
                    4 -> 8
                    5 -> 9
-            
+
             11-13  6 -> 11
                    7 -> 12
                    8 -> 13
             */
-            
+
             range.Add (0);
             range.Add (1);
             range.Add (2);
@@ -374,7 +374,7 @@ namespace Hyena.Collections.Tests
             range.Add (11);
             range.Add (12);
             range.Add (13);
-            
+
             Assert.AreEqual (0, range[0]);
             Assert.AreEqual (1, range[1]);
             Assert.AreEqual (2, range[2]);
@@ -385,27 +385,27 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (12, range[7]);
             Assert.AreEqual (13, range[8]);
         }
-    
+
         [Test]
         public void StressForGoodIndexes ()
         {
             Random random = new Random (0xbeef);
             RangeCollection ranges = new RangeCollection ();
             List<int> indexes = new List<int> ();
-            
+
             for (int i = 0, n = 75000; i < n; i++) {
                 int value = random.Next (n);
                 if (ranges.Add (value)) {
                     CollectionExtensions.SortedInsert (indexes, value);
                 }
-            } 
-            
+            }
+
             Assert.AreEqual (indexes.Count, ranges.Count);
             for (int i = 0; i < indexes.Count; i++) {
                 Assert.AreEqual (indexes[i], ranges[i]);
             }
         }
-        
+
         [Test]
         [ExpectedException (typeof (IndexOutOfRangeException))]
         public void IndexerForNegativeBadIndex ()
@@ -413,7 +413,7 @@ namespace Hyena.Collections.Tests
             RangeCollection range = new RangeCollection ();
             Assert.AreEqual (0, range[1]);
         }
-        
+
         [Test]
         [ExpectedException (typeof (IndexOutOfRangeException))]
         public void IndexerForZeroBadIndex ()
@@ -421,7 +421,7 @@ namespace Hyena.Collections.Tests
             RangeCollection range = new RangeCollection ();
             Assert.AreEqual (0, range[0]);
         }
-        
+
         [Test]
         [ExpectedException (typeof (IndexOutOfRangeException))]
         public void IndexerForPositiveBadIndex ()
@@ -430,7 +430,7 @@ namespace Hyena.Collections.Tests
             range.Add (1);
             Assert.AreEqual (0, range[1]);
         }
-        
+
         [Test]
         public void ExplicitInterface ()
         {
@@ -439,10 +439,10 @@ namespace Hyena.Collections.Tests
             range.Add (2);
             range.Add (5);
             range.Add (6);
-            
+
             Assert.AreEqual (4, range.Count);
         }
-        
+
         [Test]
         public void NegativeIndices ()
         {
@@ -464,7 +464,7 @@ namespace Hyena.Collections.Tests
             Assert.AreEqual (new RangeCollection.Range (-5, -5), c.Ranges[1], "#7");
             Assert.AreEqual (new RangeCollection.Range (5, 5), c.Ranges[2], "#8");
             Assert.AreEqual (new RangeCollection.Range (10, 10), c.Ranges[3], "#9");
-            
+
             Assert.AreEqual (0, c.FindRangeIndexForValue (-9), "#10");
             Assert.IsTrue (c.FindRangeIndexForValue (-7) < 0, "#11");
         }
@@ -480,12 +480,12 @@ namespace Hyena.Collections.Tests
             for (int i = start; i <= end; i++) {
                 ranges.Add (i);
             }
-            
+
             Assert.IsTrue (ranges.Contains (GetAddress ("127.0.0.15")));
             Assert.IsFalse (ranges.Contains (GetAddress ("127.0.0.0")));
             Assert.IsFalse (ranges.Contains (GetAddress ("127.0.0.51")));
         }
-        
+
         private static int GetAddress (string addressStr)
         {
             System.Net.IPAddress address = System.Net.IPAddress.Parse (addressStr);
diff --git a/src/Libraries/Hyena/Hyena.Collections/WriteLineElement.cs b/src/Libraries/Hyena/Hyena.Collections/WriteLineElement.cs
index f1277cd..3d3b37f 100644
--- a/src/Libraries/Hyena/Hyena.Collections/WriteLineElement.cs
+++ b/src/Libraries/Hyena/Hyena.Collections/WriteLineElement.cs
@@ -36,7 +36,7 @@ namespace Hyena.Collections
         {
             Threaded = false;
         }
-        
+
         protected override T ProcessItem (T item)
         {
             Console.WriteLine (item);
diff --git a/src/Libraries/Hyena/Hyena.CommandLine/CommandLineParser.cs b/src/Libraries/Hyena/Hyena.CommandLine/CommandLineParser.cs
index 91325d2..b5e5e19 100644
--- a/src/Libraries/Hyena/Hyena.CommandLine/CommandLineParser.cs
+++ b/src/Libraries/Hyena/Hyena.CommandLine/CommandLineParser.cs
@@ -1,4 +1,4 @@
-// 
+//
 // CommandLineParser.cs
 //
 // Author:
@@ -38,14 +38,14 @@ namespace Hyena.CommandLine
         {
             public int Order;
             public string Value;
-            
+
             public Argument (int order, string value)
             {
                 Order = order;
                 Value = value;
             }
         }
-    
+
         private int generation;
         private int sorted_args_generation;
         private int offset;
@@ -53,19 +53,19 @@ namespace Hyena.CommandLine
         private KeyValuePair<string, Argument> [] sorted_args;
         private Dictionary<string, Argument> parsed_arguments = new Dictionary<string, Argument> ();
         private List<string> file_list = new List<string> ();
-        
+
         public CommandLineParser () : this (Environment.GetCommandLineArgs (), 1)
         {
         }
-        
+
         public CommandLineParser (string [] arguments, int offset)
         {
             this.arguments = arguments;
             this.offset = offset;
-            
+
             Parse ();
         }
-        
+
         private void Parse ()
         {
             for (int i = offset; i < arguments.Length; i++) {
@@ -73,7 +73,7 @@ namespace Hyena.CommandLine
                     file_list.Add (arguments[i]);
                     continue;
                 }
-                
+
                 string name = OptionName (arguments[i]);
                 string value = String.Empty;
 
@@ -82,7 +82,7 @@ namespace Hyena.CommandLine
                     value = name.Substring (eq_offset + 1);
                     name = name.Substring (0, eq_offset);
                 }
-                 
+
                 if (parsed_arguments.ContainsKey (name)) {
                     parsed_arguments[name] = new Argument (i, value);
                 } else {
@@ -90,22 +90,22 @@ namespace Hyena.CommandLine
                 }
             }
         }
-        
+
         private bool IsOption (string argument)
         {
             return argument.Length > 2 && argument.Substring (0, 2) == "--";
         }
-        
+
         private string OptionName (string argument)
         {
             return argument.Substring (2);
         }
-        
+
         public bool Contains (string name)
         {
             return parsed_arguments.ContainsKey (name);
         }
-        
+
         public bool ContainsStart (string start)
         {
             foreach (string argument in parsed_arguments.Keys) {
@@ -115,34 +115,34 @@ namespace Hyena.CommandLine
             }
             return false;
         }
-        
+
         public string this[string name] {
             get { return Contains (name) ? parsed_arguments[name].Value : String.Empty; }
-            set { 
+            set {
                 Argument arg = parsed_arguments[name];
                 arg.Value = value;
                 parsed_arguments[name] = arg;
                 generation++;
             }
         }
-        
+
         public IEnumerable<KeyValuePair<string, string>> Arguments {
             get {
-                if (sorted_args == null || sorted_args_generation != generation) {                
+                if (sorted_args == null || sorted_args_generation != generation) {
                     sorted_args = new KeyValuePair<string, Argument>[parsed_arguments.Count];
                     int i = 0;
-                    
+
                     foreach (KeyValuePair<string, Argument> arg in parsed_arguments) {
                         sorted_args[i++] = arg;
                     }
-                    
+
                     Array.Sort (sorted_args, delegate (KeyValuePair<string, Argument> a, KeyValuePair<string, Argument> b) {
                         return a.Value.Order.CompareTo (b.Value.Order);
                     });
-                    
+
                     sorted_args_generation = generation;
                 }
-                
+
                 foreach (KeyValuePair<string, Argument> arg in sorted_args) {
                     yield return new KeyValuePair<string, string> (arg.Key, arg.Value.Value);
                 }
@@ -152,21 +152,21 @@ namespace Hyena.CommandLine
         public ReadOnlyCollection<string> Files {
             get { return new ReadOnlyCollection<string> (file_list); }
         }
-            
+
         public override string ToString ()
         {
             System.Text.StringBuilder builder = new System.Text.StringBuilder ();
 
             builder.Append ("Parsed Arguments\n");
             foreach (KeyValuePair<string, Argument> argument in parsed_arguments) {
-                builder.AppendFormat ("  {0} = [{1}]\n", argument.Key, argument.Value.Value); 
+                builder.AppendFormat ("  {0} = [{1}]\n", argument.Key, argument.Value.Value);
             }
-            
+
             builder.Append ("\nFile List\n");
             foreach (string file in file_list) {
                 builder.AppendFormat ("{0}\n", file);
             }
-            
+
             return builder.ToString ();
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.CommandLine/Layout.cs b/src/Libraries/Hyena/Hyena.CommandLine/Layout.cs
index f4797fb..665c198 100644
--- a/src/Libraries/Hyena/Hyena.CommandLine/Layout.cs
+++ b/src/Libraries/Hyena/Hyena.CommandLine/Layout.cs
@@ -35,7 +35,7 @@ namespace Hyena.CommandLine
     public class Layout
     {
         private List<LayoutGroup> groups;
-        
+
         public Layout (List<LayoutGroup> groups)
         {
             this.groups = groups;
@@ -44,33 +44,33 @@ namespace Hyena.CommandLine
         public Layout (params LayoutGroup [] groups) : this (new List<LayoutGroup> (groups))
         {
         }
-        
+
         private int TerminalWidth {
             get { return Console.WindowWidth <= 0 ? 80 : Console.WindowWidth; }
         }
-        
+
         public string ToString (params string [] groupIds)
         {
             return ToString (GroupIdsToGroups (groupIds));
         }
-        
+
         public override string ToString ()
         {
             return ToString (groups);
         }
-        
+
         public string ToString (IEnumerable<LayoutGroup> groups)
         {
             StringBuilder builder = new StringBuilder ();
-            
+
             int min_spacing = 6;
-            
+
             int group_index = 0;
             int group_count = 0;
             int max_option_length = 0;
             int max_description_length = 0;
             int description_alignment = 0;
-            
+
             foreach (LayoutGroup group in groups) {
                 foreach (LayoutOption option in group) {
                     if (option.Name.Length > max_option_length) {
@@ -78,54 +78,54 @@ namespace Hyena.CommandLine
                     }
                 }
             }
-            
+
             max_description_length = TerminalWidth - max_option_length - min_spacing - 4;
             description_alignment = max_option_length + min_spacing + 4;
-            
+
             IEnumerator<LayoutGroup> enumerator = groups.GetEnumerator ();
             while (enumerator.MoveNext ()) {
                 group_count++;
             }
-            
+
             foreach (LayoutGroup group in groups) {
                 if (group.Id != "default") {
                     builder.Append (group.Title);
                     builder.AppendLine ();
                     builder.AppendLine ();
                 }
-                
+
                 for (int i = 0, n = group.Count; i < n; i++) {
                     int spacing = (max_option_length - group[i].Name.Length) + min_spacing;
-                    builder.AppendFormat ("  --{0}{2}{1}", group[i].Name, 
-                        WrapAlign (group[i].Description, max_description_length, 
+                    builder.AppendFormat ("  --{0}{2}{1}", group[i].Name,
+                        WrapAlign (group[i].Description, max_description_length,
                             description_alignment, i == n - 1),
                         String.Empty.PadRight (spacing));
                     builder.AppendLine ();
                 }
-                
+
                 if (group_index++ < group_count - 1) {
                     builder.AppendLine ();
                 }
             }
-            
+
             return builder.ToString ();
         }
-        
+
         public string LayoutLine (string str)
         {
             return WrapAlign (str, TerminalWidth, 0, true);
         }
-        
+
         private static string WrapAlign (string str, int width, int align, bool last)
         {
             StringBuilder builder = new StringBuilder ();
             bool did_wrap = false;
-            
+
             for (int i = 0, b = 0; i < str.Length; i++, b++) {
                 if (str[i] == ' ') {
                     int word_length = 0;
                     for (int j = i + 1; j < str.Length && str[j] != ' '; word_length++, j++);
-                    
+
                     if (b + word_length >= width) {
                         builder.AppendLine ();
                         builder.Append (String.Empty.PadRight (align));
@@ -134,27 +134,27 @@ namespace Hyena.CommandLine
                         continue;
                     }
                 }
-                
+
                 builder.Append (str[i]);
             }
-            
+
             if (did_wrap && !last) {
                 builder.AppendLine ();
             }
-            
+
             return builder.ToString ();
         }
-        
+
         public void Add (LayoutGroup group)
         {
             groups.Add (group);
         }
-        
+
         public void Remove (LayoutGroup group)
         {
             groups.Remove (group);
         }
-        
+
         public void Remove (string groupId)
         {
             LayoutGroup group = FindGroup (groupId);
@@ -162,7 +162,7 @@ namespace Hyena.CommandLine
                 groups.Remove (group);
             }
         }
-        
+
         private LayoutGroup FindGroup (string id)
         {
             foreach (LayoutGroup group in groups) {
@@ -170,25 +170,25 @@ namespace Hyena.CommandLine
                     return group;
                 }
             }
-            
+
             return null;
         }
-        
+
         private IEnumerable<LayoutGroup> GroupIdsToGroups (string [] groupIds)
         {
             foreach (string group_id in groupIds) {
                 LayoutGroup group = FindGroup (group_id);
                 if (group != null) {
                     yield return group;
-                }    
+                }
             }
         }
-        
+
         public static LayoutOption Option (string name, string description)
         {
             return new LayoutOption (name, description);
         }
-        
+
         public static LayoutGroup Group (string id, string title, params LayoutOption [] options)
         {
             return new LayoutGroup (id, title, options);
diff --git a/src/Libraries/Hyena/Hyena.CommandLine/LayoutGroup.cs b/src/Libraries/Hyena/Hyena.CommandLine/LayoutGroup.cs
index 4054937..757f559 100644
--- a/src/Libraries/Hyena/Hyena.CommandLine/LayoutGroup.cs
+++ b/src/Libraries/Hyena/Hyena.CommandLine/LayoutGroup.cs
@@ -1,4 +1,4 @@
-// 
+//
 // LayoutGroup.cs
 //
 // Author:
@@ -36,44 +36,44 @@ namespace Hyena.CommandLine
         private List<LayoutOption> options;
         private string id;
         private string title;
-        
+
         public LayoutGroup (string id, string title, List<LayoutOption> options)
         {
             this.id = id;
             this.title = title;
             this.options = options;
         }
-        
-        public LayoutGroup (string id, string title, params LayoutOption [] options) 
+
+        public LayoutGroup (string id, string title, params LayoutOption [] options)
             : this (id, title, new List<LayoutOption> (options))
         {
         }
-        
+
         public IEnumerator<LayoutOption> GetEnumerator ()
         {
             return options.GetEnumerator ();
         }
-        
+
         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         public void Add (LayoutOption option)
         {
             options.Add (option);
         }
-        
+
         public void Add (string name, string description)
         {
             options.Add (new LayoutOption (name, description));
         }
-        
+
         public void Remove (LayoutOption option)
         {
             options.Remove (option);
         }
-        
+
         public void Remove (string optionName)
         {
             LayoutOption option = FindOption (optionName);
@@ -81,7 +81,7 @@ namespace Hyena.CommandLine
                 options.Remove (option);
             }
         }
-        
+
         private LayoutOption FindOption (string name)
         {
             foreach (LayoutOption option in options) {
@@ -89,27 +89,27 @@ namespace Hyena.CommandLine
                     return option;
                 }
             }
-            
+
             return null;
         }
-        
+
         public LayoutOption this[int index] {
             get { return options[index]; }
             set { options[index] = value; }
         }
-        
+
         public int Count {
             get { return options.Count; }
         }
-        
+
         public string Id {
             get { return id; }
         }
-        
+
         public string Title {
             get { return title; }
         }
-        
+
         public IList<LayoutOption> Options {
             get { return options; }
         }
diff --git a/src/Libraries/Hyena/Hyena.CommandLine/LayoutOption.cs b/src/Libraries/Hyena/Hyena.CommandLine/LayoutOption.cs
index e27bf70..8a01041 100644
--- a/src/Libraries/Hyena/Hyena.CommandLine/LayoutOption.cs
+++ b/src/Libraries/Hyena/Hyena.CommandLine/LayoutOption.cs
@@ -1,4 +1,4 @@
-// 
+//
 // LayoutOption.cs
 //
 // Author:
@@ -27,22 +27,22 @@
 //
 
 namespace Hyena.CommandLine
-{   
+{
     public class LayoutOption
     {
         private string name;
         private string description;
-        
+
         public LayoutOption (string name, string description)
         {
             this.name = name;
-            this.description = description;        
+            this.description = description;
         }
-        
+
         public string Name {
             get { return name; }
         }
-        
+
         public string Description {
             get { return description; }
         }
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs
index 37c9bd9..e37bbbc 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs
@@ -40,13 +40,13 @@ namespace Hyena.Data.Sqlite
         private readonly Type type;
         private readonly string column_type;
         private readonly string name;
-        
+
         protected AbstractDatabaseColumn (FieldInfo field_info, AbstractDatabaseColumnAttribute attribute)
             : this (attribute, field_info, field_info.FieldType)
         {
             this.field_info = field_info;
         }
-        
+
         protected AbstractDatabaseColumn (PropertyInfo property_info, AbstractDatabaseColumnAttribute attribute) :
             this (attribute, property_info, property_info.PropertyType)
         {
@@ -60,7 +60,7 @@ namespace Hyena.Data.Sqlite
             }
             this.property_info = property_info;
         }
-        
+
         private AbstractDatabaseColumn (AbstractDatabaseColumnAttribute attribute, MemberInfo member_info, Type type)
         {
             try {
@@ -77,7 +77,7 @@ namespace Hyena.Data.Sqlite
         {
             return field_info != null ? field_info.GetValue (target) : property_info.GetValue (target, null);
         }
-        
+
         public object GetValue (object target)
         {
             object result = field_info != null
@@ -85,14 +85,14 @@ namespace Hyena.Data.Sqlite
                 : property_info.GetValue (target, null);
             return SqliteUtils.ToDbFormat (type, result);
         }
-        
+
         public void SetValue (object target, IDataReader reader, int column)
         {
             // FIXME should we insist on nullable types?
             object value = reader.IsDBNull (column) ? null : reader.GetValue (column);
             SetValue (target, SqliteUtils.FromDbFormat(type, value));
         }
-        
+
         public void SetValue (object target, object value)
         {
             if (field_info != null) {
@@ -101,97 +101,97 @@ namespace Hyena.Data.Sqlite
                 property_info.SetValue (target, value, null);
             }
         }
-        
+
         public string Name {
             get { return name; }
         }
-        
+
         public string Type {
             get { return column_type; }
         }
     }
-    
+
     public sealed class DatabaseColumn : AbstractDatabaseColumn
     {
         private DatabaseColumnAttribute attribute;
-        
+
         public DatabaseColumn (FieldInfo field_info, DatabaseColumnAttribute attribute)
             : base (field_info, attribute)
         {
             this.attribute = attribute;
         }
-        
+
         public DatabaseColumn (PropertyInfo property_info, DatabaseColumnAttribute attribute)
             : base (property_info, attribute)
         {
             this.attribute = attribute;
         }
-        
+
         public DatabaseColumnConstraints Constraints {
             get { return attribute.Constraints; }
         }
-        
+
         public string DefaultValue {
             get { return attribute.DefaultValue; }
         }
-        
+
         public string Index {
             get { return attribute.Index; }
         }
-        
+
         public string Schema {
             get {
                 return SqliteUtils.BuildColumnSchema (Type, Name, attribute.DefaultValue, attribute.Constraints);
             }
         }
-        
+
         public override bool Equals (object o)
         {
             DatabaseColumn column = o as DatabaseColumn;
             return o != null && column.Name.Equals (Name);
         }
-        
+
         public override int GetHashCode ()
         {
             return Name.GetHashCode ();
         }
     }
-    
+
     internal sealed class VirtualDatabaseColumn : AbstractDatabaseColumn
     {
         private VirtualDatabaseColumnAttribute attribute;
-        
+
         public VirtualDatabaseColumn (FieldInfo field_info, VirtualDatabaseColumnAttribute attribute)
             : base (field_info, attribute)
         {
             this.attribute = attribute;
         }
-        
+
         public VirtualDatabaseColumn (PropertyInfo property_info, VirtualDatabaseColumnAttribute attribute)
             : base (property_info, attribute)
         {
             this.attribute = attribute;
         }
-        
+
         public string TargetTable {
             get { return attribute.TargetTable; }
         }
-        
+
         public string LocalKey {
             get { return attribute.LocalKey; }
         }
-        
+
         public string ForeignKey {
             get { return attribute.ForeignKey; }
         }
     }
-    
+
     public struct DbColumn
     {
         public readonly string Name;
         public readonly DatabaseColumnConstraints Constraints;
         public readonly string DefaultValue;
-        
+
         public DbColumn(string name, DatabaseColumnConstraints constraints, string default_value)
         {
             Name = name;
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumnAttribute.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumnAttribute.cs
index cd70129..dc022ed 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumnAttribute.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumnAttribute.cs
@@ -41,21 +41,21 @@ namespace Hyena.Data.Sqlite
         PrimaryKey = 2,
         Unique = 4
     }
-    
+
     public abstract class AbstractDatabaseColumnAttribute : Attribute
     {
         private string column_name;
         private bool select = true;
-        
+
         public AbstractDatabaseColumnAttribute ()
         {
         }
-        
+
         public AbstractDatabaseColumnAttribute (string column_name)
         {
             this.column_name = column_name;
         }
-        
+
         public string ColumnName {
             get { return column_name; }
         }
@@ -65,45 +65,45 @@ namespace Hyena.Data.Sqlite
             set { select = value; }
         }
     }
-    
+
     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
     public sealed class DatabaseColumnAttribute : AbstractDatabaseColumnAttribute
     {
         private DatabaseColumnConstraints contraints;
         private string default_value;
         private string index;
-        
+
         public DatabaseColumnAttribute ()
         {
         }
-        
+
         public DatabaseColumnAttribute (string column_name) : base (column_name)
         {
         }
-        
+
         public DatabaseColumnConstraints Constraints {
             get { return contraints; }
             set { contraints = value; }
         }
-        
+
         public string DefaultValue {
             get { return default_value; }
             set { default_value = value; }
         }
-        
+
         public string Index {
             get { return index; }
             set { index = value; }
         }
     }
-    
+
     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
     public sealed class VirtualDatabaseColumnAttribute : AbstractDatabaseColumnAttribute
     {
         private string target_table;
         private string local_key;
         private string foreign_key;
-        
+
         public VirtualDatabaseColumnAttribute (string column_name, string target_table, string local_key, string foreign_key)
             : base (column_name)
         {
@@ -111,15 +111,15 @@ namespace Hyena.Data.Sqlite
             this.local_key = local_key;
             this.foreign_key = foreign_key;
         }
-        
+
         public string TargetTable {
             get { return target_table; }
         }
-        
+
         public string LocalKey {
             get { return local_key; }
         }
-        
+
         public string ForeignKey {
             get { return foreign_key; }
         }
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
index 53fc49e..be45a9e 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
@@ -45,13 +45,13 @@ namespace Hyena.Data.Sqlite
             StackTrace = stackTrace;
             Ms = ms;
         }
-        
+
         public string Sql;
         public string SqlWithValues;
         public string StackTrace;
         public long Ms;
     }
-    
+
     public class HyenaSqliteCommand
     {
         private object result = null;
@@ -73,7 +73,7 @@ namespace Hyena.Data.Sqlite
             get { return log_all; }
             set { log_all = value; }
         }
-        
+
         public delegate void CommandExecutedHandler (object o, CommandExecutedArgs args);
         public static event CommandExecutedHandler CommandExecuted;
 
@@ -160,7 +160,7 @@ namespace Hyena.Data.Sqlite
             }
 
             object ret = result;
-            
+
             // Reset to false in case run again
             finished = false;
 
@@ -170,7 +170,7 @@ namespace Hyena.Data.Sqlite
             if (execution_exception != null) {
                 throw execution_exception;
             }
-            
+
             return ret;
         }
 
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
index 503568f..65a53e1 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
@@ -26,7 +26,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Data;
 using System.Threading;
@@ -43,12 +43,12 @@ namespace Hyena.Data.Sqlite
         public IDataReader Reader {
             get { return reader; }
         }
-        
+
         public HyenaDataReader (IDataReader reader)
         {
             this.reader = reader;
         }
-        
+
         public T Get<T> (int i)
         {
             if (!read) {
@@ -56,20 +56,20 @@ namespace Hyena.Data.Sqlite
             }
             return (T) SqliteUtils.FromDbFormat (typeof(T), reader[i]);
         }
-        
+
         public bool Read ()
         {
             read = true;
             return reader.Read ();
         }
-        
+
         public void Dispose ()
         {
             reader.Dispose ();
             reader = null;
         }
     }
-    
+
     public class ExecutingEventArgs : EventArgs
     {
         public readonly SqliteCommand Command;
@@ -78,7 +78,7 @@ namespace Hyena.Data.Sqlite
             Command = command;
         }
     }
-    
+
     public enum HyenaCommandType {
         Reader,
         Scalar,
@@ -114,9 +114,9 @@ namespace Hyena.Data.Sqlite
         internal ManualResetEvent ResultReadySignal {
             get { return result_ready_signal; }
         }
-        
+
         public event EventHandler<ExecutingEventArgs> Executing;
-        
+
         public HyenaSqliteConnection(string dbpath)
         {
             this.dbpath = dbpath;
@@ -129,7 +129,7 @@ namespace Hyena.Data.Sqlite
 #region Public Query Methods
 
         // TODO special case for single object param to avoid object []
-                
+
         // SELECT multiple column queries
         public IDataReader Query (HyenaSqliteCommand command)
         {
@@ -149,7 +149,7 @@ namespace Hyena.Data.Sqlite
         {
             return Query (new HyenaSqliteCommand (command_str, param_values));
         }
-        
+
         public IDataReader Query (object command)
         {
             return Query (new HyenaSqliteCommand (command.ToString ()));
@@ -180,7 +180,7 @@ namespace Hyena.Data.Sqlite
         {
             return QueryEnumerable<T> (new HyenaSqliteCommand (command_str, param_values));
         }
-        
+
         public IEnumerable<T> QueryEnumerable<T> (object command)
         {
             return QueryEnumerable<T> (new HyenaSqliteCommand (command.ToString ()));
@@ -241,7 +241,7 @@ namespace Hyena.Data.Sqlite
 #endregion
 
 #region Public Utility Methods
-        
+
         public void BeginTransaction ()
         {
             if (transaction_thread == Thread.CurrentThread) {
@@ -276,7 +276,7 @@ namespace Hyena.Data.Sqlite
             lock (command_queue) {
                 transaction_thread = null;
                 // Let any other threads continue
-                transaction_signal.Set (); 
+                transaction_signal.Set ();
             }
         }
 
@@ -290,9 +290,9 @@ namespace Hyena.Data.Sqlite
 
             lock (command_queue) {
                 transaction_thread = null;
-            
+
                 // Let any other threads continue
-                transaction_signal.Set (); 
+                transaction_signal.Set ();
             }
         }
 
@@ -300,17 +300,17 @@ namespace Hyena.Data.Sqlite
         {
             return Exists ("table", tableName);
         }
-        
+
         public bool IndexExists (string indexName)
         {
             return Exists ("index", indexName);
         }
-        
+
         private bool Exists (string type, string name)
         {
             return Exists (type, name, "sqlite_master") || Exists (type, name, "sqlite_temp_master");
         }
-        
+
         private bool Exists (string type, string name, string master)
         {
             return Query<int> (String.Format (
@@ -320,7 +320,7 @@ namespace Hyena.Data.Sqlite
         }
 
         private delegate void SchemaHandler (string column);
-        
+
         private void SchemaClosure (string table_name, SchemaHandler code)
         {
             string sql = Query<string> (String.Format (
@@ -335,7 +335,7 @@ namespace Hyena.Data.Sqlite
                 code (column_def_t.Substring (0, ws_index));
             }
         }
-        
+
         public bool ColumnExists (string tableName, string columnName)
         {
             bool value = false;
@@ -347,7 +347,7 @@ namespace Hyena.Data.Sqlite
             });
             return value;
         }
-        
+
         private static readonly char [] ws_chars = new char [] { ' ', '\t', '\n', '\r' };
         public IDictionary<string, string> GetSchema (string table_name)
         {
@@ -410,12 +410,12 @@ namespace Hyena.Data.Sqlite
         }
 
         private void ProcessQueue()
-        {         
+        {
             if (connection == null) {
                 connection = new SqliteConnection (String.Format ("Version=3,URI=file:{0}", dbpath));
                 connection.Open ();
             }
-            
+
             // Keep handling queries
             while (!dispose_requested) {
                 while (command_queue.Count > 0) {
@@ -453,7 +453,7 @@ namespace Hyena.Data.Sqlite
             // Finish
             connection.Close ();
         }
-        
+
         internal void OnExecuting (SqliteCommand command)
         {
             EventHandler<ExecutingEventArgs> handler = Executing;
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
index 9698461..c4a8344 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
@@ -65,7 +65,7 @@ namespace Hyena.Data.Sqlite
             this.connection = connection;
             this.model = model;
             this.provider = provider;
-            
+
             CheckCacheTable ();
 
             if (model.SelectAggregates != null) {
@@ -126,7 +126,7 @@ namespace Hyena.Data.Sqlite
                     @"SELECT OrderID, ItemID FROM {0} WHERE {0}.ModelID = {1}",
                     CacheTableName, uid
                 );
-                
+
                 reload_sql = String.Format (@"
                     DELETE FROM {0} WHERE ModelID = {1};
                     INSERT INTO {0} (ModelID, ItemID) SELECT DISTINCT {1}, {2} ",
@@ -135,7 +135,7 @@ namespace Hyena.Data.Sqlite
             } else {
                 select_str = String.Format (
                     @"SELECT {0}, {2}.ItemID FROM {1}
-                        INNER JOIN {2} 
+                        INNER JOIN {2}
                             ON {3} = {2}.ItemID
                         WHERE
                             {2}.ModelID = {4} {5} {6}",
@@ -177,7 +177,7 @@ namespace Hyena.Data.Sqlite
                 delete_selection_command = new HyenaSqliteCommand (String.Format (
                     "DELETE FROM {0} WHERE ModelID = {1}", CacheTableName, selection_uid
                 ));
-                
+
                 save_selection_command = new HyenaSqliteCommand (String.Format (
                     "INSERT INTO {0} (ModelID, ItemID) SELECT {1}, ItemID FROM {0} WHERE ModelID = {2} LIMIT ?, ?",
                     CacheTableName, selection_uid, uid
@@ -212,7 +212,7 @@ namespace Hyena.Data.Sqlite
         protected virtual string CacheModelsTableName {
             get { return "HyenaCacheModels"; }
         }
-        
+
         protected virtual string CacheTableName {
             get { return "HyenaCache"; }
         }
@@ -227,13 +227,13 @@ namespace Hyena.Data.Sqlite
                 }
              }
         }
-        
+
         public long IndexOf (ICacheableItem item)
         {
             if (item == null || item.CacheModelId != CacheId) {
                 return -1;
             }
-            
+
             return IndexOf (item.CacheEntryId);
         }
 
@@ -309,7 +309,7 @@ namespace Hyena.Data.Sqlite
             {
                 connection.Execute (delete_selection_command);
                 saved_selection = true;
-                
+
                 if (!has_select_all_item && model.Selection.FocusedIndex != -1) {
                     T item = GetValue (model.Selection.FocusedIndex);
                     if (item != null) {
@@ -384,7 +384,7 @@ namespace Hyena.Data.Sqlite
                 }
             }
         }
-        
+
         public void UpdateAggregates ()
         {
             using (IDataReader reader = connection.Query (count_command, uid)) {
@@ -398,7 +398,7 @@ namespace Hyena.Data.Sqlite
                 }
             }
         }
-        
+
         private long FindOrCreateCacheModelId (string id)
         {
             long model_id = connection.Query<long> (String.Format (
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
index 8cb805a..2ddd0cd 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
@@ -39,12 +39,12 @@ namespace Hyena.Data.Sqlite
         private readonly List<DatabaseColumn> columns = new List<DatabaseColumn> ();
         private readonly List<DatabaseColumn> select_columns = new List<DatabaseColumn> ();
         private readonly List<VirtualDatabaseColumn> virtual_columns = new List<VirtualDatabaseColumn> ();
-        
+
         private DatabaseColumn key;
         private int key_select_column_index;
         private HyenaSqliteConnection connection;
         private bool check_table = true;
-        
+
         private HyenaSqliteCommand create_command;
         private HyenaSqliteCommand insert_command;
         private HyenaSqliteCommand update_command;
@@ -52,13 +52,13 @@ namespace Hyena.Data.Sqlite
         private HyenaSqliteCommand select_command;
         private HyenaSqliteCommand select_range_command;
         private HyenaSqliteCommand select_single_command;
-        
+
         private string table_name;
         private string primary_key;
         private string select;
         private string from;
         private string where;
-        
+
         private const string HYENA_DATABASE_NAME = "hyena_database_master";
 
         public virtual string TableName { get { return table_name; } }
@@ -79,11 +79,11 @@ namespace Hyena.Data.Sqlite
         {
             return new T ();
         }
-        
+
         protected virtual string HyenaTableName {
             get { return "HyenaModelVersions"; }
         }
-        
+
         public HyenaSqliteConnection Connection {
             get { return connection; }
         }
@@ -96,7 +96,7 @@ namespace Hyena.Data.Sqlite
         public SqliteModelProvider (HyenaSqliteConnection connection, string table_name) : this (connection, table_name, true)
         {
         }
-        
+
         public SqliteModelProvider (HyenaSqliteConnection connection, string table_name, bool checkTable) : this (connection)
         {
             this.table_name = table_name;
@@ -129,15 +129,15 @@ namespace Hyena.Data.Sqlite
             if (key == null) {
                 throw new Exception (String.Format ("The {0} table does not have a primary key", TableName));
             }
-            
+
             key_select_column_index = select_columns.IndexOf (key);
-            
+
             if (check_table) {
                 CheckVersion ();
                 CheckTable ();
             }
         }
-        
+
         protected virtual void CheckVersion ()
         {
             if (connection.TableExists (HyenaTableName)) {
@@ -166,33 +166,33 @@ namespace Hyena.Data.Sqlite
                         version INTEGER)",
                     HyenaTableName)
                 );
-                
+
                 InsertVersion (HYENA_DATABASE_NAME, DatabaseVersion);
                 InsertVersion (TableName, ModelVersion);
             }
         }
-        
+
         private string SelectVersionSql (string name)
         {
             return String.Format (
                 "SELECT version FROM {0} WHERE name='{1}'",
                 HyenaTableName, name);
         }
-        
+
         private void UpdateVersion (string name, int version)
         {
             connection.Execute (String.Format (
                 "UPDATE {0} SET version={1} WHERE name='{2}'",
                 HyenaTableName, version, name));
         }
-        
+
         private void InsertVersion (string name, int version)
         {
             connection.Execute (String.Format (
                 "INSERT INTO {0} (name, version) VALUES ('{1}', {2})",
                 HyenaTableName, name, version));
         }
-        
+
         protected void CheckTable ()
         {
             //Console.WriteLine ("In {0} checking for table {1}", this, TableName);
@@ -213,7 +213,7 @@ namespace Hyena.Data.Sqlite
                 CreateTable ();
             }
         }
-        
+
         private void AddColumn (MemberInfo member, Attribute attribute)
         {
             DatabaseColumnAttribute column = attribute as DatabaseColumnAttribute;
@@ -221,7 +221,7 @@ namespace Hyena.Data.Sqlite
                 DatabaseColumn c = member is FieldInfo
                     ? new DatabaseColumn ((FieldInfo)member, column)
                     : new DatabaseColumn ((PropertyInfo)member, column);
-                    
+
                 AddColumn (c, column.Select);
             }
             VirtualDatabaseColumnAttribute virtual_column = attribute as VirtualDatabaseColumnAttribute;
@@ -233,7 +233,7 @@ namespace Hyena.Data.Sqlite
                 }
             }
         }
-        
+
         protected void AddColumn (DatabaseColumn c, bool select)
         {
             foreach (DatabaseColumn col in columns) {
@@ -250,13 +250,13 @@ namespace Hyena.Data.Sqlite
                     );
                 }
             }
-            
+
             columns.Add (c);
 
             if (select) {
                 select_columns.Add (c);
             }
-            
+
             if ((c.Constraints & DatabaseColumnConstraints.PrimaryKey) > 0) {
                 if (key != null) {
                     throw new Exception (String.Format (
@@ -266,7 +266,7 @@ namespace Hyena.Data.Sqlite
                 key = c;
             }
         }
-        
+
         protected virtual void CreateTable ()
         {
             connection.Execute (CreateCommand);
@@ -279,7 +279,7 @@ namespace Hyena.Data.Sqlite
                 }
             }
         }
-        
+
         protected void CreateIndex (string name, string columns)
         {
             Connection.Execute (String.Format (
@@ -287,7 +287,7 @@ namespace Hyena.Data.Sqlite
                 name, TableName, columns
             ));
         }
-        
+
         public virtual void Save (T target)
         {
             try {
@@ -297,12 +297,12 @@ namespace Hyena.Data.Sqlite
                     key.SetValue (target, Insert (target));
                 }
             } catch (Exception e) {
-                Hyena.Log.Exception (e); 
+                Hyena.Log.Exception (e);
                 Hyena.Log.DebugFormat ("type of key value: {0}", key.GetRawValue (target).GetType ());
                 throw;
             }
         }
-        
+
         protected virtual object [] GetInsertParams (T target)
         {
             // TODO create an instance variable object array and reuse it? beware threading issues
@@ -316,7 +316,7 @@ namespace Hyena.Data.Sqlite
             }
             return values;
         }
-        
+
         protected int Insert (T target)
         {
             return connection.Execute (InsertCommand, GetInsertParams (target));
@@ -336,30 +336,30 @@ namespace Hyena.Data.Sqlite
             values[j] = key.GetValue (target);
             return values;
         }
-        
+
         protected void Update (T target)
         {
             connection.Execute (UpdateCommand, GetUpdateParams (target));
         }
-        
+
         public virtual T Load (IDataReader reader)
         {
             T item = MakeNewObject ();
             Load (reader, item);
             return item;
         }
-        
+
         public void Load (IDataReader reader, T target)
         {
             int i = 0;
-            
+
             AbstractDatabaseColumn bad_column = null;
             try {
                 foreach (DatabaseColumn column in select_columns) {
                     bad_column = column;
                     column.SetValue (target, reader, i++);
                 }
-                
+
                 foreach (VirtualDatabaseColumn column in virtual_columns) {
                     bad_column = column;
                     column.SetValue (target, reader, i++);
@@ -371,7 +371,7 @@ namespace Hyena.Data.Sqlite
                 );
             }
         }
-        
+
         public IEnumerable<T> FetchAll ()
         {
             using (IDataReader reader = connection.Query (SelectCommand)) {
@@ -388,7 +388,7 @@ namespace Hyena.Data.Sqlite
             }
             return default(T);
         }
-        
+
         public IEnumerable<T> FetchAllMatching (string condition, params object [] vals)
         {
             HyenaSqliteCommand fetch_matching_command = CreateFetchCommand (condition);
@@ -403,7 +403,7 @@ namespace Hyena.Data.Sqlite
         {
             return new HyenaSqliteCommand (String.Format ("{0} AND {1}", SelectCommand.Text, condition));
         }
-        
+
         public IEnumerable<T> FetchRange (int offset, int limit)
         {
             using (IDataReader reader = connection.Query (SelectRangeCommand, offset, limit)) {
@@ -412,12 +412,12 @@ namespace Hyena.Data.Sqlite
                 }
             }
         }
-        
+
         public T FetchSingle (int id)
         {
             return FetchSingle ((long) id);
         }
-        
+
         public virtual T FetchSingle (long id)
         {
             using (IDataReader reader = connection.Query (SelectSingleCommand, id)) {
@@ -427,28 +427,28 @@ namespace Hyena.Data.Sqlite
             }
             return default(T);
         }
-        
+
         protected long PrimaryKeyFor (T item)
         {
             return Convert.ToInt64 (key.GetValue (item));
         }
-        
+
         protected long PrimaryKeyFor (IDataReader reader)
         {
             return Convert.ToInt64 (reader[key_select_column_index]);
         }
-        
+
         public virtual void Delete (long id)
         {
             if (id > 0)
                 connection.Execute (DeleteCommand, id);
         }
-        
+
         public void Delete (T item)
         {
             Delete (PrimaryKeyFor (item));
         }
-        
+
         public virtual void Delete (IEnumerable<T> items)
         {
             List<long> ids = new List<long> ();
@@ -458,7 +458,7 @@ namespace Hyena.Data.Sqlite
                 if (id > 0)
                     ids.Add (id);
             }
-            
+
             if (ids.Count > 0)
                 connection.Execute (DeleteCommand, ids.ToArray ());
         }
@@ -492,7 +492,7 @@ namespace Hyena.Data.Sqlite
                 column.SetValue (copy, column.GetRawValue (original));
             }
         }
-        
+
         protected virtual HyenaSqliteCommand CreateCommand {
             get {
                 if (create_command == null) {
@@ -515,7 +515,7 @@ namespace Hyena.Data.Sqlite
                 return create_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand InsertCommand {
             get {
                 // FIXME can this string building be done more nicely?
@@ -544,7 +544,7 @@ namespace Hyena.Data.Sqlite
                 return insert_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand UpdateCommand {
             get {
                 if (update_command == null) {
@@ -572,7 +572,7 @@ namespace Hyena.Data.Sqlite
                 return update_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand SelectCommand {
             get {
                 if (select_command == null) {
@@ -586,7 +586,7 @@ namespace Hyena.Data.Sqlite
                 return select_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand SelectRangeCommand {
             get {
                 if (select_range_command == null) {
@@ -602,7 +602,7 @@ namespace Hyena.Data.Sqlite
                 return select_range_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand SelectSingleCommand {
             get {
                 if (select_single_command == null) {
@@ -618,7 +618,7 @@ namespace Hyena.Data.Sqlite
                 return select_single_command;
             }
         }
-        
+
         protected virtual HyenaSqliteCommand DeleteCommand {
             get {
                 if (delete_command == null) {
@@ -629,7 +629,7 @@ namespace Hyena.Data.Sqlite
                 return delete_command;
             }
         }
-        
+
         public virtual string Select {
             get {
                 if (select == null) {
@@ -638,7 +638,7 @@ namespace Hyena.Data.Sqlite
                 return select;
             }
         }
-        
+
         public virtual string From {
             get {
                 if (from == null) {
@@ -647,7 +647,7 @@ namespace Hyena.Data.Sqlite
                 return from;
             }
         }
-        
+
         public virtual string Where {
             get {
                 if (where == null) {
@@ -656,7 +656,7 @@ namespace Hyena.Data.Sqlite
                 return where;
             }
         }
-        
+
         public string PrimaryKey {
             get {
                 if (primary_key == null) {
@@ -666,7 +666,7 @@ namespace Hyena.Data.Sqlite
             }
             protected set { primary_key = value; }
         }
-        
+
         private void BuildQuerySql ()
         {
             StringBuilder select_builder = new StringBuilder ();
@@ -681,7 +681,7 @@ namespace Hyena.Data.Sqlite
                 select_builder.Append ('.');
                 select_builder.Append (column.Name);
             }
-            
+
             StringBuilder where_builder = new StringBuilder ();
             Dictionary<string, string> tables = new Dictionary<string,string> (virtual_columns.Count + 1);
             bool first_virtual = true;
@@ -702,7 +702,7 @@ namespace Hyena.Data.Sqlite
                 } else if (table_not_joined) {
                     where_builder.Append (" AND ");
                 }
-                
+
                 if (table_not_joined) {
                     where_builder.Append (column.TargetTable);
                     where_builder.Append ('.');
@@ -711,11 +711,11 @@ namespace Hyena.Data.Sqlite
                     where_builder.Append (TableName);
                     where_builder.Append ('.');
                     where_builder.Append (column.LocalKey);
-                
+
                     tables.Add (column.TargetTable, null);
                 }
             }
-            
+
             StringBuilder from_builder = new StringBuilder ();
             from_builder.Append (TableName);
             foreach (KeyValuePair<string, string> pair in tables) {
@@ -727,27 +727,27 @@ namespace Hyena.Data.Sqlite
             from = from_builder.ToString ();
             where = where_builder.ToString ();
         }
-        
+
         public U GetProperty <U> (T item, DbColumn column)
         {
             CheckProperty (typeof (U), column);
-            
+
             return connection.Query<U> (String.Format (
                 "SELECT {0} FROM {1} WHERE {2}={3}",
                 column.Name, TableName, key.Name, key.GetValue (item)));
         }
-        
+
         public void SetProperty <U> (T item, U value, DbColumn column)
         {
             CheckProperty (typeof (U), column);
-            
+
             connection.Execute (String.Format (
                 "UPDATE {0} SET {1}='{2}' WHERE {3}={4}",
                 TableName, column.Name,
                 SqliteUtils.ToDbFormat (typeof (U), value),
                 key.Name, key.GetValue (item)));
         }
-        
+
         public void ClearProperty <U> (DbColumn column)
         {
             if (!connection.ColumnExists (TableName, column.Name)) {
@@ -760,7 +760,7 @@ namespace Hyena.Data.Sqlite
                     TableName, column.Name, column.DefaultValue));
             }
         }
-        
+
         private void CheckProperty (Type type, DbColumn column)
         {
             if (!connection.ColumnExists (TableName, column.Name)) {
@@ -769,7 +769,7 @@ namespace Hyena.Data.Sqlite
                     column.Name, column.DefaultValue, column.Constraints));
             }
         }
-                                              
+
         private void AddColumnToTable (string column_schema)
         {
             connection.Execute (String.Format (
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteUtils.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteUtils.cs
index 9d89962..b0acfb7 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteUtils.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteUtils.cs
@@ -49,7 +49,7 @@ namespace Hyena.Data.Sqlite
                     "The type {0} cannot be bound to a database column.", type.Name));
             }
         }
-        
+
         public static object ToDbFormat (Type type, object value)
         {
             if (type == typeof (string)) {
@@ -70,15 +70,15 @@ namespace Hyena.Data.Sqlite
             } else if (type == typeof (bool)) {
                 return ((bool)value) ? 1 : 0;
             }
-            
+
             return value;
         }
-        
+
         public static object FromDbFormat (Type type, object value)
         {
             if (Convert.IsDBNull (value))
                 value = null;
-            
+
             if (type == typeof (DateTime)) {
                 return value == null
                     ? DateTime.MinValue
@@ -101,7 +101,7 @@ namespace Hyena.Data.Sqlite
                 return Convert.ChangeType (value, type);
             }
         }
-        
+
         public static string BuildColumnSchema (string type, string name, string default_value,
             DatabaseColumnConstraints constraints)
         {
@@ -125,7 +125,7 @@ namespace Hyena.Data.Sqlite
             return builder.ToString ();
         }
     }
-        
+
     [SqliteFunction (Name = "HYENA_COLLATION_KEY", FuncType = FunctionType.Scalar, Arguments = 1)]
     internal class CollationKeyFunction : SqliteFunction
     {
@@ -134,7 +134,7 @@ namespace Hyena.Data.Sqlite
             return Hyena.StringUtil.SortKey (args[0] as string);
         }
     }
-    
+
     [SqliteFunction (Name = "HYENA_SEARCH_KEY", FuncType = FunctionType.Scalar, Arguments = 1)]
     internal class SearchKeyFunction : SqliteFunction
     {
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/DbBoundType.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/DbBoundType.cs
index 181adf8..58b7dc6 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/DbBoundType.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/DbBoundType.cs
@@ -40,7 +40,7 @@ namespace Hyena.Data.Sqlite.Tests
         Two,
         Three
     }
-    
+
     internal enum LongEnum : long
     {
         Cero,
@@ -48,14 +48,14 @@ namespace Hyena.Data.Sqlite.Tests
         Dos,
         Tres
     }
-    
+
     internal class ModelProvider : SqliteModelProvider<DbBoundType>
     {
         public ModelProvider (HyenaSqliteConnection connection) : base (connection)
         {
             Init ();
         }
-        
+
         public override string TableName {
             get { return "TestTable"; }
         }
@@ -65,7 +65,7 @@ namespace Hyena.Data.Sqlite.Tests
         protected override int DatabaseVersion {
             get { return 1; }
         }
-        
+
         protected override void MigrateTable (int old_version)
         {
         }
@@ -77,12 +77,12 @@ namespace Hyena.Data.Sqlite.Tests
             return new DbBoundType ();
         }
     }
-    
+
     internal class DbBoundType
     {
         [DatabaseColumn ("PrimaryKey", Constraints = DatabaseColumnConstraints.PrimaryKey)]
         public int PrimaryKey;
-        
+
         [DatabaseColumn ("PublicIntField")]
         public int PublicIntField;
         [DatabaseColumn ("PublicLongField")]
@@ -97,7 +97,7 @@ namespace Hyena.Data.Sqlite.Tests
         public IntEnum PublicIntEnumField;
         [DatabaseColumn ("PublicLongEnumField")]
         public LongEnum PublicLongEnumField;
-        
+
         private int public_int_property_field;
         [DatabaseColumn ("PublicIntProperty")]
         public int PublicIntProperty {
@@ -140,7 +140,7 @@ namespace Hyena.Data.Sqlite.Tests
             get { return public_long_enum_property_field; }
             set { public_long_enum_property_field = value; }
         }
-        
+
         [DatabaseColumn ("PrivateIntField")]
         private int private_int_field;
         [DatabaseColumn ("PrivateLongField")]
@@ -155,7 +155,7 @@ namespace Hyena.Data.Sqlite.Tests
         private IntEnum private_int_enum_field;
         [DatabaseColumn ("PrivateLongEnumField")]
         private LongEnum private_long_enum_field;
-        
+
         public int GetPrivateIntField ()
         {
             return private_int_field;
@@ -212,7 +212,7 @@ namespace Hyena.Data.Sqlite.Tests
         {
             private_long_enum_field = value;
         }
-        
+
         private int private_int_property_field;
         [DatabaseColumn ("PrivateIntProperty")]
         private int private_int_property {
@@ -255,7 +255,7 @@ namespace Hyena.Data.Sqlite.Tests
             get { return private_long_enum_property_field; }
             set { private_long_enum_property_field = value; }
         }
-        
+
         public int GetPrivateIntProperty ()
         {
             return private_int_property;
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs
index f847f1b..e212010 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs
@@ -47,36 +47,36 @@ namespace Hyena.Data.Sqlite.Tests
                     "a", 32);
                 Assert.Fail ("Should not have been able to pass 2 values to ApplyValues without exception");
             } catch {}
-    
+
             try {
                 cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?, bbz = ?, this = ?",
                     "a", 32, "22");
             } catch {
                 Assert.Fail ("Should have been able to pass 3 values to ApplyValues without exception");
             }
-    
+
             Assert.AreEqual ("select foo from bar where baz = 'a', bbz = 32, this = '22'", GetGeneratedSql (cmd));
         }
-    
+
         [Test]
         public void Constructor ()
         {
             HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?, bbz = ?, this = ?", "a", 32, "22");
             Assert.AreEqual ("select foo from bar where baz = 'a', bbz = 32, this = '22'", GetGeneratedSql (cmd));
         }
-    
+
         [Test]
         public void CultureInvariant ()
         {
             HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?", 32.2);
             Assert.AreEqual ("select foo from bar where baz = 32.2", GetGeneratedSql (cmd));
         }
-    
+
         [Test]
         public void ParameterSerialization ()
         {
             HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?");
-    
+
             Assert.AreEqual ("select foo from bar where baz = NULL", GetGeneratedSql (cmd, null));
             Assert.AreEqual ("select foo from bar where baz = 'It''s complicated, \"but\" ''''why not''''?'", GetGeneratedSql (cmd, "It's complicated, \"but\" ''why not''?"));
             Assert.AreEqual ("select foo from bar where baz = 0", GetGeneratedSql (cmd, new DateTime (1970, 1, 1).ToLocalTime ()));
@@ -86,10 +86,10 @@ namespace Hyena.Data.Sqlite.Tests
             Assert.AreEqual ("select foo from bar where baz = 555", GetGeneratedSql (cmd, 555));
             Assert.AreEqual ("select foo from bar where baz = 1", GetGeneratedSql (cmd, true));
             Assert.AreEqual ("select foo from bar where baz = 0", GetGeneratedSql (cmd, false));
-    
+
             HyenaSqliteCommand cmd2 = new HyenaSqliteCommand ("select foo from bar where baz = ?, bar = ?, boo = ?");
             Assert.AreEqual ("select foo from bar where baz = NULL, bar = NULL, boo = 22", GetGeneratedSql (cmd2, null, null, 22));
-    
+
             HyenaSqliteCommand cmd3 = new HyenaSqliteCommand ("select foo from bar where id in (?) and foo not in (?)");
             Assert.AreEqual ("select foo from bar where id in (1,2,4) and foo not in ('foo','baz')",
                     GetGeneratedSql (cmd3, new int [] {1, 2, 4}, new string [] {"foo", "baz"}));
@@ -111,19 +111,19 @@ namespace Hyena.Data.Sqlite.Tests
                 Assert.IsTrue (disposed);
             }
         }
-    
+
         static PropertyInfo tf = typeof(HyenaSqliteCommand).GetProperty ("CurrentSqlText", BindingFlags.Instance | BindingFlags.NonPublic);
         private static string GetGeneratedSql (HyenaSqliteCommand cmd, params object [] p)
         {
             return tf.GetValue ((new HyenaSqliteCommand (cmd.Text, p)), null) as string;
         }
-    
+
         private static string GetGeneratedSql (HyenaSqliteCommand cmd)
         {
             return tf.GetValue (cmd, null) as string;
         }
     }
-    
+
     [TestFixture]
     public class ObjectToSqlTests
     {
@@ -131,20 +131,20 @@ namespace Hyena.Data.Sqlite.Tests
         {
             Assert.AreEqual (expected, HyenaSqliteCommand.SqlifyObject (o));
         }
-        
+
         [Test]
         public void TestNull ()
         {
             AssertToSql (null, "NULL");
         }
-        
+
         [Test]
         public void TestBool ()
         {
             AssertToSql (false, "0");
             AssertToSql (true, "1");
         }
-        
+
         [Test]
         public void TestString ()
         {
@@ -152,7 +152,7 @@ namespace Hyena.Data.Sqlite.Tests
             AssertToSql ("test", "'test'");
             AssertToSql ("te'st", "'te''st'");
         }
-        
+
         [Test]
         public void TestByteArray ()
         {
@@ -160,7 +160,7 @@ namespace Hyena.Data.Sqlite.Tests
             AssertToSql (new byte[] {}, "X''");
             AssertToSql (new byte[] {0x10, 0x20, 0x30}, "X'102030'");
         }
-        
+
         [Test]
         public void TestOtherArray ()
         {
@@ -168,13 +168,13 @@ namespace Hyena.Data.Sqlite.Tests
             AssertToSql (new object[] {"a"}, "'a'");
             AssertToSql (new object[] {"a", "b"}, "'a','b'");
         }
-        
+
         [Test]
         public void TestDateTime ()
         {
             // Returned using local time, not UTC
             AssertToSql (new DateTime (2000, 1, 2), 946792800);
-            
+
             // Disregards milliseconds
             AssertToSql (new DateTime (2000, 1, 2, 10, 9, 8, 7), 946829348);
         }
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs
index 360dd39..7b12c5d 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs
@@ -41,21 +41,21 @@ namespace Hyena.Data.Sqlite.Tests
     {
         private HyenaSqliteConnection connection;
         private ModelProvider provider;
-        
+
         [TestFixtureSetUp]
         public void Init ()
         {
             connection = new HyenaSqliteConnection ("test.db");
             provider = new ModelProvider (connection);
         }
-        
+
         [TestFixtureTearDown]
         public void Dispose ()
         {
             connection.Dispose ();
             File.Delete ("test.db");
         }
-        
+
         [Test]
         public void IntMembers ()
         {
@@ -64,16 +64,16 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicIntProperty = 13;
             newed_item.SetPrivateIntField (128);
             newed_item.SetPrivateIntProperty (42);
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicIntField, loaded_item.PublicIntField);
             Assert.AreEqual (newed_item.PublicIntProperty, loaded_item.PublicIntProperty);
             Assert.AreEqual (newed_item.GetPrivateIntField (), loaded_item.GetPrivateIntField ());
             Assert.AreEqual (newed_item.GetPrivateIntProperty (), loaded_item.GetPrivateIntProperty ());
         }
-        
+
         [Test]
         public void LongMembers ()
         {
@@ -82,16 +82,16 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicLongProperty = -932;
             newed_item.SetPrivateLongField (3243);
             newed_item.SetPrivateLongProperty (1);
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicLongField, loaded_item.PublicLongField);
             Assert.AreEqual (newed_item.PublicLongProperty, loaded_item.PublicLongProperty);
             Assert.AreEqual (newed_item.GetPrivateLongField (), loaded_item.GetPrivateLongField ());
             Assert.AreEqual (newed_item.GetPrivateLongProperty (), loaded_item.GetPrivateLongProperty ());
         }
-        
+
         [Test]
         public void StringMembers ()
         {
@@ -100,9 +100,9 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicStringProperty = "Even as a splitted bark, so sunder we: This way fall I to death.";
             newed_item.SetPrivateStringField ("Who is John Galt?");
             newed_item.SetPrivateStringProperty ("The most formidable weapon against errors of every kind is Reason.");
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicStringField, loaded_item.PublicStringField);
             Assert.AreEqual (newed_item.PublicStringProperty, loaded_item.PublicStringProperty);
@@ -118,16 +118,16 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicStringProperty = null;
             newed_item.SetPrivateStringField (" \t ");
             newed_item.SetPrivateStringProperty (" foo ");
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (null, loaded_item.PublicStringField);
             Assert.AreEqual (null, loaded_item.PublicStringProperty);
             Assert.AreEqual (null, loaded_item.GetPrivateStringField ());
             Assert.AreEqual (" foo ", loaded_item.GetPrivateStringProperty ());
         }
-    
+
         [Test]
         public void NullStringMembers ()
         {
@@ -136,16 +136,16 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicStringProperty = null;
             newed_item.SetPrivateStringField (null);
             newed_item.SetPrivateStringProperty (null);
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicStringField, loaded_item.PublicStringField);
             Assert.AreEqual (newed_item.PublicStringProperty, loaded_item.PublicStringProperty);
             Assert.AreEqual (newed_item.GetPrivateStringField (), loaded_item.GetPrivateStringField ());
             Assert.AreEqual (newed_item.GetPrivateStringProperty (), loaded_item.GetPrivateStringProperty ());
         }
-        
+
         // Some fidelity is lost in the conversion from DT to DB time format
         private void AssertArePrettyClose (DateTime time1, DateTime time2)
         {
@@ -156,7 +156,7 @@ namespace Hyena.Data.Sqlite.Tests
             Assert.AreEqual (time1.Minute, time2.Minute);
             Assert.AreEqual (time1.Second, time2.Second);
         }
-        
+
         [Test]
         public void DateTimeMembers ()
         {
@@ -165,23 +165,23 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicDateTimeProperty = new DateTime (1986, 4, 23);
             newed_item.SetPrivateDateTimeField (DateTime.MinValue);
             newed_item.SetPrivateDateTimeProperty (DateTime.Now);
-            
+
             provider.Save (newed_item);
-            
+
             string command = String.Format ("SELECT PrivateDateTimeField FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey);
-            
+
             using (IDataReader reader = connection.Query (command)) {
                 reader.Read ();
                 Assert.IsTrue (reader.IsDBNull (0));
             }
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             AssertArePrettyClose (newed_item.PublicDateTimeField, loaded_item.PublicDateTimeField);
             AssertArePrettyClose (newed_item.PublicDateTimeProperty, loaded_item.PublicDateTimeProperty);
             AssertArePrettyClose (newed_item.GetPrivateDateTimeField (), loaded_item.GetPrivateDateTimeField ());
             AssertArePrettyClose (newed_item.GetPrivateDateTimeProperty (), loaded_item.GetPrivateDateTimeProperty ());
         }
-        
+
         [Test]
         public void TimeSpanMembers ()
         {
@@ -190,15 +190,15 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicTimeSpanProperty = new TimeSpan (1, 0, 0);
             newed_item.SetPrivateTimeSpanField (new TimeSpan (1, 39, 12));
             newed_item.SetPrivateTimeSpanProperty (TimeSpan.MinValue);
-            
+
             provider.Save (newed_item);
-            
+
             string command = String.Format ("SELECT PrivateTimeSpanProperty FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey);
             using (IDataReader reader = connection.Query (command)) {
                 reader.Read ();
                 Assert.IsTrue (reader.IsDBNull (0));
             }
-            
+
             // NUnit boxes and uses reference equality, rather than Equals()
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicTimeSpanField, loaded_item.PublicTimeSpanField);
@@ -206,7 +206,7 @@ namespace Hyena.Data.Sqlite.Tests
             Assert.AreEqual (newed_item.GetPrivateTimeSpanField (), loaded_item.GetPrivateTimeSpanField ());
             Assert.AreEqual (newed_item.GetPrivateTimeSpanProperty (), loaded_item.GetPrivateTimeSpanProperty ());
         }
-        
+
         [Test]
         public void IntEnumMembers ()
         {
@@ -215,16 +215,16 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicIntEnumProperty = IntEnum.One;
             newed_item.SetPrivateIntEnumField (IntEnum.Two);
             newed_item.SetPrivateIntEnumProperty (IntEnum.Three);
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicIntEnumField, loaded_item.PublicIntEnumField);
             Assert.AreEqual (newed_item.PublicIntEnumProperty, loaded_item.PublicIntEnumProperty);
             Assert.AreEqual (newed_item.GetPrivateIntEnumField (), loaded_item.GetPrivateIntEnumField ());
             Assert.AreEqual (newed_item.GetPrivateIntEnumProperty (), loaded_item.GetPrivateIntEnumProperty ());
         }
-        
+
         [Test]
         public void LongEnumMembers ()
         {
@@ -233,9 +233,9 @@ namespace Hyena.Data.Sqlite.Tests
             newed_item.PublicLongEnumProperty = LongEnum.Uno;
             newed_item.SetPrivateLongEnumField (LongEnum.Dos);
             newed_item.SetPrivateLongEnumProperty (LongEnum.Tres);
-            
+
             provider.Save (newed_item);
-            
+
             DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
             Assert.AreEqual (newed_item.PublicLongEnumField, loaded_item.PublicLongEnumField);
             Assert.AreEqual (newed_item.PublicLongEnumProperty, loaded_item.PublicLongEnumProperty);
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs
index 84af70c..2ccc8be 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs
@@ -38,14 +38,14 @@ namespace Hyena.Data.Sqlite.Tests
         {
             Assert.AreEqual (after, (new CollationKeyFunction ()).Invoke (new object[] {before}));
         }
-        
+
         [Test]
         public void TestNull ()
         {
             CollationKeyTest (null, null);
             CollationKeyTest (System.DBNull.Value, null);
         }
-        
+
         [Test]
         public void TestKey ()
         {
@@ -55,7 +55,7 @@ namespace Hyena.Data.Sqlite.Tests
             CollationKeyTest ("\u0104", new byte[] {14, 2, 1, 27, 1, 1, 1, 0});
         }
     }
-    
+
     [TestFixture]
     public class SearchKeyTests
     {
@@ -63,14 +63,14 @@ namespace Hyena.Data.Sqlite.Tests
         {
             Assert.AreEqual (after, (new SearchKeyFunction ()).Invoke (new object[] {before}));
         }
-        
+
         [Test]
         public void TestNull ()
         {
             SearchKeyTest (null, null);
             SearchKeyTest (System.DBNull.Value, null);
         }
-        
+
         [Test]
         public void TestKey ()
         {
diff --git a/src/Libraries/Hyena/Hyena.Data/BaseListModel.cs b/src/Libraries/Hyena/Hyena.Data/BaseListModel.cs
index 4066059..9694784 100644
--- a/src/Libraries/Hyena/Hyena.Data/BaseListModel.cs
+++ b/src/Libraries/Hyena/Hyena.Data/BaseListModel.cs
@@ -43,7 +43,7 @@ namespace Hyena.Data
         public BaseListModel () : base ()
         {
         }
-        
+
         protected virtual void OnCleared ()
         {
             EventHandler handler = Cleared;
@@ -51,7 +51,7 @@ namespace Hyena.Data
                 handler(this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnReloaded ()
         {
             EventHandler handler = Reloaded;
@@ -64,11 +64,11 @@ namespace Hyena.Data
         {
             OnReloaded ();
         }
-        
+
         public abstract void Clear();
-        
+
         public abstract void Reload();
-    
+
         public abstract T this[int index] { get; }
 
         public abstract int Count { get; }
@@ -83,7 +83,7 @@ namespace Hyena.Data
                 return model_selection ?? (model_selection = new ModelSelection<T> (this, Selection));
             }
         }
-        
+
         public T FocusedItem {
             get { return Selection.FocusedIndex == -1 ? default(T) : this[Selection.FocusedIndex]; }
         }
diff --git a/src/Libraries/Hyena/Hyena.Data/ColumnDescription.cs b/src/Libraries/Hyena/Hyena.Data/ColumnDescription.cs
index abd9311..cdb6a12 100644
--- a/src/Libraries/Hyena/Hyena.Data/ColumnDescription.cs
+++ b/src/Libraries/Hyena/Hyena.Data/ColumnDescription.cs
@@ -39,14 +39,14 @@ namespace Hyena.Data
         private string property;
 
         private bool initialized;
-        
+
         public event EventHandler VisibilityChanged;
         public event EventHandler WidthChanged;
-        
+
         public ColumnDescription (string property, string title, double width) : this (property, title, width, true)
         {
         }
-        
+
         public ColumnDescription (string property, string title, double width, bool visible)
         {
             this.property = property;
@@ -56,7 +56,7 @@ namespace Hyena.Data
             Visible = visible;
             initialized = true;
         }
-                
+
         protected virtual void OnVisibilityChanged ()
         {
             EventHandler handler = VisibilityChanged;
@@ -64,7 +64,7 @@ namespace Hyena.Data
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         protected virtual void OnWidthChanged ()
         {
             EventHandler handler = WidthChanged;
@@ -72,7 +72,7 @@ namespace Hyena.Data
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         public string Title {
             get { return title; }
             set { title = value; }
@@ -82,7 +82,7 @@ namespace Hyena.Data
             get { return long_title; }
             set { long_title = value; }
         }
-        
+
         public double Width {
             get { return width; }
             set {
@@ -98,18 +98,18 @@ namespace Hyena.Data
                 }
             }
         }
-        
+
         public string Property {
             get { return property; }
             set { property = value; }
         }
-        
+
         public bool Visible {
             get { return visible; }
             set {
                 bool old = Visible;
                 visible = value;
-                
+
                 if(initialized && value != old) {
                     OnVisibilityChanged ();
                 }
diff --git a/src/Libraries/Hyena/Hyena.Data/IListModel.cs b/src/Libraries/Hyena/Hyena.Data/IListModel.cs
index 9cdda82..3bb8629 100644
--- a/src/Libraries/Hyena/Hyena.Data/IListModel.cs
+++ b/src/Libraries/Hyena/Hyena.Data/IListModel.cs
@@ -36,19 +36,19 @@ namespace Hyena.Data
     {
         event EventHandler Cleared;
         event EventHandler Reloaded;
-        
+
         void Clear ();
         void Reload ();
-        
+
         int Count { get; }
         bool CanReorder { get; }
     }
-    
+
     public interface IListModel<T> : IListModel
     {
         T this[int index] { get; }
     }
-    
+
     public interface IObjectListModel : IListModel<object>
     {
         ColumnDescription [] ColumnDescriptions { get; }
diff --git a/src/Libraries/Hyena/Hyena.Data/IPropertyStoreExpose.cs b/src/Libraries/Hyena/Hyena.Data/IPropertyStoreExpose.cs
index eb4e054..d8c4381 100644
--- a/src/Libraries/Hyena/Hyena.Data/IPropertyStoreExpose.cs
+++ b/src/Libraries/Hyena/Hyena.Data/IPropertyStoreExpose.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IPropertyStoreExpose.cs
 //
 // Author:
@@ -29,7 +29,7 @@
 using System;
 
 namespace Hyena.Data
-{   
+{
     public interface IPropertyStoreExpose
     {
         PropertyStore PropertyStore { get; }
diff --git a/src/Libraries/Hyena/Hyena.Data/MemoryListModel.cs b/src/Libraries/Hyena/Hyena.Data/MemoryListModel.cs
new file mode 100644
index 0000000..ae037ee
--- /dev/null
+++ b/src/Libraries/Hyena/Hyena.Data/MemoryListModel.cs
@@ -0,0 +1,97 @@
+//
+// MemoryListModel.cs
+//
+// Author:
+//   Gabriel Burt <gburt at novell.com>
+//
+// Copyright (C) 2009 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Hyena.Collections;
+
+namespace Hyena.Data
+{
+    public class MemoryListModel<T> : BaseListModel<T>
+    {
+        private List<T> list;
+
+        public MemoryListModel ()
+        {
+            list = new List<T> ();
+            selection = new Selection ();
+        }
+
+        public override void Clear ()
+        {
+            lock (list) {
+                list.Clear ();
+            }
+
+            OnCleared ();
+        }
+
+        public override void Reload ()
+        {
+            OnReloaded ();
+        }
+
+        public int IndexOf (T item)
+        {
+            lock (list) {
+                return list.IndexOf (item);
+            }
+        }
+
+        public void Add (T item)
+        {
+            lock (list) {
+                list.Add (item);
+            }
+        }
+
+        public void Remove (T item)
+        {
+            lock (list) {
+                list.Remove (item);
+            }
+        }
+
+        public override T this[int index] {
+            get {
+                lock (list) {
+                    return list[index];
+                }
+            }
+        }
+
+        public override int Count {
+            get {
+                lock (list) {
+                    return list.Count;
+                }
+            }
+        }
+    }
+}
diff --git a/src/Libraries/Hyena/Hyena.Data/ModelCache.cs b/src/Libraries/Hyena/Hyena.Data/ModelCache.cs
index c736ed6..fe610b2 100644
--- a/src/Libraries/Hyena/Hyena.Data/ModelCache.cs
+++ b/src/Libraries/Hyena/Hyena.Data/ModelCache.cs
@@ -45,16 +45,16 @@ namespace Hyena.Data
             lock (this) {
                 if (ContainsKey (index))
                     return this[index];
-                
+
                 FetchSet (index, model.FetchCount);
-                
+
                 if (ContainsKey (index))
                     return this[index];
-                
+
                 return default (T);
             }
         }
-        
+
         // Responsible for fetching a set of items and placing them in the cache
         protected abstract void FetchSet (long offset, long limit);
 
diff --git a/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs b/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs
index 0225017..60a5af8 100644
--- a/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs
+++ b/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs
@@ -32,7 +32,7 @@ using System.Collections.Generic;
 namespace Hyena.Data
 {
     public delegate void PropertyChangeEventHandler(object o, PropertyChangeEventArgs args);
-    
+
     public class PropertyChangeEventArgs : EventArgs
     {
         private string property_name;
@@ -40,7 +40,7 @@ namespace Hyena.Data
         private bool removed;
         private object old_value;
         private object new_value;
-        
+
         public PropertyChangeEventArgs(string propertyName, bool added, bool removed, object oldValue, object newValue)
         {
             this.property_name = propertyName;
@@ -49,49 +49,49 @@ namespace Hyena.Data
             this.old_value = oldValue;
             this.new_value = newValue;
         }
-        
+
         public string PropertyName {
             get { return property_name; }
         }
-        
+
         public bool Added {
             get { return added; }
         }
-        
+
         public bool Removed {
             get { return removed; }
         }
-        
+
         public object OldValue {
             get { return old_value; }
         }
-        
+
         public object NewValue {
             get { return new_value; }
         }
     }
-    
+
     public class PropertyStore
     {
         private Dictionary<string, object> object_store;
-        
+
         public event PropertyChangeEventHandler PropertyChanged;
-        
+
         public PropertyStore()
         {
         }
-        
-        protected virtual void OnPropertyChanged(string propertyName, bool added, bool removed, 
+
+        protected virtual void OnPropertyChanged(string propertyName, bool added, bool removed,
             object oldValue, object newValue)
         {
             PropertyChangeEventHandler handler = PropertyChanged;
             if(handler != null) {
-                PropertyChangeEventArgs args = new PropertyChangeEventArgs(propertyName, 
+                PropertyChangeEventArgs args = new PropertyChangeEventArgs(propertyName,
                     added, removed, oldValue, newValue);
                 handler(this, args);
             }
         }
-            
+
         public void Remove(string name)
         {
             bool raise = false;
@@ -108,28 +108,28 @@ namespace Hyena.Data
                 OnPropertyChanged(name, false, true, old_value, null);
             }
         }
-        
+
         public void RemoveStartingWith (string prefix)
         {
             lock(this) {
                 Queue<string> to_remove = null;
-                
+
                 foreach (KeyValuePair<string, object> item in object_store) {
                     if (item.Key.StartsWith (prefix)) {
                         if (to_remove == null) {
                             to_remove = new Queue<string> ();
                         }
-                        
+
                         to_remove.Enqueue (item.Key);
                     }
                 }
-                
+
                 while (to_remove != null && to_remove.Count > 0) {
                     Remove (to_remove.Dequeue ());
                 }
             }
         }
-        
+
         public void Set<T>(string name, T value)
         {
             bool added = false;
@@ -151,66 +151,66 @@ namespace Hyena.Data
             }
             OnPropertyChanged(name, added, false, old_value, value);
         }
-        
+
         public T Get<T>(string name)
         {
             lock(this) {
                 if(object_store != null && object_store.ContainsKey(name)) {
                     return (T)object_store[name];
                 }
-            
+
                 return default(T);
             }
         }
-        
+
         public int GetInteger(string name)
         {
             return Get<int>(name);
         }
-        
+
         public void SetInteger(string name, int value)
         {
             Set<int>(name, value);
         }
-        
+
         // No longer used, since it causes strings to be marked for translation
         /*public string GetString(string name)
         {
             return Get<string>(name);
         }*/
-        
+
         public void SetString(string name, string value)
         {
             Set<string>(name, value);
         }
-        
+
         public string [] GetStringList(string name)
         {
             return Get<string []>(name);
         }
-        
+
         public void SetStringList(string name, params string [] value)
         {
             Set<string []>(name, value);
         }
-        
+
         public bool GetBoolean(string name)
         {
             return Get<bool>(name);
         }
-        
+
         public void SetBoolean(string name, bool value)
         {
             Set<bool>(name, value);
         }
-        
+
         public bool Contains(string name)
         {
             lock(this) {
                 return object_store != null && object_store.ContainsKey(name);
             }
         }
-    
+
         public Type GetType(string name)
         {
             lock(this) {
diff --git a/src/Libraries/Hyena/Hyena.Jobs/Job.cs b/src/Libraries/Hyena/Hyena.Jobs/Job.cs
index 99c49db..0fdaa44 100644
--- a/src/Libraries/Hyena/Hyena.Jobs/Job.cs
+++ b/src/Libraries/Hyena/Hyena.Jobs/Job.cs
@@ -193,8 +193,8 @@ namespace Hyena.Jobs
             get { return icon_names; }
             set {
                 if (value != null) {
-                    icon_names = value; 
-                    OnUpdated (); 
+                    icon_names = value;
+                    OnUpdated ();
                 }
             }
         }
diff --git a/src/Libraries/Hyena/Hyena.Jobs/Scheduler.cs b/src/Libraries/Hyena/Hyena.Jobs/Scheduler.cs
index d18f713..4573d1d 100644
--- a/src/Libraries/Hyena/Hyena.Jobs/Scheduler.cs
+++ b/src/Libraries/Hyena/Hyena.Jobs/Scheduler.cs
@@ -182,7 +182,7 @@ namespace Hyena.Jobs
 
             if (job.Has (PriorityHints.SpeedSensitive))
                 return true;
-            
+
             // Run only one non-SpeedSensitive job that uses a given Resource
             if (job.Has (PriorityHints.LongRunning))
                 return jobs.Where (IsRunning)
diff --git a/src/Libraries/Hyena/Hyena.Jobs/Tests/SchedulerTests.cs b/src/Libraries/Hyena/Hyena.Jobs/Tests/SchedulerTests.cs
index 8ca7cd3..262075f 100644
--- a/src/Libraries/Hyena/Hyena.Jobs/Tests/SchedulerTests.cs
+++ b/src/Libraries/Hyena/Hyena.Jobs/Tests/SchedulerTests.cs
@@ -35,7 +35,7 @@ using System.Threading;
 using NUnit.Framework;
 
 using Hyena;
-    
+
 namespace Hyena.Jobs
 {
     [TestFixture]
diff --git a/src/Libraries/Hyena/Hyena.Json/Deserializer.cs b/src/Libraries/Hyena/Hyena.Json/Deserializer.cs
index 15afe8c..f54b6d7 100644
--- a/src/Libraries/Hyena/Hyena.Json/Deserializer.cs
+++ b/src/Libraries/Hyena/Hyena.Json/Deserializer.cs
@@ -1,4 +1,4 @@
-// 
+//
 // Deserializer.cs
 //
 // Author:
@@ -34,40 +34,40 @@ namespace Hyena.Json
     public class Deserializer
     {
         private Tokenizer tokenizer = new Tokenizer ();
-        
+
         public Deserializer () { }
         public Deserializer (string input) { SetInput (input); }
         public Deserializer (Stream stream) { SetInput (stream); }
         public Deserializer (StreamReader reader) { SetInput (reader); }
-        
+
         public Deserializer SetInput (StreamReader reader)
         {
             tokenizer.SetInput (reader);
             return this;
         }
-        
+
         public Deserializer SetInput (Stream stream)
         {
             tokenizer.SetInput (stream);
             return this;
         }
-        
+
         public Deserializer SetInput (string input)
         {
             tokenizer.SetInput (input);
             return this;
         }
-        
+
         public object Deserialize ()
         {
             Token token = CheckScan (TokenType.Value, true);
             if (token == null) {
                 return null;
             }
-            
+
             return Parse (token);
         }
-        
+
         private object Parse (Token token)
         {
             if (token.Type == TokenType.ObjectStart) {
@@ -75,67 +75,67 @@ namespace Hyena.Json
             } else if (token.Type == TokenType.ArrayStart) {
                 return ParseArray ();
             }
-            
+
             return token.Value;
         }
-        
+
         private JsonObject ParseObject ()
         {
             JsonObject obj = new JsonObject ();
-            
+
             while (true) {
                 Token key = CheckScan (TokenType.String | TokenType.ObjectFinish);
                 if (key.Type == TokenType.ObjectFinish) {
                     break;
                 }
-                
+
                 CheckScan (TokenType.Colon);
                 Token value = CheckScan (TokenType.Value);
-                
+
                 object value_val = value.Value;
                 if (value.Type == TokenType.ArrayStart) {
                     value_val = ParseArray ();
                 } else if (value.Type == TokenType.ObjectStart) {
                     value_val = ParseObject ();
                 }
-                
+
                 obj.Add ((string)key.Value, value_val);
-                
+
                 Token token = CheckScan (TokenType.Comma | TokenType.ObjectFinish);
                 if (token.Type == TokenType.ObjectFinish) {
                      break;
                 }
             }
-            
+
             return obj;
         }
-        
+
         private JsonArray ParseArray ()
         {
             JsonArray array = new JsonArray ();
-            
+
             while (true) {
                 Token value = CheckScan (TokenType.Value | TokenType.ArrayFinish);
                 if (value.Type == TokenType.ArrayFinish) {
                     break;
                 }
-                
+
                 array.Add (Parse (value));
-                
+
                 Token token = CheckScan (TokenType.Comma | TokenType.ArrayFinish);
                 if (token.Type == TokenType.ArrayFinish) {
                      break;
                 }
             }
-            
+
             return array;
         }
-        
+
         private Token CheckScan (TokenType expected)
         {
             return CheckScan (expected, false);
         }
-        
+
         private Token CheckScan (TokenType expected, bool eofok)
         {
             Token token = tokenizer.Scan ();
@@ -148,13 +148,13 @@ namespace Hyena.Json
             }
             return token;
         }
-        
+
         private void UnexpectedToken (TokenType expected, Token got)
         {
-            throw new ApplicationException (String.Format ("Unexpected token {0} at [{1}:{2}]; expected {3}", 
+            throw new ApplicationException (String.Format ("Unexpected token {0} at [{1}:{2}]; expected {3}",
                 got.Type, got.SourceLine, got.SourceColumn, expected));
         }
-        
+
         private void UnexpectedEof (TokenType expected)
         {
             throw new ApplicationException (String.Format ("Unexpected End of File; expected {0}", expected));
diff --git a/src/Libraries/Hyena/Hyena.Json/IJsonCollection.cs b/src/Libraries/Hyena/Hyena.Json/IJsonCollection.cs
index 4d46bf7..c9fc698 100644
--- a/src/Libraries/Hyena/Hyena.Json/IJsonCollection.cs
+++ b/src/Libraries/Hyena/Hyena.Json/IJsonCollection.cs
@@ -1,4 +1,4 @@
-// 
+//
 // IJsonCollection.cs
 //
 // Author:
diff --git a/src/Libraries/Hyena/Hyena.Json/JsonArray.cs b/src/Libraries/Hyena/Hyena.Json/JsonArray.cs
index f2288bf..5d86826 100644
--- a/src/Libraries/Hyena/Hyena.Json/JsonArray.cs
+++ b/src/Libraries/Hyena/Hyena.Json/JsonArray.cs
@@ -1,4 +1,4 @@
-// 
+//
 // JsonArray.cs
 //
 // Author:
@@ -37,14 +37,14 @@ namespace Hyena.Json
         {
             Dump (1);
         }
-        
+
         public void Dump (int levels)
         {
             if (Count == 0) {
                 Console.WriteLine ("[ ]");
                 return;
             }
-        
+
             Console.WriteLine ("[");
             foreach (object item in this) {
                 Console.Write (String.Empty.PadLeft (levels * 2, ' '));
diff --git a/src/Libraries/Hyena/Hyena.Json/JsonObject.cs b/src/Libraries/Hyena/Hyena.Json/JsonObject.cs
index 98d32c4..a9216b1 100644
--- a/src/Libraries/Hyena/Hyena.Json/JsonObject.cs
+++ b/src/Libraries/Hyena/Hyena.Json/JsonObject.cs
@@ -1,4 +1,4 @@
-// 
+//
 // JsonObject.cs
 //
 // Author:
@@ -37,14 +37,14 @@ namespace Hyena.Json
         {
             Dump (1);
         }
-        
+
         public void Dump (int levels)
         {
             if (Count == 0) {
                 Console.WriteLine ("{ }");
                 return;
             }
-        
+
             Console.WriteLine ("{");
             foreach (KeyValuePair<string, object> item in this) {
                 Console.Write ("{0}\"{1}\" : ", String.Empty.PadLeft (levels * 2, ' '), item.Key);
diff --git a/src/Libraries/Hyena/Hyena.Json/Tests/DeserializerTests.cs b/src/Libraries/Hyena/Hyena.Json/Tests/DeserializerTests.cs
index e5c9927..7c1bda8 100644
--- a/src/Libraries/Hyena/Hyena.Json/Tests/DeserializerTests.cs
+++ b/src/Libraries/Hyena/Hyena.Json/Tests/DeserializerTests.cs
@@ -40,13 +40,13 @@ namespace Hyena.Json.Tests
     public class DeserializerTests : Hyena.Tests.TestBase
     {
         private Deserializer deserializer;
-        
+
         [TestFixtureSetUp]
         public void Setup ()
         {
             deserializer = new Deserializer ();
         }
-        
+
         [Test]
         public void Literal ()
         {
@@ -56,39 +56,39 @@ namespace Hyena.Json.Tests
             Assert.AreEqual (true, (bool)deserializer.SetInput ("true").Deserialize ());
             Assert.AreEqual (false, (bool)deserializer.SetInput ("false").Deserialize ());
         }
-        
+
         [Test]
         public void Array ()
         {
             JsonArray array = (JsonArray)deserializer.SetInput ("[]").Deserialize ();
             Assert.AreEqual (0, array.Count);
-            
+
             array = (JsonArray)deserializer.SetInput ("[[]]").Deserialize ();
             Assert.AreEqual (1, array.Count);
             Assert.AreEqual (0, ((JsonArray)array[0]).Count);
-            
+
             array = (JsonArray)deserializer.SetInput ("[[true,[]]]").Deserialize ();
             Assert.AreEqual (1, array.Count);
             Assert.AreEqual (2, ((JsonArray)array[0]).Count);
             Assert.AreEqual (0, ((JsonArray)((JsonArray)array[0])[1]).Count);
-            
+
             array = (JsonArray)deserializer.SetInput ("[\"a\", 1.0, true]").Deserialize ();
             Assert.AreEqual (3, array.Count);
             Assert.AreEqual ("a", (string)array[0]);
             Assert.AreEqual (1, (double)array[1]);
             Assert.AreEqual (true, (bool)array[2]);
         }
-        
+
         [Test]
         public void Object ()
         {
             JsonObject obj = (JsonObject)deserializer.SetInput ("{}").Deserialize ();
             Assert.AreEqual (0, obj.Count);
-            
+
             obj = (JsonObject)deserializer.SetInput ("{\"a\":{}}").Deserialize ();
             Assert.AreEqual (1, obj.Count);
             Assert.AreEqual (0, ((JsonObject)obj["a"]).Count);
-            
+
             obj = (JsonObject)deserializer.SetInput ("{\"a\":[{\"b\":false},\"c\"]}").Deserialize ();
             Assert.AreEqual (1, obj.Count);
             JsonArray arr = (JsonArray)obj["a"];
diff --git a/src/Libraries/Hyena/Hyena.Json/Tests/TokenizerTests.cs b/src/Libraries/Hyena/Hyena.Json/Tests/TokenizerTests.cs
index 696fa95..146acb6 100644
--- a/src/Libraries/Hyena/Hyena.Json/Tests/TokenizerTests.cs
+++ b/src/Libraries/Hyena/Hyena.Json/Tests/TokenizerTests.cs
@@ -40,13 +40,13 @@ namespace Hyena.Json.Tests
     public class TokenizerTests : Hyena.Tests.TestBase
     {
         private Tokenizer tokenizer;
-        
+
         [TestFixtureSetUp]
         public void Setup ()
         {
             tokenizer = new Tokenizer ();
         }
-    
+
         [Test]
         public void Whitespace ()
         {
@@ -54,7 +54,7 @@ namespace Hyena.Json.Tests
             AssertTokenStream (" ");
             AssertTokenStream ("\f\n\r\t ");
         }
-        
+
         [Test]
         public void BoolNull ()
         {
@@ -63,42 +63,41 @@ namespace Hyena.Json.Tests
             AssertTokenStream ("false", Token.Bool (false));
             AssertTokenStream ("null", Token.Null);
         }
-        
+
         [Test]
         public void NumberInt ()
         {
-            // Number tests
-            AssertTokenStream ("0", Token.Number (0));
-            AssertTokenStream ("-0", Token.Number (-0));
-            
-            AssertTokenStream ("9", Token.Number (9));
-            AssertTokenStream ("-9", Token.Number (-9));
-            
-            AssertTokenStream ("14", Token.Number (14));
-            AssertTokenStream ("-14", Token.Number (-14));
-            
-            AssertTokenStream ("15309", Token.Number (15309));
-            AssertTokenStream ("-15309", Token.Number (-15309));
+            AssertTokenStream ("0", Token.Integer (0));
+            AssertTokenStream ("-0", Token.Integer (-0));
+
+            AssertTokenStream ("9", Token.Integer (9));
+            AssertTokenStream ("-9", Token.Integer (-9));
+
+            AssertTokenStream ("14", Token.Integer (14));
+            AssertTokenStream ("-14", Token.Integer (-14));
+
+            AssertTokenStream ("15309", Token.Integer (15309));
+            AssertTokenStream ("-15309", Token.Integer (-15309));
         }
-        
+
         [Test]
         public void NumberFloat ()
         {
             AssertTokenStream ("0.0", Token.Number (0.0));
             AssertTokenStream ("-0.0", Token.Number (-0.0));
-            
+
             AssertTokenStream ("1.9", Token.Number (1.9));
             AssertTokenStream ("-1.9", Token.Number (-1.9));
-            
+
             AssertTokenStream ("9.1", Token.Number (9.1));
             AssertTokenStream ("-9.1", Token.Number (-9.1));
-            
+
             AssertTokenStream ("15309.0", Token.Number (15309.0));
             AssertTokenStream ("15309.9", Token.Number (15309.9));
             AssertTokenStream ("-15309.01", Token.Number (-15309.01));
             AssertTokenStream ("-15309.9009", Token.Number (-15309.9009));
         }
-        
+
         [Test]
         public void NumberExponent ()
         {
@@ -108,13 +107,13 @@ namespace Hyena.Json.Tests
             AssertTokenStream ("-20.6e3", Token.Number (-20.6e3));
             AssertTokenStream ("-20.6e+3", Token.Number (-20.6e+3));
             AssertTokenStream ("-20.6e-3", Token.Number (-20.6e-3));
-            
+
             AssertTokenStream ("1e1", Token.Number (1e1));
             AssertTokenStream ("1E2", Token.Number (1E2));
             AssertTokenStream ("1.0e1", Token.Number (1.0e1));
             AssertTokenStream ("1.0E1", Token.Number (1.0E1));
         }
-        
+
         [Test]
         public void Strings ()
         {
@@ -130,7 +129,7 @@ namespace Hyena.Json.Tests
             AssertTokenStream (@"""1\uabcdef0""", Token.String ("1\uabcdef0"));
             AssertTokenStream (@"""\b\f\n\r\t""", Token.String ("\b\f\n\r\t"));
         }
-        
+
         [Test]
         public void Container ()
         {
@@ -139,42 +138,42 @@ namespace Hyena.Json.Tests
             AssertTokenStream ("{  }", Token.ObjectStart, Token.ObjectFinish);
             AssertTokenStream ("[  ]", Token.ArrayStart, Token.ArrayFinish);
             AssertTokenStream ("[{}]", Token.ArrayStart, Token.ObjectStart, Token.ObjectFinish, Token.ArrayFinish);
-            AssertTokenStream ("[[[ { } ]]]", 
-                Token.ArrayStart, Token.ArrayStart, Token.ArrayStart, 
-                Token.ObjectStart, Token.ObjectFinish, 
+            AssertTokenStream ("[[[ { } ]]]",
+                Token.ArrayStart, Token.ArrayStart, Token.ArrayStart,
+                Token.ObjectStart, Token.ObjectFinish,
                 Token.ArrayFinish, Token.ArrayFinish, Token.ArrayFinish);
         }
-        
+
         [Test]
         public void Array ()
         {
-            AssertTokenStream ("[1]", Token.ArrayStart, Token.Number (1), Token.ArrayFinish);
-            AssertTokenStream ("[1,0]", Token.ArrayStart, Token.Number (1), Token.Comma, Token.Number (0), Token.ArrayFinish);
-            AssertTokenStream ("[\"a\",true,null]", Token.ArrayStart, Token.String ("a"), Token.Comma, 
+            AssertTokenStream ("[1]", Token.ArrayStart, Token.Integer (1), Token.ArrayFinish);
+            AssertTokenStream ("[1,0]", Token.ArrayStart, Token.Integer (1), Token.Comma, Token.Integer (0), Token.ArrayFinish);
+            AssertTokenStream ("[\"a\",true,null]", Token.ArrayStart, Token.String ("a"), Token.Comma,
                 Token.Bool (true), Token.Comma, Token.Null, Token.ArrayFinish);
-            AssertTokenStream ("[0,1,[[2,[4]],5],6]", Token.ArrayStart, Token.Number (0), Token.Comma, Token.Number (1),
-                 Token.Comma, Token.ArrayStart, Token.ArrayStart, Token.Number (2), Token.Comma, Token.ArrayStart, 
-                 Token.Number (4), Token.ArrayFinish, Token.ArrayFinish, Token.Comma, Token.Number (5), Token.ArrayFinish,
-                 Token.Comma, Token.Number (6), Token.ArrayFinish);
+            AssertTokenStream ("[0,1,[[2,[4]],5],6]", Token.ArrayStart, Token.Integer (0), Token.Comma, Token.Integer (1),
+                 Token.Comma, Token.ArrayStart, Token.ArrayStart, Token.Integer (2), Token.Comma, Token.ArrayStart,
+                 Token.Integer (4), Token.ArrayFinish, Token.ArrayFinish, Token.Comma, Token.Integer (5), Token.ArrayFinish,
+                 Token.Comma, Token.Integer (6), Token.ArrayFinish);
         }
-        
+
         [Test]
         public void Object ()
         {
-            AssertTokenStream ("{\"a\":{}}", Token.ObjectStart, Token.String ("a"), Token.Colon, Token.ObjectStart, 
+            AssertTokenStream ("{\"a\":{}}", Token.ObjectStart, Token.String ("a"), Token.Colon, Token.ObjectStart,
                 Token.ObjectFinish, Token.ObjectFinish);
-            AssertTokenStream ("{\"a\":{\"b\":[],\"c\":false}}", Token.ObjectStart, Token.String ("a"), 
-                Token.Colon, Token.ObjectStart, Token.String ("b"), Token.Colon, Token.ArrayStart, Token.ArrayFinish, 
+            AssertTokenStream ("{\"a\":{\"b\":[],\"c\":false}}", Token.ObjectStart, Token.String ("a"),
+                Token.Colon, Token.ObjectStart, Token.String ("b"), Token.Colon, Token.ArrayStart, Token.ArrayFinish,
                 Token.Comma, Token.String ("c"), Token.Colon, Token.Bool (false), Token.ObjectFinish, Token.ObjectFinish);
-            AssertTokenStream ("[{\"a\":{},{}]", Token.ArrayStart, Token.ObjectStart, Token.String ("a"), Token.Colon, 
+            AssertTokenStream ("[{\"a\":{},{}]", Token.ArrayStart, Token.ObjectStart, Token.String ("a"), Token.Colon,
                 Token.ObjectStart, Token.ObjectFinish, Token.Comma, Token.ObjectStart, Token.ObjectFinish, Token.ArrayFinish);
-        }    
-        
+        }
+
         private void AssertTokenStream (string input, params Token [] tokens)
         {
             int cmp_idx = 0;
             tokenizer.SetInput (input);
-            
+
             while (true) {
                 Token token = tokenizer.Scan ();
                 if (token == null) {
@@ -183,18 +182,19 @@ namespace Hyena.Json.Tests
                     }
                     break;
                 }
-                
+
                 Token compare = tokens[cmp_idx++];
                 if (compare.Type != token.Type) {
-                    throw new ApplicationException (String.Format ("TokenTypes do not match (exp {0}, got {1}", 
+                    throw new ApplicationException (String.Format ("TokenTypes do not match (exp {0}, got {1}",
                         compare.Type, token.Type));
                 }
-                
+
                 if (compare.Value == null && token.Value == null) {
                     continue;
                 }
-                
-                if ((compare.Type == TokenType.Number && (double)compare.Value != (double)token.Value) ||
+
+                if ((compare.Type == TokenType.Integer && (int)compare.Value != (int)token.Value) ||
+                    (compare.Type == TokenType.Number && (double)compare.Value != (double)token.Value) ||
                     (compare.Type == TokenType.String && (string)compare.Value != (string)token.Value) ||
                     (compare.Type == TokenType.Boolean && (bool)compare.Value != (bool)token.Value)) {
                     throw new ApplicationException ("Token values do not match");
diff --git a/src/Libraries/Hyena/Hyena.Json/Token.cs b/src/Libraries/Hyena/Hyena.Json/Token.cs
index cce60c7..4f9de6f 100644
--- a/src/Libraries/Hyena/Hyena.Json/Token.cs
+++ b/src/Libraries/Hyena/Hyena.Json/Token.cs
@@ -1,4 +1,4 @@
-// 
+//
 // Token.cs
 //
 // Author:
@@ -29,19 +29,19 @@
 using System;
 
 namespace Hyena.Json
-{   
+{
     internal class Token
     {
         public Token (TokenType type) : this (type, null)
         {
         }
-        
+
         public Token (TokenType type, object value)
         {
             this.type = type;
             this.value = value;
         }
-        
+
         private TokenType type;
         public TokenType Type {
             get { return type; }
@@ -58,51 +58,56 @@ namespace Hyena.Json
             get { return source_line; }
             internal set { source_line = value; }
         }
-        
+
         private int source_column;
         public int SourceColumn {
             get { return source_column; }
             internal set { source_column = value; }
         }
-        
+
         internal static Token ObjectStart {
             get { return new Token (TokenType.ObjectStart); }
         }
-        
+
         internal static Token ObjectFinish {
             get { return new Token (TokenType.ObjectFinish); }
         }
-        
+
         internal static Token ArrayStart {
             get { return new Token (TokenType.ArrayStart); }
         }
-        
+
         internal static Token ArrayFinish {
             get { return new Token (TokenType.ArrayFinish); }
         }
-        
+
         internal static Token Null {
             get { return new Token (TokenType.Null); }
         }
-        
+
         internal static Token Comma {
             get { return new Token (TokenType.Comma); }
         }
-        
+
         internal static Token Colon {
             get { return new Token (TokenType.Colon); }
         }
-        
+
         internal static Token Number (double value)
         {
             return new Token (TokenType.Number, value);
         }
-        
+
+        internal static Token Integer (int value)
+        {
+            return new Token (TokenType.Integer, value);
+        }
+
         internal static Token String (string value)
         {
             return new Token (TokenType.String, value);
         }
-        
+
         internal static Token Bool (bool value)
         {
             return new Token (TokenType.Boolean, value);
diff --git a/src/Libraries/Hyena/Hyena.Json/TokenType.cs b/src/Libraries/Hyena/Hyena.Json/TokenType.cs
index b24a5ca..09b14a7 100644
--- a/src/Libraries/Hyena/Hyena.Json/TokenType.cs
+++ b/src/Libraries/Hyena/Hyena.Json/TokenType.cs
@@ -1,4 +1,4 @@
-// 
+//
 // TokenType.cs
 //
 // Author:
@@ -42,10 +42,11 @@ namespace Hyena.Json
         String = 1 << 5,
         Null = 1 << 6,
         Number = 1 << 7,
-        Comma = 1 << 8,
-        Colon = 1 << 9,
-        
-        Literal = String | Number | Boolean | Null,
+        Integer = 1 << 8,
+        Comma = 1 << 9,
+        Colon = 1 << 10,
+
+        Literal = String | Number | Boolean | Null | Integer,
         Value = ObjectStart | ArrayStart | Literal
     }
 }
diff --git a/src/Libraries/Hyena/Hyena.Json/Tokenizer.cs b/src/Libraries/Hyena/Hyena.Json/Tokenizer.cs
index f866c0b..90d1dd4 100644
--- a/src/Libraries/Hyena/Hyena.Json/Tokenizer.cs
+++ b/src/Libraries/Hyena/Hyena.Json/Tokenizer.cs
@@ -1,4 +1,4 @@
-// 
+//
 // Tokenizer.cs
 //
 // Author:
@@ -36,18 +36,18 @@ namespace Hyena.Json
     {
         private StreamReader reader;
         private StringBuilder string_buffer;
-        
+
         private char peek = ' ';
         private int current_line = 1;
         private int current_column = 1;
         private int token_start_line;
         private int token_start_column;
-        
+
         public Tokenizer () { Reset (); }
         public Tokenizer (string input) { SetInput (input); }
         public Tokenizer (Stream stream) { SetInput (stream); }
         public Tokenizer (StreamReader reader) { SetInput (reader); }
-        
+
         private void Reset ()
         {
             peek = ' ';
@@ -56,62 +56,62 @@ namespace Hyena.Json
             token_start_line = 0;
             token_start_column = 0;
         }
-        
+
         public void SetInput (StreamReader reader)
         {
             this.reader = reader;
             Reset ();
         }
-        
+
         public void SetInput (Stream stream)
         {
             SetInput (new StreamReader (stream));
         }
-        
+
         public void SetInput (string input)
         {
             SetInput (new MemoryStream (Encoding.UTF8.GetBytes (input)));
         }
-        
+
         private void ReadChar ()
         {
             peek = (char)reader.Read ();
             current_column++;
         }
-        
+
         private void UnexpectedCharacter (char ch)
         {
-            throw new ApplicationException (String.Format ("Unexpected character '{0}' at [{1}:{2}]", 
+            throw new ApplicationException (String.Format ("Unexpected character '{0}' at [{1}:{2}]",
                 ch, current_line, current_column - 1));
         }
-        
+
         private void InvalidSyntax (string message)
         {
             throw new ApplicationException (String.Format ("Invalid syntax: {0} at [{1}:{2}]",
                 message, current_line, current_column));
         }
-        
+
         private StringBuilder GetStringBuilder ()
         {
             if (string_buffer == null) {
                 string_buffer = new StringBuilder (64);
                 return string_buffer;
             }
-            
+
             string_buffer.Remove (0, string_buffer.Length);
             return string_buffer;
         }
-        
+
         private string LexString ()
         {
             StringBuilder buffer = GetStringBuilder ();
             bool read = true;
-            
+
             while (!reader.EndOfStream) {
                 if (read) {
                     ReadChar ();
                 }
-                
+
                 read = true;
 
                 if (peek == '\\') {
@@ -141,16 +141,16 @@ namespace Hyena.Json
                     buffer.Append (peek);
                 }
             }
-            
+
             if (peek != '"') {
                 InvalidSyntax ("Unterminated string, expected '\"' termination, got '" + peek + "'");
             } else if (!read && reader.EndOfStream) {
                 ReadChar ();
             }
-            
+
             return buffer.ToString ();
         }
-        
+
         private string LexId ()
         {
             StringBuilder buffer = GetStringBuilder ();
@@ -162,42 +162,42 @@ namespace Hyena.Json
 
             return buffer.ToString ();
         }
-        
-        private double LexInt ()
+
+        private int LexInt ()
         {
             return LexInt (false, 0);
         }
-        
-        private double LexInt (bool hex, int maxDigits)
+
+        private int LexInt (bool hex, int maxDigits)
         {
-            double value = 0.0;
+            int value = 0;
             int count = 0;
-            
+
             do {
-                value = (hex ? 16 : 10) * value +  (hex 
+                value = (hex ? 16 : 10) * value +  (hex
                     ? peek >= 'A' && peek <= 'F'
                         ? 10 + peek - 'A'
                         : (peek >= 'a' && peek <= 'f'
                             ? 10 + peek - 'a'
                             : peek - '0')
                     : peek - '0');
-                    
+
                 if (maxDigits > 0 && ++count >= maxDigits) {
                     ReadChar ();
                     return value;
                 }
-                
+
                 ReadChar ();
             } while (Char.IsDigit (peek) || (hex && ((peek >= 'a' && peek <= 'f') || (peek >= 'A' && peek <= 'F'))));
-            
+
             return value;
         }
-        
+
         private double LexFraction ()
         {
             double fraction = 0;
             double d = 10;
-            
+
             while (true) {
                 ReadChar ();
 
@@ -208,58 +208,65 @@ namespace Hyena.Json
                 fraction += (peek - '0') / d;
                 d *= 10;
             }
-            
+
             return fraction;
         }
-        
-        private double LexNumber ()
+
+        private object LexNumber (out bool isDouble)
         {
-            double value = 0.0;
+            isDouble = false;
+            int  intVal = 0;
+            double doubleVal = 0.0;
             bool negate = peek == '-';
             if (negate) {
                 ReadChar ();
             }
-            
+
             if (peek != '0') {
-                value = LexInt ();
+                doubleVal = intVal = LexInt ();
             } else {
                 ReadChar ();
             }
-            
+
             if (peek == '.') {
-                value += LexFraction ();
+                isDouble = true;
+                doubleVal += LexFraction ();
             }
-            
+
             if (peek == 'e' || peek == 'E') {
+                isDouble = true;
                 ReadChar ();
                 if (peek == '-') {
                     ReadChar ();
-                    value /= Math.Pow (10, LexInt ());
+                    doubleVal /= Math.Pow (10, LexInt ());
                 } else if (peek == '+') {
                     ReadChar ();
-                    value *= Math.Pow (10, LexInt ());
+                    doubleVal *= Math.Pow (10, LexInt ());
                 } else if (Char.IsDigit (peek)) {
-                    value *= Math.Pow (10, LexInt ());
+                    doubleVal *= Math.Pow (10, LexInt ());
                 } else {
                     InvalidSyntax ("Malformed exponent");
                 }
             }
-            
+
             if (Char.IsDigit (peek)) {
                 InvalidSyntax ("Numbers starting with 0 must be followed by a . or not " +
                     "followed by a digit (octal syntax not legal)");
             }
-            
-            return negate ? -1.0 * value : value;
+
+            if (!isDouble)
+                return negate ? -1 * intVal : intVal;
+            else
+                return negate ? -1.0 * doubleVal : doubleVal;
         }
-        
+
         public Token Scan ()
         {
             Token token = InnerScan ();
             if (token == null) {
                 return null;
             }
-            
+
             token.SourceLine = token_start_line;
             token.SourceColumn = token_start_column - 1;
             return token;
@@ -291,7 +298,12 @@ namespace Hyena.Json
                 case '"': return new Token (TokenType.String, LexString ());
                 default:
                     if (peek == '-' || Char.IsDigit (peek)) {
-                        return new Token (TokenType.Number, LexNumber ());
+                        bool isDouble;
+                        object num = LexNumber (out isDouble);
+                        if (!isDouble)
+                            return new Token (TokenType.Integer, num);
+                        else
+                            return new Token (TokenType.Number, num);
                     } else if (Char.IsLetter (peek)) {
                         string identifier = LexId ();
                         switch (identifier) {
@@ -303,13 +315,13 @@ namespace Hyena.Json
                                 break;
                         }
                     }
-                
+
                     if (peek != Char.MaxValue) {
                         UnexpectedCharacter (peek);
                     }
                     break;
             }
-            
+
             return null;
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.Query/AliasedObjectSet.cs b/src/Libraries/Hyena/Hyena.Query/AliasedObjectSet.cs
index 05f1632..ba8ad48 100644
--- a/src/Libraries/Hyena/Hyena.Query/AliasedObjectSet.cs
+++ b/src/Libraries/Hyena/Hyena.Query/AliasedObjectSet.cs
@@ -75,7 +75,7 @@ namespace Hyena.Query
         {
             input = input.ToLower ();
             foreach (string alias in aliases) {
-                if (input.Contains (alias)) {
+                if (input.StartsWith (alias)) {
                     return alias;
                 }
             }
diff --git a/src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs
new file mode 100644
index 0000000..6b83945
--- /dev/null
+++ b/src/Libraries/Hyena/Hyena.Query/EnumQueryValue.cs
@@ -0,0 +1,111 @@
+//
+// EnumQueryValue.cs
+//
+// Author:
+//   Alexander Kojevnikov <alexander at kojevnikov.com>
+//
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.Text;
+
+using Mono.Unix;
+
+using Hyena;
+
+namespace Hyena.Query
+{
+    public abstract class EnumQueryValue : QueryValue
+    {
+        public static readonly Operator Equal    = new Operator ("equals", Catalog.GetString ("is"), "= {0}", "=", "==", ":");
+        public static readonly Operator NotEqual = new Operator ("notEqual", Catalog.GetString ("is not"), "!= {0}", true, "!=", "!:");
+
+        protected int value;
+
+        public abstract IEnumerable<EnumQueryValueItem> Items { get; }
+
+        public override string XmlElementName {
+            get { return "int"; }
+        }
+
+        public override object Value {
+            get { return value; }
+        }
+
+        public void SetValue (int value)
+        {
+            this.value = value;
+            IsEmpty = false;
+        }
+
+        protected static AliasedObjectSet<Operator> operators = new AliasedObjectSet<Operator> (Equal, NotEqual);
+        public override AliasedObjectSet<Operator> OperatorSet {
+            get { return operators; }
+        }
+
+        public override void ParseUserQuery (string input)
+        {
+            foreach (var item in Items) {
+                if (input == item.ID.ToString () || input == item.Name || item.Aliases.Contains (input)) {
+                    value = item.ID;
+                    IsEmpty = false;
+                    break;
+                }
+            }
+        }
+
+        public override void ParseXml (XmlElement node)
+        {
+            IsEmpty = !Int32.TryParse (node.InnerText, out value);
+        }
+
+        public override void LoadString (string str)
+        {
+            ParseUserQuery (str);
+        }
+
+        public override string ToSql (Operator op)
+        {
+            return Convert.ToString (value, System.Globalization.CultureInfo.InvariantCulture);
+        }
+    }
+
+    public sealed class EnumQueryValueItem : IAliasedObject
+    {
+        public int ID { get; private set; }
+        public string Name { get; private set; }
+        public string DisplayName { get; private set; }
+        public string[] Aliases { get; private set; }
+
+        public EnumQueryValueItem (int id, string name, string display_name, params string[] aliases)
+        {
+            ID = id;
+            Name = name;
+            DisplayName = display_name;
+            Aliases = aliases;
+        }
+    }
+}
diff --git a/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs
index 757f854..ba0ad75 100644
--- a/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs
@@ -125,7 +125,7 @@ namespace Hyena.Query
                 }
             }
         }
-        
+
         public override string ToUserQuery ()
         {
             return ToUserQuery (false);
@@ -135,8 +135,8 @@ namespace Hyena.Query
         {
             if (factor != FileSizeFactor.None) {
                 return String.Format ("{0} {1}",
-                    IntValue == 0 
-                        ? "0" 
+                    IntValue == 0
+                        ? "0"
                         : StringUtil.DoubleToTenthsPrecision (((double)IntValue / (double)factor), always_decimal),
                     factor.ToString ()
                 );
diff --git a/src/Libraries/Hyena/Hyena.Query/IntegerKeyedObjectQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/IntegerKeyedObjectQueryValue.cs
index e68f161..7cbc9b0 100644
--- a/src/Libraries/Hyena/Hyena.Query/IntegerKeyedObjectQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/IntegerKeyedObjectQueryValue.cs
@@ -33,7 +33,7 @@ namespace Hyena.Query
     public abstract class IntegerKeyedObjectQueryValue<T> : IntegerQueryValue where T : class
     {
         private T object_value;
-        
+
         public override void SetValue (long value)
         {
             object_value = null;
@@ -48,7 +48,7 @@ namespace Hyena.Query
                 return object_value;
             }
         }
-        
+
         protected abstract T Resolve ();
     }
 }
diff --git a/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
index df2a13c..abb3245 100644
--- a/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
@@ -55,7 +55,7 @@ namespace Hyena.Query
         {
             IsEmpty = !Int64.TryParse (input, out value);
         }
-        
+
         public override void LoadString (string input)
         {
             ParseUserQuery (input);
diff --git a/src/Libraries/Hyena/Hyena.Query/NullQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/NullQueryValue.cs
index 06aa001..e1eac54 100644
--- a/src/Libraries/Hyena/Hyena.Query/NullQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/NullQueryValue.cs
@@ -39,7 +39,7 @@ namespace Hyena.Query
     public class NullQueryValue : QueryValue
     {
         public static readonly Operator IsNullOrEmpty  = new Operator ("empty", Catalog.GetString ("empty"), "IN (NULL, '', 0)", true, "!");
-        
+
         public static readonly NullQueryValue Instance = new NullQueryValue ();
 
         public override string XmlElementName {
@@ -63,7 +63,7 @@ namespace Hyena.Query
         public override void ParseUserQuery (string input)
         {
         }
-        
+
         public override void LoadString (string input)
         {
         }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryField.cs b/src/Libraries/Hyena/Hyena.Query/QueryField.cs
index 7e4bc3e..75288d2 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryField.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryField.cs
@@ -48,7 +48,7 @@ namespace Hyena.Query
             get { return name; }
             set { name = value; }
         }
-        
+
         private string property_name;
         public string PropertyName {
             get { return property_name; }
@@ -174,7 +174,7 @@ namespace Hyena.Query
         public static string ToTermString (string alias, string op, string value)
         {
             value = String.Format (
-                "{1}{0}{1}", 
+                "{1}{0}{1}",
                 value, value.IndexOf (" ") == -1 ? String.Empty : "\""
             );
 
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs b/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs
index e090e07..366481b 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs
@@ -44,23 +44,23 @@ namespace Hyena.Query
     {
         private List<QueryNode> children = new List<QueryNode>();
         private Keyword keyword;
-    
+
         public QueryListNode(Keyword keyword) : base()
         {
             this.keyword = keyword;
         }
-        
+
         public QueryListNode(Keyword keyword, QueryListNode parent) : base(parent)
         {
             this.keyword = keyword;
         }
-        
+
         public void AddChild(QueryNode child)
         {
             child.Parent = this;
             children.Add(child);
         }
-        
+
         public void RemoveChild(QueryNode child)
         {
             child.Parent = null;
@@ -74,52 +74,52 @@ namespace Hyena.Query
             }
             from.Children.Clear ();
         }
-        
+
         public void ReplaceChild(QueryNode old_child, QueryNode new_child)
         {
             int index = children.IndexOf(old_child);
             if(index < 0) {
                 throw new ApplicationException("old_child does not exist");
             }
-            
+
             children.RemoveAt(index);
             children.Insert(index, new_child);
         }
-        
+
         public void InsertChild(int index, QueryNode child)
         {
             child.Parent = this;
             children.Insert(index, child);
         }
-        
+
         public int IndexOfChild(QueryNode child)
         {
             return children.IndexOf(child);
         }
-        
+
         internal override void Dump(int depth)
         {
             PrintIndent(depth);
             Console.WriteLine("<{0}>", Keyword);
-            
+
             foreach(QueryNode child in children) {
                 child.Dump(depth + 1);
             }
-            
+
             PrintIndent(depth);
             Console.WriteLine("</{0}>", Keyword);
         }
-        
+
         public QueryNode GetLeftSibling(QueryNode node)
         {
             int index = IndexOfChild(node);
             if(index >= 1) {
                 return Children[index - 1];
             }
-            
+
             return null;
         }
-        
+
         public QueryNode GetRightSibling(QueryNode node)
         {
             int index = IndexOfChild(node);
@@ -228,15 +228,15 @@ namespace Hyena.Query
         public bool IsEmpty {
             get { return ChildCount == 0; }
         }
-        
+
         public List<QueryNode> Children {
             get { return children; }
         }
-        
+
         public QueryNode LastChild {
             get { return ChildCount > 0 ? children[ChildCount - 1] : null; }
         }
-        
+
         public int ChildCount {
             get { return children.Count; }
         }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryNode.cs b/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
index 59e8420..0634c8c 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
@@ -40,33 +40,33 @@ namespace Hyena.Query
         DepthFirst,
         BreadthFirst
     }
-    
+
     public abstract class QueryNode
     {
         private QueryListNode parent;
         private int source_column;
         private int source_line;
-        
+
         public QueryNode()
         {
         }
-        
+
         public QueryNode(QueryListNode parent)
         {
             Parent = parent;
             Parent.AddChild(this);
         }
-        
+
         protected void PrintIndent(int depth)
         {
             Console.Write(String.Empty.PadLeft(depth * 2, ' '));
         }
-        
+
         public void Dump()
         {
             Dump(0);
         }
-        
+
         internal virtual void Dump(int depth)
         {
             PrintIndent(depth);
@@ -115,12 +115,12 @@ namespace Hyena.Query
                 }
             }
         }
-        
+
         public IEnumerable<T> SearchForValues<T> () where T : QueryValue
         {
             return SearchForValues<T> (QueryNodeSearchMethod.DepthFirst);
         }
-        
+
         public IEnumerable<T> SearchForValues<T> (QueryNodeSearchMethod method) where T : QueryValue
         {
             if (method == QueryNodeSearchMethod.DepthFirst) {
@@ -129,7 +129,7 @@ namespace Hyena.Query
                 return SearchForValuesByBreadth<T> ();
             }
         }
-        
+
         private static IEnumerable<T> SearchForValuesByDepth<T> (QueryNode node) where T : QueryValue
         {
             QueryListNode list = node as QueryListNode;
@@ -149,7 +149,7 @@ namespace Hyena.Query
                 }
             }
         }
-        
+
         private IEnumerable<T> SearchForValuesByBreadth<T> () where T : QueryValue
         {
             Queue<QueryNode> queue = new Queue<QueryNode> ();
@@ -214,17 +214,17 @@ namespace Hyena.Query
         }
 
         public abstract void AppendSql (StringBuilder sb, QueryFieldSet fieldSet);
-        
+
         public QueryListNode Parent {
             get { return parent; }
             set { parent = value; }
         }
-        
+
         public int SourceColumn {
             get { return source_column; }
             set { source_column = value; }
         }
-        
+
         public int SourceLine {
             get { return source_line; }
             set { source_line = value; }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryOperator.cs b/src/Libraries/Hyena/Hyena.Query/QueryOperator.cs
index 644ee9b..db46ddb 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryOperator.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryOperator.cs
@@ -66,7 +66,7 @@ namespace Hyena.Query
         public bool IsNot {
             get { return is_not; }
         }
-        
+
         internal Operator (string name, string label, string sql_format, params string [] userOps) : this (name, label, sql_format, false, userOps)
         {
         }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryParser.cs b/src/Libraries/Hyena/Hyena.Query/QueryParser.cs
index 32a373a..97dd46e 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryParser.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryParser.cs
@@ -36,7 +36,7 @@ namespace Hyena.Query
     public abstract class QueryParser
     {
         protected StreamReader reader;
-        
+
         public QueryParser()
         {
             Reset ();
@@ -57,7 +57,7 @@ namespace Hyena.Query
 
         public abstract QueryNode BuildTree (QueryFieldSet fieldSet);
         public abstract void Reset ();
-        
+
         public StreamReader InputReader {
             get { return reader; }
             set { reader = value; }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryTermNode.cs b/src/Libraries/Hyena/Hyena.Query/QueryTermNode.cs
index 094d60f..27c50ab 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryTermNode.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryTermNode.cs
@@ -48,11 +48,12 @@ namespace Hyena.Query
             string field_alias = field_set.FindAlias (token);
             if (field_alias != null) {
                 term.Field = field_set [field_alias];
+                string token_without_field = token.Substring (field_alias.Length);
 
                 foreach (QueryValue val in term.Field.CreateQueryValues ()) {
                     term.Value = val;
 
-                    string op_alias = term.Value.OperatorSet.FindAlias (token);
+                    string op_alias = term.Value.OperatorSet.FindAlias (token_without_field);
                     if (op_alias != null) {
                         term.Operator = term.Value.OperatorSet [op_alias];
                         int field_separator = token.IndexOf (op_alias);
@@ -90,7 +91,7 @@ namespace Hyena.Query
             }
             return this;
         }
-        
+
         public override void AppendUserQuery (StringBuilder sb)
         {
             sb.Append (Field == null ? Value.ToUserQuery () : Field.ToTermString (Operator.PrimaryAlias, Value.ToUserQuery ()));
@@ -118,13 +119,13 @@ namespace Hyena.Query
             if (Field == null) {
                 sb.Append ("(");
                 int emitted = 0;
-                
+
                 foreach (QueryField field in fieldSet.Fields) {
                     if (field.IsDefault)
                         if (EmitTermMatch (sb, field, emitted > 0))
                             emitted++;
                 }
-                
+
                 sb.Append (")");
             } else {
                 EmitTermMatch (sb, Field, false);
@@ -154,7 +155,7 @@ namespace Hyena.Query
             get { return op; }
             set { op = value; }
         }
-        
+
         public QueryValue Value {
             get { return qvalue; }
             set { qvalue = value; }
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryToken.cs b/src/Libraries/Hyena/Hyena.Query/QueryToken.cs
index e3fac84..aa7a363 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryToken.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryToken.cs
@@ -40,7 +40,7 @@ namespace Hyena.Query
         Range,
         Term
     }
-    
+
     public class QueryToken
     {
         private TokenID id;
diff --git a/src/Libraries/Hyena/Hyena.Query/QueryValue.cs b/src/Libraries/Hyena/Hyena.Query/QueryValue.cs
index a39e3ae..875517a 100644
--- a/src/Libraries/Hyena/Hyena.Query/QueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/QueryValue.cs
@@ -62,7 +62,7 @@ namespace Hyena.Query
 
             return null;
         }
-        
+
         public static QueryValue CreateFromStringValue (string input, QueryField field)
         {
             if (field == null) {
diff --git a/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
index 772ef48..bd9d271 100644
--- a/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
@@ -50,7 +50,7 @@ namespace Hyena.Query
         public override AliasedObjectSet<Operator> OperatorSet {
             get { return operators; }
         }
-        
+
         public static RelativeTimeSpanQueryValue RelativeToNow (DateTime since)
         {
             RelativeTimeSpanQueryValue qv = new RelativeTimeSpanQueryValue ();
diff --git a/src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs
index 5e60d4a..a707283 100644
--- a/src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/StringQueryValue.cs
@@ -94,7 +94,7 @@ namespace Hyena.Query
                            .Replace ("%", "\\%")
                            .Replace ("_", "\\_");
             }
-            
+
             return orig;
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.Query/Tests/QueryTests.cs b/src/Libraries/Hyena/Hyena.Query/Tests/QueryTests.cs
index 2302f3e..ceb5c29 100644
--- a/src/Libraries/Hyena/Hyena.Query/Tests/QueryTests.cs
+++ b/src/Libraries/Hyena/Hyena.Query/Tests/QueryTests.cs
@@ -77,12 +77,12 @@ namespace Hyena.Query.Tests
         public void QueryValueSql ()
         {
             QueryValue qv;
-            
+
             qv = new DateQueryValue (); qv.ParseUserQuery ("2007-03-9");
             Assert.AreEqual (new DateTime (2007, 3, 9), qv.Value);
             Assert.AreEqual ("2007-03-09", qv.ToUserQuery ());
             Assert.AreEqual ("1173420000", qv.ToSql ());
-    
+
             qv = new StringQueryValue (); qv.ParseUserQuery ("foo 'bar'");
             Assert.AreEqual ("foo 'bar'", qv.Value);
             Assert.AreEqual ("foo 'bar'", qv.ToUserQuery ());
@@ -92,34 +92,34 @@ namespace Hyena.Query.Tests
             Assert.AreEqual ("Foo Baño", qv.Value);
             Assert.AreEqual ("Foo Baño", qv.ToUserQuery ());
             Assert.AreEqual ("foo bano", qv.ToSql ());
-    
+
             qv = new ExactStringQueryValue (); qv.ParseUserQuery ("foo 'bar'");
             Assert.AreEqual ("foo 'bar'", qv.Value);
             Assert.AreEqual ("foo 'bar'", qv.ToUserQuery ());
             Assert.AreEqual ("foo ''bar''", qv.ToSql ());
-    
+
             qv = new IntegerQueryValue (); qv.ParseUserQuery ("22");
             Assert.AreEqual (22, qv.Value);
             Assert.AreEqual ("22", qv.ToUserQuery ());
             Assert.AreEqual ("22", qv.ToSql ());
-    
+
             qv = new FileSizeQueryValue (); qv.ParseUserQuery ("2048 KB");
             Assert.AreEqual (2097152, qv.Value);
             Assert.AreEqual ("2.048 KB", qv.ToUserQuery ());
             Assert.AreEqual ("2097152", qv.ToSql ());
-    
+
             // TODO this will break once an it_IT translation for "days ago" etc is committed
             qv = new RelativeTimeSpanQueryValue (); qv.ParseUserQuery ("2 days ago");
             Assert.AreEqual (-172800, qv.Value);
             Assert.AreEqual ("2 days ago", qv.ToUserQuery ());
-    
+
             // TODO this will break once an it_IT translation for "minutes" etc is committed
             qv = new TimeSpanQueryValue (); qv.ParseUserQuery ("4 minutes");
             Assert.AreEqual (240, qv.Value);
             Assert.AreEqual ("4 minutes", qv.ToUserQuery ());
             Assert.AreEqual ("240000", qv.ToSql ());
         }
-    
+
         [Test]
         public void QueryParsing ()
         {
@@ -141,17 +141,19 @@ namespace Hyena.Query.Tests
                 "by:baz -on:bar",
                 "by:baz -on:bar",
                 "by:baz (plays>3 or plays<2)",
+                "by:on", // bgo#601065
+                "on:by",
             };
-    
+
             AssertForEach<string> (tests, UserQueryParsesAndGenerates);
         }
-    
+
         [Test]
         public void CustomFormatParenthesisBugFixed ()
         {
             QueryValue val = new StringQueryValue ();
             val.ParseUserQuery ("mp3");
-    
+
             Assert.AreEqual (
                 "(CoreTracks.MimeType LIKE '%mp3%' ESCAPE '\\' OR CoreTracks.Uri LIKE '%mp3%' ESCAPE '\\')",
                 MimeTypeField.ToSql (StringQueryValue.Contains, val)
@@ -229,15 +231,15 @@ namespace Hyena.Query.Tests
             Assert.IsNotNull (query_tree, "Query should parse");
             Assert.AreEqual ("by==\"foo (disc 2)\"", query_tree.ToUserQuery ());
         }
-    
+
         private static void UserQueryParsesAndGenerates (string query)
         {
             QueryNode node = UserQueryParser.Parse (query, FieldSet);
             if (query == null || query.Trim () == String.Empty) {
-                Assert.AreEqual (node, null); 
+                Assert.AreEqual (node, null);
                 return;
             }
-    
+
             Assert.AreEqual (query, node.ToUserQuery ());
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs b/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs
index 6d38233..ee7b49e 100644
--- a/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs
+++ b/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs
@@ -62,7 +62,7 @@ namespace Hyena.Query
             field_set = fieldSet;
             root = current_parent = new QueryListNode (Keyword.And);
             bool last_was_term = false;
-            
+
             while (true) {
                 QueryToken token = Scan ();
 
@@ -72,7 +72,7 @@ namespace Hyena.Query
 
                 token.Column = token_start_column;
                 token.Line = token_start_line;
-                
+
                 // If we have two terms in a row, put an AND between them
                 if (last_was_term && token.ID == TokenID.Term)
                     ParseToken (new QueryToken (TokenID.And));
@@ -84,19 +84,19 @@ namespace Hyena.Query
 
             return root.Trim ();
         }
-        
+
         private void DepthPush ()
         {
             current_parent = new QueryListNode (Keyword.And, current_parent);
         }
-        
+
         private void DepthPop ()
         {
             // Avoid trying to pop more than is possible
             if (current_parent.Parent != null)
                 current_parent = current_parent.Parent;
         }
-        
+
         private void NodePush (QueryNode node)
         {
             if (current_parent == null && node is QueryListNode) {
@@ -115,7 +115,7 @@ namespace Hyena.Query
                 current_parent = list;
             }
         }
-        
+
         private void ParseToken (QueryToken token)
         {
             switch (token.ID) {
@@ -169,7 +169,7 @@ namespace Hyena.Query
                 else
                     eos_consumed = true;
             }
-            
+
             for (; ; ReadChar ()) {
                 if (Char.IsWhiteSpace (peek) && peek != '\n') {
                     continue;
@@ -201,10 +201,10 @@ namespace Hyena.Query
 
                 if (reader.EndOfStream)
                     eos_consumed = true;
-                
+
                 switch (token) {
-                    case "or": 
-                    case "OR": 
+                    case "or":
+                    case "OR":
                         return new QueryToken (TokenID.Or);
                     case "NOT":
                         return new QueryToken (TokenID.Not);
@@ -248,7 +248,7 @@ namespace Hyena.Query
                     break;
                 }
             }
-            
+
             return buffer.ToString ();
         }
 
@@ -266,7 +266,7 @@ namespace Hyena.Query
             if (peek == Char.MinValue) {
                 return;
             }
-            
+
             peek = (char)reader.Read ();
             current_column++;
         }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/ArithmeticFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/ArithmeticFunctionSet.cs
index 62414c8..3b92d77 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/ArithmeticFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/ArithmeticFunctionSet.cs
@@ -45,25 +45,25 @@ namespace Hyena.SExpEngine
         {
             double result = 0.0;
             bool as_int = true;
-            
+
             for(int i = 0; i < args.Length; i++) {
                 TreeNode arg = Evaluate(args[i]);
-                
+
                 if(arg is IntLiteral || arg is DoubleLiteral) {
                     double arg_value;
-                    
+
                     if(arg is DoubleLiteral) {
                         as_int = false;
                         arg_value = (arg as DoubleLiteral).Value;
                     } else {
                         arg_value = (int)(arg as IntLiteral).Value;
                     }
-                    
+
                     if(i == 0) {
                         result = arg_value;
                         continue;
                     }
-                    
+
                     switch(operation) {
                         case ArithmeticOperation.Add:
                             result += arg_value;
@@ -81,76 +81,76 @@ namespace Hyena.SExpEngine
                             if(!(arg is IntLiteral)) {
                                 throw new ArgumentException("Modulo requires int arguments");
                             }
-                            
+
                             result %= (int)arg_value;
                             break;
-                    }       
+                    }
                 } else {
                     throw new ArgumentException("arguments must be double or int");
                 }
             }
-            
-            return as_int ? 
-                ((TreeNode)new IntLiteral((int)result)) : 
+
+            return as_int ?
+                ((TreeNode)new IntLiteral((int)result)) :
                 ((TreeNode)new DoubleLiteral(result));
         }
-        
+
         [Function("add", "+")]
         public virtual TreeNode OnAdd(TreeNode [] args)
         {
             TreeNode first = Evaluate(args[0]);
-            
+
             if(first is StringLiteral) {
                 return StringFunctionSet.ConcatenateStrings(Evaluator, args);
             }
-        
+
             return OnPerformArithmetic(args, ArithmeticOperation.Add);
         }
-        
+
         [Function("sub", "-")]
         public virtual TreeNode OnSubtract(TreeNode [] args)
         {
             return OnPerformArithmetic(args, ArithmeticOperation.Subtract);
         }
-        
+
         [Function("mul", "*")]
         public virtual TreeNode OnMultiply(TreeNode [] args)
         {
             return OnPerformArithmetic(args, ArithmeticOperation.Multiply);
         }
-        
+
         [Function("div", "/")]
         public virtual TreeNode OnDivide(TreeNode [] args)
         {
             return OnPerformArithmetic(args, ArithmeticOperation.Divide);
         }
-        
+
         [Function("mod", "%")]
         public virtual TreeNode OnModulo(TreeNode [] args)
         {
             return OnPerformArithmetic(args, ArithmeticOperation.Modulo);
         }
-        
+
         [Function("++")]
         public virtual TreeNode OnIncrement(TreeNode [] args)
         {
             return IntegerUpdate(args, 1);
         }
-        
+
         [Function("--")]
         public virtual TreeNode OnDecrement(TreeNode [] args)
         {
             return IntegerUpdate(args, -1);
         }
-        
+
         private TreeNode IntegerUpdate(TreeNode [] args, int value)
         {
             TreeNode variable_node = (FunctionNode)args[0];
             TreeNode result = Evaluate(variable_node);
             TreeNode new_result = new IntLiteral(((IntLiteral)result).Value + value);
-            
+
             FunctionFunctionSet.VariableSet(Evaluator, args[0], new_result);
-            
+
             return new_result;
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/CastFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/CastFunctionSet.cs
index 526db08..ba3063d 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/CastFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/CastFunctionSet.cs
@@ -37,8 +37,8 @@ namespace Hyena.SExpEngine
         {
             if(args.Length != 1) {
                 throw new ArgumentException("cast must have only one argument");
-            } 
-            
+            }
+
             TreeNode arg = Evaluate(args[0]);
 
             if(arg is DoubleLiteral) {
@@ -47,34 +47,34 @@ namespace Hyena.SExpEngine
                 return new DoubleLiteral((int)(arg as IntLiteral).Value);
             } else if(arg is StringLiteral) {
                 return new DoubleLiteral(Convert.ToDouble((arg as StringLiteral).Value));
-            } 
-            
+            }
+
             throw new ArgumentException("can only cast double, int, or string literals");
         }
-        
+
         [Function("cast-int")]
         public virtual TreeNode OnCastInt(TreeNode [] args)
         {
             DoubleLiteral result = (DoubleLiteral)OnCastDouble(args);
             return new IntLiteral((int)result.Value);
         }
-        
+
         [Function("cast-bool")]
         public virtual TreeNode OnCastBool(TreeNode [] args)
         {
             DoubleLiteral result = (DoubleLiteral)OnCastDouble(args);
             return new BooleanLiteral((int)result.Value != 0);
         }
-        
+
         [Function("cast-string")]
         public virtual TreeNode OnCastString(TreeNode [] args)
         {
             if(args.Length != 1) {
                 throw new ArgumentException("cast must have only one argument");
             }
-            
+
             TreeNode arg = Evaluate(args[0]);
-            
+
             if(arg is DoubleLiteral) {
                 return new StringLiteral(Convert.ToString((arg as DoubleLiteral).Value));
             } else if(arg is IntLiteral) {
@@ -82,7 +82,7 @@ namespace Hyena.SExpEngine
             } else if(arg is StringLiteral) {
                 return arg;
             }
-            
+
             throw new ArgumentException("can only cast double, int, or string literals");
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/CompareFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/CompareFunctionSet.cs
index d6b8064..1c3adaf 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/CompareFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/CompareFunctionSet.cs
@@ -38,7 +38,7 @@ namespace Hyena.SExpEngine
             if(args.Length != 2) {
                 throw new ArgumentException("must have two arguments");
             }
-            
+
             return Compare(Evaluator, args[0], args[1]);
         }
 
@@ -46,13 +46,13 @@ namespace Hyena.SExpEngine
         {
             TreeNode arg_a = evaluator.Evaluate(a);
             TreeNode arg_b = evaluator.Evaluate(b);
-            
+
             if(arg_a.GetType() != arg_b.GetType()) {
                 throw new ArgumentException("arguments must be of the same type to compare");
             }
-            
+
             int result = 0;
-            
+
             if(arg_a is IntLiteral) {
                 result = (arg_a as IntLiteral).Value.CompareTo(
                     (arg_b as IntLiteral).Value);
@@ -68,38 +68,38 @@ namespace Hyena.SExpEngine
             } else {
                 throw new ArgumentException("invalid type for comparison");
             }
-            
+
             return new IntLiteral(result);
         }
-        
+
         [Function("less-than", "<")]
         public virtual TreeNode OnCompareLessThan(TreeNode [] args)
         {
             IntLiteral result = (IntLiteral)OnCompareTo(args);
             return new BooleanLiteral(result.Value < 0);
         }
-        
+
         [Function("greater-than", ">")]
         public virtual TreeNode OnCompareGreaterThan(TreeNode [] args)
         {
             IntLiteral result = (IntLiteral)OnCompareTo(args);
             return new BooleanLiteral(result.Value > 0);
         }
-        
+
         [Function("equal", "=")]
         public virtual TreeNode OnCompareEqual(TreeNode [] args)
         {
             IntLiteral result = (IntLiteral)OnCompareTo(args);
             return new BooleanLiteral(result.Value == 0);
         }
-        
+
         [Function("not-equal", "!=")]
         public virtual TreeNode OnCompareNotEqual(TreeNode [] args)
         {
             BooleanLiteral result = (BooleanLiteral)OnCompareEqual(args);
             return new BooleanLiteral(!result.Value);
         }
-        
+
         [Function("less-than-or-equal", "<=")]
         public virtual TreeNode OnCompareLessThanOrEqual(TreeNode [] args)
         {
@@ -107,7 +107,7 @@ namespace Hyena.SExpEngine
             BooleanLiteral b = (BooleanLiteral)OnCompareEqual(args);
             return new BooleanLiteral(a.Value || b.Value);
         }
-        
+
         [Function("greater-than-or-equal", ">=")]
         public virtual TreeNode OnCompareGreaterThanOrEqual(TreeNode [] args)
         {
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/ControlFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/ControlFunctionSet.cs
index b91de93..b803e7c 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/ControlFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/ControlFunctionSet.cs
@@ -37,43 +37,43 @@ namespace Hyena.SExpEngine
         {
             if(args == null || args.Length < 2 || args.Length > 3) {
                 throw new ArgumentException("if accepts 2 or 3 arguments");
-            } 
-            
+            }
+
             TreeNode arg = Evaluate(args[0]);
             if(!(arg is BooleanLiteral)) {
                 throw new ArgumentException("first if argument must be boolean");
             }
-            
+
             BooleanLiteral conditional = (BooleanLiteral)arg;
-            
+
             if(conditional.Value) {
                 return Evaluate(args[1]);
             } else if(args.Length == 3) {
                 return Evaluate(args[2]);
             }
-            
+
             return new VoidLiteral();
         }
-        
+
         [Function("while")]
         public virtual TreeNode OnWhile(TreeNode [] args)
         {
             if(args == null || args.Length < 1 || args.Length > 2) {
                 throw new ArgumentException("while accepts a condition and an expression or just an expression");
-            } 
-            
+            }
+
             while(true) {
                 if(args.Length == 2) {
                     TreeNode result = Evaluate(args[0]);
                     if(!(result is BooleanLiteral)) {
                         throw new ArgumentException("condition is not boolean");
                     }
-                
+
                     if(!(result as BooleanLiteral).Value) {
                         break;
                     }
                 }
-                
+
                 try {
                     Evaluate(args[args.Length - 1]);
                 } catch(Exception e) {
@@ -82,27 +82,27 @@ namespace Hyena.SExpEngine
                     }
                 }
             }
-            
+
             return new VoidLiteral();
         }
-        
+
         [Function("break")]
         public virtual TreeNode OnBreak(TreeNode [] args)
         {
             throw new BreakException();
         }
-        
+
         private class BreakException : Exception
         {
             public BreakException()
             {
             }
         }
-        
+
         public static bool BreakHandler(Exception e)
         {
             Exception parent_e = e;
-            
+
             while(parent_e != null) {
                 if(parent_e is BreakException) {
                     return true;
@@ -110,7 +110,7 @@ namespace Hyena.SExpEngine
                 parent_e = parent_e.InnerException;
             }
 
-            throw e;    
+            throw e;
         }
     }
 }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/Evaluator.cs b/src/Libraries/Hyena/Hyena.SExpEngine/Evaluator.cs
index 60a3014..294b0da 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/Evaluator.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/Evaluator.cs
@@ -36,17 +36,17 @@ namespace Hyena.SExpEngine
         {
             RegisterFunctions();
         }
-        
+
         public Evaluator(TreeNode expression) : base(expression)
         {
             RegisterFunctions();
         }
-        
+
         public Evaluator(string expression) : base(expression)
         {
             RegisterFunctions();
         }
-        
+
         private void RegisterFunctions()
         {
             RegisterFunctionSet(new ControlFunctionSet());
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/EvaluatorBase.cs b/src/Libraries/Hyena/Hyena.SExpEngine/EvaluatorBase.cs
index af80a7b..2076cdd 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/EvaluatorBase.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/EvaluatorBase.cs
@@ -39,12 +39,12 @@ namespace Hyena.SExpEngine
     public class EvaluationException : ApplicationException
     {
         public EvaluationException(TreeNode node, string token, Exception inner) : base(String.Format(
-            "Evaluation exception at token `{0} ({1})' [{2},{3}]", 
+            "Evaluation exception at token `{0} ({1})' [{2},{3}]",
             node.GetType(), token, node.Line, node.Column), inner)
         {
         }
     }
-    
+
     public class UnknownVariableException : ApplicationException
     {
         public UnknownVariableException(string var) : base(var)
@@ -60,171 +60,171 @@ namespace Hyena.SExpEngine
             public MethodInfo MethodInfo;
             public bool EvaluateVariables;
         }
-    
+
         private TreeNode expression;
         private TreeNode function_table_expression = new TreeNode();
-        
+
         private string input;
         private Dictionary<string, object> functions = new Dictionary<string, object>();
         private List<Exception> exceptions = new List<Exception>();
-        
+
         public EvaluatorBase()
         {
             expression = function_table_expression;
         }
-        
+
         public EvaluatorBase(TreeNode expression)
         {
             this.expression = expression;
         }
-        
+
         public EvaluatorBase(string input)
         {
             expression = function_table_expression;
             this.input = input;
         }
-        
+
         public void RegisterVariable(string name, string value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterVariable(string name, bool value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterVariable(string name, int value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterVariable(string name, double value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterVariable(string name, SExpVariableResolutionHandler value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterVariable(string name, TreeNode value)
         {
             expression.RegisterFunction(name, value);
         }
-        
+
         public void RegisterFunction(SExpFunctionHandler handler, params string [] names)
         {
             foreach(string name in names) {
                 if(functions.ContainsKey(name)) {
                     functions.Remove(name);
                 }
-                
+
                 functions.Add(name, handler);
             }
         }
-        
+
         public void RegisterFunction(object o, MethodInfo method, string [] names)
         {
             RegisterFunction(o, method, names, true);
         }
-        
+
         public void RegisterFunction(object o, MethodInfo method, string [] names, bool evaluateVariables)
         {
             MethodInfoContainer container = new MethodInfoContainer();
             container.MethodInfo = method;
             container.Object = o;
             container.EvaluateVariables = evaluateVariables;
-        
+
             foreach(string name in names) {
                 if(functions.ContainsKey(name)) {
                     functions.Remove(name);
                 }
-                
+
                 functions.Add(name, container);
             }
         }
-        
+
         public void RegisterFunctionSet(FunctionSet functionSet)
         {
             functionSet.Load(this);
         }
-        
+
         public TreeNode EvaluateTree(TreeNode expression)
         {
             this.expression = expression;
             this.input = null;
             return Evaluate();
         }
-        
+
         public TreeNode EvaluateString(string input)
         {
             this.expression = null;
             this.input = input;
             return Evaluate();
         }
-        
+
         public TreeNode Evaluate()
         {
             exceptions.Clear();
-            
+
             try {
                 if(expression == null) {
                     Parser parser = new Parser();
                     expression = parser.Parse(input);
                     expression.CopyFunctionsFrom(function_table_expression);
                 }
-                
+
                 return Evaluate(expression);
-            } catch(Exception e) {    
+            } catch(Exception e) {
                 Exception next = e;
-                
+
                 do {
                     if(next != null) {
                         exceptions.Add(next);
                         next = next.InnerException;
                     }
                 } while(next != null && next.InnerException != null);
-            
+
                 if(next != null) {
                     exceptions.Add(next);
                 }
             }
-            
+
             return null;
         }
-       
+
         public TreeNode Evaluate(TreeNode node)
         {
             if(!node.HasChildren || node is FunctionNode) {
                 return EvaluateNode(node);
             }
-            
+
             TreeNode final_result_node = new TreeNode();
-            
+
             foreach(TreeNode child_node in node.Children) {
                 TreeNode result_node = EvaluateNode(child_node);
-                
+
                 if(result_node != null) {
                     final_result_node.AddChild(result_node);
                 }
-                
+
                 if(child_node is FunctionNode) {
                     if(functions.ContainsKey((child_node as FunctionNode).Function)) {
                         break;
                     }
-                    
+
                     FunctionNode impl = ResolveFunction(child_node as FunctionNode);
                     if(impl != null && impl.RequiresArguments) {
                         break;
                     }
                 }
             }
-            
+
             return final_result_node.ChildCount == 1 ? final_result_node.Children[0] : final_result_node;
         }
-        
+
         private TreeNode EvaluateNode(TreeNode node)
         {
             TreeNode result_node = null;
@@ -237,25 +237,25 @@ namespace Hyena.SExpEngine
                     if(e is TargetInvocationException) {
                         ee = e.InnerException;
                     }
-                
+
                     throw new EvaluationException(node, (node as FunctionNode).Function, ee);
                 }
             } else if(node is LiteralNodeBase) {
                 result_node = node;
             } else {
                 result_node = Evaluate(node);
-            } 
-            
+            }
+
             return result_node;
         }
-        
+
         private TreeNode EvaluateFunction(FunctionNode node)
         {
             object handler = null;
-            
+
             TreeNode parent = node.Parent;
             TreeNode [] args = null;
-            
+
             if(!functions.ContainsKey(node.Function)) {
                 handler = ResolveFunction(node);
                 if(handler == null) {
@@ -267,16 +267,16 @@ namespace Hyena.SExpEngine
 
             if(parent.Children[0] == node) {
                 args = new TreeNode[parent.ChildCount - 1];
-                
+
                 for(int i = 0; i < args.Length; i++) {
                     args[i] = parent.Children[i + 1];
-                    
+
                     if(handler is MethodInfoContainer && !(handler as MethodInfoContainer).EvaluateVariables) {
                         continue;
                     }
                 }
             }
-            
+
             if(handler is FunctionNode) {
                 return (handler as FunctionNode).Evaluate(this, args);
             } else if(handler is SExpFunctionHandler) {
@@ -293,39 +293,39 @@ namespace Hyena.SExpEngine
         internal FunctionNode ResolveFunction(FunctionNode node)
         {
             TreeNode shift_node = node;
-            
+
             do {
                 if(shift_node.Functions.ContainsKey(node.Function)) {
                     return shift_node.Functions[node.Function];
                 }
-                
+
                 shift_node = shift_node.Parent;
             } while(shift_node != null);
-            
+
             return null;
         }
-        
+
         public bool Success {
             get { return exceptions.Count == 0; }
         }
-        
+
         public TreeNode ExpressionTree {
             get { return expression; }
         }
-        
+
         public ReadOnlyCollection<Exception> Exceptions {
             get { return new ReadOnlyCollection<Exception>(exceptions); }
         }
-        
+
         public string ErrorMessage {
             get {
                 if(exceptions.Count == 0) {
                     return null;
                 } else if(exceptions.Count >= 2) {
-                    return String.Format("{0}: {1}", exceptions[exceptions.Count - 2].Message, 
+                    return String.Format("{0}: {1}", exceptions[exceptions.Count - 2].Message,
                         exceptions[exceptions.Count - 1].Message);
                 }
-                
+
                 return exceptions[0].Message;
             }
         }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionFunctionSet.cs
index d7c7a5b..96a3ba6 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionFunctionSet.cs
@@ -37,22 +37,22 @@ namespace Hyena.SExpEngine
         {
             return VariableSet(Evaluator, args, true);
         }
-        
+
         public static TreeNode VariableSet(EvaluatorBase evaluator, TreeNode var, TreeNode value)
         {
             return VariableSet(evaluator, new TreeNode[] { var, value }, true);
         }
-        
+
         public static TreeNode VariableSet(EvaluatorBase evaluator, TreeNode [] args, bool update)
         {
             if(args.Length != 2) {
                 throw new ArgumentException("must have two arguments");
             }
-            
+
             if(!(args[0] is FunctionNode)) {
                 throw new ArgumentException("first argument must be a variable");
             }
-            
+
             FunctionNode variable_node = evaluator.ResolveFunction(args[0] as FunctionNode);
             if(variable_node != null) {
                 variable_node.Body = evaluator.Evaluate(args[1]);
@@ -62,38 +62,38 @@ namespace Hyena.SExpEngine
 
                 parent.RegisterFunction((args[0] as FunctionNode).Function, evaluator.Evaluate(args[1]));
             }
-            
+
             return new VoidLiteral();
         }
-        
+
         [Function(false, "define")]
         public virtual TreeNode OnDefine(TreeNode [] args)
         {
             if(args.Length < 2 || args.Length > 3) {
                 throw new ArgumentException("define must have two or three arguments");
             }
-            
+
             if(!(args[0] is FunctionNode)) {
                 throw new ArgumentException("first define argument must be a variable");
             }
-            
+
             FunctionNode function = new FunctionNode((args[0] as FunctionNode).Function, args[args.Length - 1]);
-            
+
             if(args.Length == 3 && args[1].HasChildren) {
                 foreach(TreeNode function_arg in args[1].Children) {
                     if(!(function_arg is FunctionNode)) {
                         throw new ArgumentException("define function arguments must be variable tokens");
                     }
-                    
+
                     function.RegisterFunction((function_arg as FunctionNode).Function, new VoidLiteral());
                 }
             }
-            
+
             TreeNode parent = args[0].Parent;
             parent = parent.Parent ?? parent;
-            
+
             parent.RegisterFunction(function.Function, function);
-            
+
             return new VoidLiteral();
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionNode.cs b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionNode.cs
index 0e7e40e..966be3c 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionNode.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionNode.cs
@@ -47,7 +47,7 @@ namespace Hyena.SExpEngine
         {
             this.function = function;
         }
-        
+
         public FunctionNode(string function, object body)
         {
             this.function = function;
@@ -57,32 +57,32 @@ namespace Hyena.SExpEngine
         public TreeNode Evaluate(EvaluatorBase evaluator, TreeNode [] args)
         {
             if(args != null && args.Length != FunctionCount && RequiresArguments) {
-                throw new ArgumentException("Function " + function + " takes " 
+                throw new ArgumentException("Function " + function + " takes "
                     + FunctionCount + " arguments, not " + args.Length);
             }
-            
+
             if(args != null && RequiresArguments) {
                 int i = 0;
                 string [] names = new string[args.Length];
-                
+
                 foreach(KeyValuePair<string, FunctionNode> var in Functions) {
                     names[i++] = var.Key;
                 }
-                
+
                 for(i = 0; i < args.Length; i++) {
                     (body as TreeNode).RegisterFunction(names[i], evaluator.Evaluate(args[i]));
                 }
             }
-            
+
             return evaluator.Evaluate(ResolveBody(evaluator));
         }
-        
+
         private TreeNode ResolveBody(EvaluatorBase evaluator)
         {
             if(body == null) {
                 throw new UnknownVariableException(Function);
             }
-            
+
             if(body is string) {
                 return new StringLiteral((string)body);
             } else if(body is double) {
@@ -96,26 +96,26 @@ namespace Hyena.SExpEngine
             } else if(body is TreeNode) {
                 return evaluator.Evaluate((TreeNode)body);
             }
-            
+
             throw new UnknownVariableException(String.Format(
                 "Unknown function type `{0}' for function `{1}'",
                 body.GetType(), Function));
         }
-        
+
         public override string ToString()
         {
             return Function;
         }
-        
+
         internal object Body {
             get { return body; }
             set { body = value; }
         }
-        
+
         internal bool RequiresArguments {
             get { return FunctionCount > 0 && body is TreeNode; }
         }
-        
+
         public string Function {
             get { return function; }
         }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionSet.cs
index 46798f8..97cb4ab 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/FunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/FunctionSet.cs
@@ -36,40 +36,40 @@ namespace Hyena.SExpEngine
     {
         private string [] names;
         private bool evaluate_variables;
-        
+
         public FunctionAttribute(params string [] names)
         {
             this.evaluate_variables = true;
             this.names = names;
         }
-        
+
         public FunctionAttribute(bool evaluateVariables, params string [] names)
         {
             this.evaluate_variables = evaluateVariables;
             this.names = names;
         }
-        
+
         public string [] Names {
             get { return names; }
         }
-        
+
         public bool EvaluateVariables {
             get { return evaluate_variables; }
         }
     }
-    
+
     public abstract class FunctionSet
     {
         private EvaluatorBase evaluator;
-        
+
         public void Load(EvaluatorBase evaluator)
         {
             this.evaluator = evaluator;
-            
+
             foreach(MethodInfo method in GetType().GetMethods()) {
                 string [] names = null;
                 bool evaluate_variables = true;
-                
+
                 foreach(Attribute attr in method.GetCustomAttributes(false)) {
                     if(attr is FunctionAttribute) {
                         names = (attr as FunctionAttribute).Names;
@@ -77,20 +77,20 @@ namespace Hyena.SExpEngine
                         break;
                     }
                 }
-                
+
                 if(names == null || names.Length == 0) {
                     continue;
                 }
-                
+
                 evaluator.RegisterFunction(this, method, names, evaluate_variables);
             }
         }
-        
+
         public TreeNode Evaluate(TreeNode node)
         {
             return evaluator.Evaluate(node);
         }
-        
+
         protected EvaluatorBase Evaluator {
             get { return evaluator; }
         }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/ListFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/ListFunctionSet.cs
index 1727a05..e834d02 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/ListFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/ListFunctionSet.cs
@@ -37,88 +37,88 @@ namespace Hyena.SExpEngine
         // private TreeNode EvaluateList(TreeNode node)
         // {
         //    TreeNode list = new TreeNode();
-        //    
+        //
         //    foreach(TreeNode child in node.Children) {
         //        list.AddChild(Evaluate(child));
         //    }
-        //    
+        //
         //    return list;
         // }
-    
+
         private bool IsList(TreeNode node)
         {
             return !(node is LiteralNodeBase) && !(node is FunctionNode);
         }
-        
+
         public void CheckList(TreeNode node)
         {
             if(!IsList(node)) {
                 throw new ArgumentException("argument must be a list");
             }
         }
-    
+
         [Function("is-list")]
         public virtual TreeNode OnIsList(TreeNode [] args)
         {
             return new BooleanLiteral(IsList(args[0]));
         }
-        
+
         [Function("item-at")]
         public virtual TreeNode OnItemAt(TreeNode [] args)
         {
             TreeNode list = Evaluate(args[0]);
             CheckList(list);
-            
+
             TreeNode node = Evaluate(args[1]);
             int index = 0;
-            
+
             if(!(node is IntLiteral)) {
                 throw new ArgumentException("argument must be an index");
             }
-            
+
             index = (node as IntLiteral).Value;
-            
+
             return Evaluate(list.Children[index]);
         }
-                
+
         [Function("remove-at")]
         public virtual TreeNode OnRemoveAt(TreeNode [] args)
         {
             TreeNode list = Evaluate(args[0]);
             CheckList(list);
-            
+
             TreeNode node = Evaluate(args[1]);
             int index = 0;
-            
+
             if(!(node is IntLiteral)) {
                 throw new ArgumentException("argument must be an index");
             }
-            
+
             index = (node as IntLiteral).Value;
-            
+
             list.Children.RemoveAt(index);
-            
+
             return list;
         }
-                        
+
         [Function("remove")]
         public virtual TreeNode OnRemove(TreeNode [] args)
         {
             TreeNode list = Evaluate(args[0]);
             CheckList(list);
-            
+
             TreeNode node = Evaluate(args[1]);
-            
+
             foreach(TreeNode compare_node in list.Children) {
                 if(((IntLiteral)CompareFunctionSet.Compare(Evaluator, node, compare_node)).Value == 0) {
                     list.Children.Remove(compare_node);
                     break;
                 }
             }
-           
+
             return list;
-        }       
-        
+        }
+
         [Function("append")]
         public virtual TreeNode OnAppend(TreeNode [] args)
         {
@@ -126,8 +126,8 @@ namespace Hyena.SExpEngine
             CheckList(list);
             list.Children.Add(Evaluate(args[1]));
             return list;
-        } 
-        
+        }
+
         [Function("prepend")]
         public virtual TreeNode OnPrepend(TreeNode [] args)
         {
@@ -135,27 +135,27 @@ namespace Hyena.SExpEngine
             CheckList(list);
             list.Children.Insert(0, Evaluate(args[1]));
             return list;
-        }       
-        
+        }
+
         [Function("insert")]
         public virtual TreeNode OnInsert(TreeNode [] args)
         {
             TreeNode list = Evaluate(args[0]);
             CheckList(list);
-            
+
             TreeNode node = Evaluate(args[1]);
             int index = 0;
-            
+
             if(!(node is IntLiteral)) {
                 throw new ArgumentException("argument must be an index");
             }
-            
+
             index = (node as IntLiteral).Value;
             list.Children.Insert(index, Evaluate(args[2]));
-            
+
             return list;
         }
-        
+
         [Function("foreach")]
         public virtual TreeNode OnForeach(TreeNode [] args)
         {
@@ -163,13 +163,13 @@ namespace Hyena.SExpEngine
             CheckList(list);
             FunctionNode item_variable = (FunctionNode)args[0];
             TreeNode function = args[2];
-            
+
             TreeNode self = args[0].Parent.Children[0];
             self.Parent.RegisterFunction(item_variable.Function, item_variable);
-            
+
             foreach(TreeNode child in list.Children) {
                 item_variable.Body = child;
-                
+
                 try {
                     if(function is FunctionNode) {
                         FunctionNode function_impl = Evaluator.ResolveFunction(function as FunctionNode);
@@ -183,7 +183,7 @@ namespace Hyena.SExpEngine
                     }
                 }
             }
-            
+
             return new VoidLiteral();
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/Literals.cs b/src/Libraries/Hyena/Hyena.SExpEngine/Literals.cs
index fb686d4..217b273 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/Literals.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/Literals.cs
@@ -31,9 +31,9 @@ using System;
 namespace Hyena.SExpEngine
 {
     public class LiteralNodeBase : TreeNode
-    {    
+    {
         private Type type = null;
-        
+
         public Type EnclosedType {
             get { return type ?? GetType(); }
             set { type = value; }
@@ -43,18 +43,18 @@ namespace Hyena.SExpEngine
     public class LiteralNode<T> : LiteralNodeBase
     {
         private T value;
-        
+
         public LiteralNode(T value)
         {
             this.value = value;
             EnclosedType = typeof(T);
         }
-        
+
         public override string ToString()
         {
             return Value.ToString();
         }
-        
+
         public T Value {
             get { return value; }
         }
@@ -69,18 +69,18 @@ namespace Hyena.SExpEngine
             return "void";
         }
     }
-    
+
     public class DoubleLiteral : LiteralNode<double>
     {
         private static System.Globalization.CultureInfo culture_info = new System.Globalization.CultureInfo("en-US");
-        
+
         public DoubleLiteral(double value) : base(value)
         {
         }
-        
+
         public override string ToString()
         {
-            return (Value - (int)Value) == 0.0 
+            return (Value - (int)Value) == 0.0
                 ? String.Format("{0}.0", Value.ToString(culture_info))
                 : Value.ToString(culture_info);
         }
@@ -91,7 +91,7 @@ namespace Hyena.SExpEngine
         public BooleanLiteral(bool value) : base(value)
         {
         }
-        
+
         public override string ToString()
         {
             return Value ? "true" : "false";
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/LogicFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/LogicFunctionSet.cs
index 7f14cab..88c9b67 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/LogicFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/LogicFunctionSet.cs
@@ -38,56 +38,56 @@ namespace Hyena.SExpEngine
             if(args.Length != 1) {
                 throw new ArgumentException("not must have only one argument");
             }
-            
+
             TreeNode arg = Evaluate(args[0]);
-            
+
             if(!(arg is BooleanLiteral)) {
                 throw new ArgumentException("can only not a boolean");
             }
-            
+
             return new BooleanLiteral(!(arg as BooleanLiteral).Value);
         }
-        
+
         [Function("or", "|")]
         public virtual TreeNode OnOr(TreeNode [] args)
         {
             return OnAndOr(args, false);
         }
-        
+
         [Function("and", "|")]
         public virtual TreeNode OnAnd(TreeNode [] args)
         {
             return OnAndOr(args, true);
         }
-        
+
         private TreeNode OnAndOr(TreeNode [] args, bool and)
         {
             if(args.Length < 2) {
                 throw new ArgumentException("must have two or more boolean arguments");
             }
-            
+
             bool result = false;
-            
+
             for(int i = 0; i < args.Length; i++) {
                 TreeNode node = Evaluate(args[i]);
                 if(!(node is BooleanLiteral)) {
                     throw new ArgumentException("arguments must be boolean");
                 }
-                
+
                 BooleanLiteral arg = (BooleanLiteral)node;
-                
+
                 if(i == 0) {
                     result = arg.Value;
                     continue;
                 }
-                
+
                 if(and) {
                     result &= arg.Value;
                 } else {
                     result |= arg.Value;
                 }
             }
-            
+
             return new BooleanLiteral(result);
         }
     }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/Parser.cs b/src/Libraries/Hyena/Hyena.SExpEngine/Parser.cs
index 9aad1da..53939ab 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/Parser.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/Parser.cs
@@ -47,89 +47,89 @@ namespace Hyena.SExpEngine
     {
         private static Regex number_regex = new Regex(@"^[-+]?(0x[\dA-Fa-f]+)?[\d]*\.?[\d]*([eE][-+]?[\d]+)?$");
         private static System.Globalization.CultureInfo culture_info = new System.Globalization.CultureInfo("en-US");
-        
+
         private StreamReader reader;
         private bool debug;
-        
+
         private StringBuilder current_token;
         private TreeNode root_node ;
         private TreeNode current_parent;
         private int scope;
         private int line;
         private int column;
-        
+
         public Parser()
         {
         }
-        
+
         public TreeNode Parse(string input)
         {
             return Parse(new MemoryStream(Encoding.UTF8.GetBytes(input)));
         }
-        
+
         public TreeNode Parse(Stream stream)
         {
             return Parse(new StreamReader(stream));
         }
-        
+
         public TreeNode Parse(StreamReader reader)
         {
             this.reader = reader;
-            
+
             current_token = new StringBuilder();
             root_node = new TreeNode();
             current_parent = root_node;
             scope = 0;
             line = 1;
             column = 0;
-            
+
             try {
                 Tokenize();
-                
+
                 if(scope != 0) {
                     throw new ApplicationException("Scope does pop back to zero");
                 }
             } catch(Exception e) {
                 throw new ParserException(current_token.ToString(), line, column, e);
             }
-            
+
             return root_node;
         }
-        
+
         private void Tokenize()
         {
             bool in_string = false;
             bool in_comment = false;
-            
+
             while(true) {
                 int ich = reader.Read();
                 char ch = (char)ich;
-                
+
                 if(ich < 0) {
                     break;
                 }
-                
+
                 if(ch == '\n') {
                     line++;
                     column = 0;
                 } else {
                     column++;
                 }
-                
+
                 if(in_comment) {
                     if(ch == '\r' || ch == '\n') {
                         in_comment = false;
                     }
-                    
+
                     continue;
                 }
-                
+
                 switch(ch) {
                     case '(':
                     case ')':
                         if(!in_string) {
                             TokenPush(false);
-                            
+
                             if(ch == '(') {
                                 ScopePush();
                             } else {
@@ -170,61 +170,61 @@ namespace Hyena.SExpEngine
                         } else {
                             current_token.Append(ch);
                         }
-                        break;    
+                        break;
                 }
             }
-            
+
             TokenPush(false);
 
             reader.Close();
         }
-        
+
         private void ScopePush()
         {
             current_parent = new TreeNode(current_parent);
             scope++;
         }
-        
+
         private void ScopePop()
         {
             current_parent = current_parent.Parent;
             scope--;
         }
-        
+
         private void TokenPush(bool as_string)
         {
             if(current_token.Length == 0 && !as_string) {
                 return;
             }
-            
+
             TreeNode node = null;
             string token = current_token.ToString();
-                
+
             if(Debug) {
-                Console.Write("{3}[{0}] TOKEN({4},{5}): [{2}{1}{2}]", scope, token, 
+                Console.Write("{3}[{0}] TOKEN({4},{5}): [{2}{1}{2}]", scope, token,
                     as_string ? "\"" : String.Empty, String.Empty.PadLeft(scope - 1, ' '),
                     line, column - current_token.Length);
             }
-            
+
             if(as_string) {
                 node = new StringLiteral(token);
             } else if(token == "#t") {
                 node = new BooleanLiteral(true);
             } else if(token == "#f") {
                 node = new BooleanLiteral(false);
-            } else if(token.Length > 0 && token != "." && token != "-" && 
+            } else if(token.Length > 0 && token != "." && token != "-" &&
                 token != "+" && number_regex.IsMatch(token)) {
                 try {
                     if(token.StartsWith("0x") || token.StartsWith("-0x")) {
                         int offset = token[0] == '-' ? 3 : 2;
-                        int value = Int32.Parse(token.Substring(offset), 
+                        int value = Int32.Parse(token.Substring(offset),
                             NumberStyles.HexNumber, culture_info.NumberFormat);
                         node = new IntLiteral(value * (offset == 3 ? -1 : 1));
                     } else if(token.Contains(".")) {
-                        node = new DoubleLiteral(Double.Parse(token, 
+                        node = new DoubleLiteral(Double.Parse(token,
                             NumberStyles.Float, culture_info.NumberFormat));
                     } else {
-                        node = new IntLiteral(Int32.Parse(token, 
+                        node = new IntLiteral(Int32.Parse(token,
                             NumberStyles.Integer, culture_info.NumberFormat));
                     }
                 } catch {
@@ -233,7 +233,7 @@ namespace Hyena.SExpEngine
             } else {
                 node = new FunctionNode(token);
             }
-            
+
             if(Debug) {
                 Console.WriteLine(" => [{0}]", node);
             }
@@ -241,10 +241,10 @@ namespace Hyena.SExpEngine
             node.Line = line;
             node.Column = column;
             current_parent.AddChild(node);
-            
+
             current_token.Remove(0, current_token.Length);
         }
-        
+
         public bool Debug {
             get { return debug; }
             set { debug = value; }
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/StringFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/StringFunctionSet.cs
index 4821e8a..5b55791 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/StringFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/StringFunctionSet.cs
@@ -39,105 +39,105 @@ namespace Hyena.SExpEngine
         {
             return ConcatenateStrings(Evaluator, args);
         }
-        
+
         public static TreeNode ConcatenateStrings(EvaluatorBase evaluator, TreeNode [] args)
         {
             StringBuilder result = new StringBuilder();
-            
+
             foreach(TreeNode arg in args) {
                 TreeNode eval_arg = evaluator.Evaluate(arg);
                 if(!(eval_arg is VoidLiteral)) {
                     result.Append(eval_arg);
                 }
             }
-            
+
             return new StringLiteral(result.ToString());
         }
-        
+
         private void CheckArgumentCount(TreeNode [] args, int expected)
         {
             CheckArgumentCount(args, expected, expected);
         }
-        
+
         private void CheckArgumentCount(TreeNode [] args, int expected_min, int expected_max)
         {
             if(args.Length < expected_min || args.Length > expected_max) {
-                throw new ArgumentException("expects " + expected_min + " <= args <= " 
+                throw new ArgumentException("expects " + expected_min + " <= args <= "
                     + expected_max + " arguments");
             }
         }
-        
+
         private string GetArgumentString(TreeNode [] args, int index)
         {
             TreeNode node = Evaluate(args[index]);
             if(!(node is StringLiteral)) {
                 throw new ArgumentException("argument " + index + " must be a string");
             }
-            
+
             return (node as StringLiteral).Value;
         }
-                
+
         private int GetArgumentInteger(TreeNode [] args, int index)
         {
             TreeNode node = Evaluate(args[index]);
             if(!(node is IntLiteral)) {
                 throw new ArgumentException("argument " + index + " must be an integer");
             }
-            
+
             return (node as IntLiteral).Value;
         }
-        
+
         [Function("length")]
         public virtual TreeNode OnLength(TreeNode [] args)
         {
             CheckArgumentCount(args, 1);
-            
+
             TreeNode node = Evaluate(args[0]);
-            
+
             if(node is StringLiteral) {
                 return new IntLiteral((node as StringLiteral).Value.Length);
             } else if(!(node is LiteralNodeBase) && !(node is FunctionNode)) {
                 return new IntLiteral(node.ChildCount);
             }
-            
+
             return new IntLiteral(0);
-        } 
-        
+        }
+
         [Function("contains")]
         public virtual TreeNode OnContains(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
             return new BooleanLiteral(GetArgumentString(args, 0).Contains(GetArgumentString(args, 1)));
         }
-                
+
         [Function("index-of")]
         public virtual TreeNode OnIndexOf(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
             return new IntLiteral(GetArgumentString(args, 0).IndexOf(GetArgumentString(args, 1)));
         }
-                
+
         [Function("last-index-of")]
         public virtual TreeNode OnLastIndexOf(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
             return new IntLiteral(GetArgumentString(args, 0).LastIndexOf(GetArgumentString(args, 1)));
         }
-        
+
         [Function("starts-with")]
         public virtual TreeNode OnStartsWith(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
             return new BooleanLiteral(GetArgumentString(args, 0).StartsWith(GetArgumentString(args, 1)));
         }
-                
+
         [Function("ends-with")]
         public virtual TreeNode OnEndsWith(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
             return new BooleanLiteral(GetArgumentString(args, 0).EndsWith(GetArgumentString(args, 1)));
         }
-        
+
         [Function("substring")]
         public virtual TreeNode OnSubstring(TreeNode [] args)
         {
@@ -149,23 +149,23 @@ namespace Hyena.SExpEngine
                     GetArgumentInteger(args, 1), GetArgumentInteger(args, 2)));
             }
         }
-        
+
         [Function("split")]
         public virtual TreeNode OnSplit(TreeNode [] args)
         {
             CheckArgumentCount(args, 2);
-            
+
             TreeNode result = new TreeNode();
             string str = GetArgumentString(args, 0);
             string pattern = GetArgumentString(args, 1);
-            
+
             foreach(string item in Regex.Split(str, pattern)) {
                 result.AddChild(new StringLiteral(item));
             }
-            
+
             return result;
         }
-        
+
         [Function("trim")]
         public virtual TreeNode OnTrim(TreeNode [] args)
         {
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/TreeNode.cs b/src/Libraries/Hyena/Hyena.SExpEngine/TreeNode.cs
index c0cd73b..fd3bd88 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/TreeNode.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/TreeNode.cs
@@ -39,7 +39,7 @@ namespace Hyena.SExpEngine
         private TreeNode parent;
         private int column;
         private int line;
-        
+
         public TreeNode()
         {
         }
@@ -49,14 +49,14 @@ namespace Hyena.SExpEngine
             this.parent = parent;
             parent.AddChild(this);
         }
-        
+
         internal void CopyFunctionsFrom(TreeNode node)
         {
             foreach(KeyValuePair<string, FunctionNode> function in node.Functions) {
                 RegisterFunction(function.Key, function.Value);
             }
         }
-        
+
         internal void RegisterFunction(string name, object value)
         {
             if(functions.ContainsKey(name)) {
@@ -65,7 +65,7 @@ namespace Hyena.SExpEngine
                 functions.Add(name, new FunctionNode(name, value));
             }
         }
-        
+
         internal void RegisterFunction(string name, FunctionNode function)
         {
             if(functions.ContainsKey(name)) {
@@ -74,26 +74,26 @@ namespace Hyena.SExpEngine
                 functions.Add(name, function);
             }
         }
-        
+
         public TreeNode Flatten()
         {
             TreeNode result_node = new TreeNode();
             Flatten(result_node, this);
-            
-            return result_node.ChildCount == 1 ? result_node.Children[0] : result_node; 
+
+            return result_node.ChildCount == 1 ? result_node.Children[0] : result_node;
         }
-        
+
         private void Flatten(TreeNode result_node, TreeNode node)
         {
             if(node == null) {
                 return;
             }
-            
+
             if(!node.HasChildren && !(node is VoidLiteral)) {
                 result_node.AddChild(node);
                 return;
             }
-            
+
             foreach(TreeNode child_node in node.Children) {
                 Flatten(result_node, child_node);
             }
@@ -103,7 +103,7 @@ namespace Hyena.SExpEngine
         {
             child.Parent = this;
             children.Add(child);
-        } 
+        }
 
         public TreeNode Parent {
             get { return parent; }
@@ -113,16 +113,16 @@ namespace Hyena.SExpEngine
         public int ChildCount {
             get { return children.Count; }
         }
-        
+
         public bool HasChildren {
             get { return ChildCount > 0; }
         }
-        
+
         public int Line {
             get { return line; }
             set { line = value; }
         }
-        
+
         public int Column {
             get { return column; }
             set { column = value; }
@@ -135,28 +135,28 @@ namespace Hyena.SExpEngine
         public IDictionary<string, FunctionNode> Functions {
             get { return functions; }
         }
-        
+
         public int FunctionCount {
             get { return functions.Count; }
         }
-        
+
         public bool Empty {
             get { return ChildCount == 0 && !(this is LiteralNodeBase) && !(this is FunctionNode); }
         }
-        
+
         public void Dump()
         {
             DumpTree(this);
         }
-               
+
         public TreeNode FindRootNode()
         {
             TreeNode shift_node = this;
-            
+
             while(shift_node.Parent != null) {
                 shift_node = shift_node.Parent;
             }
-            
+
             return shift_node;
         }
 
diff --git a/src/Libraries/Hyena/Hyena.SExpEngine/UtilityFunctionSet.cs b/src/Libraries/Hyena/Hyena.SExpEngine/UtilityFunctionSet.cs
index 802fcf5..cf576b8 100644
--- a/src/Libraries/Hyena/Hyena.SExpEngine/UtilityFunctionSet.cs
+++ b/src/Libraries/Hyena/Hyena.SExpEngine/UtilityFunctionSet.cs
@@ -37,32 +37,32 @@ namespace Hyena.SExpEngine
         {
             if(args.Length != 1) {
                 throw new ArgumentException("print must have only one argument");
-            } 
-            
+            }
+
             Console.WriteLine(Evaluate(args[0]));
-            
+
             return new VoidLiteral();
         }
-        
+
         [Function("print-type")]
         public virtual TreeNode OnPrintType(TreeNode [] args)
         {
             if(args.Length != 1) {
                 throw new ArgumentException("print-type must have only one argument");
-            } 
-            
+            }
+
             Console.WriteLine(Evaluate(args[0]).GetType());
-            
+
             return new VoidLiteral();
         }
-        
+
         [Function("dump")]
         public virtual TreeNode OnDump(TreeNode [] args)
         {
             foreach(TreeNode arg in args) {
                 Evaluate(arg).Dump();
             }
-            
+
             return new VoidLiteral();
         }
     }
diff --git a/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs b/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs
index 5d62b0b..c55dcd3 100644
--- a/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs
+++ b/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs
@@ -87,7 +87,7 @@ namespace Hyena
         // License: MIT/X11
         // Authors: Gonzalo Paniagua Javier <gonzalo at ximian.com>
         // (C) 2005-2006 Novell, Inc <http://www.novell.com>
-        
+
         private static int TranslateColor (ConsoleColor desired, out bool light)
         {
             light = false;
@@ -113,7 +113,7 @@ namespace Hyena
                 case ConsoleColor.White: default: light = true; return 7;
             }
         }
-        
+
         private static string GetAnsiColorControlCode (ConsoleColor color, bool isForeground)
         {
             // lighter fg colours are 90 -> 97 rather than 30 -> 37
@@ -133,7 +133,7 @@ namespace Hyena
 #region xterm Detection
 
         private static bool? xterm_colors = null;
-        public static bool XtermColors { 
+        public static bool XtermColors {
             get {
                 if (xterm_colors == null) {
                     DetectXtermColors ();
@@ -145,7 +145,7 @@ namespace Hyena
 
         [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")]
         private extern static int _isatty (int fd);
-            
+
         private static bool isatty (int fd)
         {
             try {
@@ -158,11 +158,11 @@ namespace Hyena
         private static void DetectXtermColors ()
         {
             bool _xterm_colors = false;
-                
+
             switch (Environment.GetEnvironmentVariable ("TERM")) {
                 case "xterm":
                 case "rxvt":
-                case "rxvt-unicode": 
+                case "rxvt-unicode":
                     if (Environment.GetEnvironmentVariable ("COLORTERM") != null) {
                         _xterm_colors = true;
                     }
@@ -181,7 +181,7 @@ namespace Hyena
 
         private static bool? runtime_is_mono;
         public static bool RuntimeIsMono {
-            get { 
+            get {
                 if (runtime_is_mono == null) {
                     runtime_is_mono = Type.GetType ("System.MonoType") != null;
                 }
diff --git a/src/Libraries/Hyena/Hyena/CryptoUtil.cs b/src/Libraries/Hyena/Hyena/CryptoUtil.cs
index 2d07e43..b8fefe4 100644
--- a/src/Libraries/Hyena/Hyena/CryptoUtil.cs
+++ b/src/Libraries/Hyena/Hyena/CryptoUtil.cs
@@ -43,12 +43,12 @@ namespace Hyena
         {
             return text == null || text.Length != 32 ? false : md5_regex.IsMatch (text);
         }
-        
+
         public static string Md5Encode (string text)
         {
             return Md5Encode (text, Encoding.ASCII);
         }
-        
+
         public static string Md5Encode (string text, Encoding encoding)
         {
             if (String.IsNullOrEmpty (text)) {
diff --git a/src/Libraries/Hyena/Hyena/DateTimeUtil.cs b/src/Libraries/Hyena/Hyena/DateTimeUtil.cs
index e533c28..ae1bff1 100644
--- a/src/Libraries/Hyena/Hyena/DateTimeUtil.cs
+++ b/src/Libraries/Hyena/Hyena/DateTimeUtil.cs
@@ -61,13 +61,13 @@ namespace Hyena
         public static string FormatDuration (long time) {
             return FormatDuration (TimeSpan.FromSeconds (time));
         }
-        
+
         public static string FormatDuration (TimeSpan time) {
             return FormatDuration (time.Hours, time.Minutes, time.Seconds);
         }
-        
+
         public static string FormatDuration (int hours, int minutes, int seconds) {
-            return (hours > 0 ? 
+            return (hours > 0 ?
                     String.Format ("{0}:{1:00}:{2:00}", hours, minutes, seconds) :
                     String.Format ("{0}:{1:00}", minutes, seconds));
         }
diff --git a/src/Libraries/Hyena/Hyena/EventArgs.cs b/src/Libraries/Hyena/Hyena/EventArgs.cs
new file mode 100644
index 0000000..7603a9c
--- /dev/null
+++ b/src/Libraries/Hyena/Hyena/EventArgs.cs
@@ -0,0 +1,44 @@
+//
+// EventArgs.cs
+//
+// Author:
+//   Alexander Kojevnikov <alexander at kojevnikov.com>
+//
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+namespace Hyena
+{
+    public class EventArgs<T> : System.EventArgs
+    {
+        private readonly T value;
+
+        public EventArgs (T value)
+        {
+            this.value = value;
+        }
+
+        public T Value {
+            get { return value; }
+        }
+    }
+}
diff --git a/src/Libraries/Hyena/Hyena/Log.cs b/src/Libraries/Hyena/Hyena/Log.cs
index 836ae29..6dea20c 100644
--- a/src/Libraries/Hyena/Hyena/Log.cs
+++ b/src/Libraries/Hyena/Hyena/Log.cs
@@ -37,17 +37,17 @@ namespace Hyena
     public class LogNotifyArgs : EventArgs
     {
         private LogEntry entry;
-        
+
         public LogNotifyArgs (LogEntry entry)
         {
             this.entry = entry;
         }
-        
+
         public LogEntry Entry {
             get { return entry; }
         }
     }
-        
+
     public enum LogEntryType
     {
         Debug,
@@ -55,14 +55,14 @@ namespace Hyena
         Error,
         Information
     }
-    
+
     public class LogEntry
     {
         private LogEntryType type;
         private string message;
         private string details;
         private DateTime timestamp;
-        
+
         internal LogEntry (LogEntryType type, string message, string details)
         {
             this.type = type;
@@ -71,27 +71,27 @@ namespace Hyena
             this.timestamp = DateTime.Now;
         }
 
-        public LogEntryType Type { 
+        public LogEntryType Type {
             get { return type; }
         }
-        
-        public string Message { 
-            get { return message; } 
+
+        public string Message {
+            get { return message; }
         }
-        
-        public string Details { 
-            get { return details; } 
+
+        public string Details {
+            get { return details; }
         }
 
-        public DateTime TimeStamp { 
-            get { return timestamp; } 
+        public DateTime TimeStamp {
+            get { return timestamp; }
         }
     }
-    
+
     public static class Log
     {
         public static event LogNotifyHandler Notify;
-        
+
         private static Dictionary<uint, DateTime> timers = new Dictionary<uint, DateTime> ();
         private static uint next_timer_id = 1;
 
@@ -100,13 +100,13 @@ namespace Hyena
             get { return debugging; }
             set { debugging = value; }
         }
-        
+
         public static void Commit (LogEntryType type, string message, string details, bool showUser)
         {
             if (type == LogEntryType.Debug && !Debugging) {
                 return;
             }
-        
+
             if (type != LogEntryType.Information || (type == LogEntryType.Information && !showUser)) {
                 switch (type) {
                     case LogEntryType.Error: ConsoleCrayon.ForegroundColor = ConsoleColor.Red; break;
@@ -114,19 +114,19 @@ namespace Hyena
                     case LogEntryType.Information: ConsoleCrayon.ForegroundColor = ConsoleColor.Green; break;
                     case LogEntryType.Debug: ConsoleCrayon.ForegroundColor = ConsoleColor.Blue; break;
                 }
-                
+
                 Console.Write ("[{0} {1:00}:{2:00}:{3:00}.{4:000}]", TypeString (type), DateTime.Now.Hour,
                     DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
-                
+
                 ConsoleCrayon.ResetColor ();
-                               
+
                 if (details != null) {
                     Console.WriteLine (" {0} - {1}", message, details);
                 } else {
                     Console.WriteLine (" {0}", message);
                 }
             }
-            
+
             if (showUser) {
                 OnNotify (new LogEntry (type, message, details));
             }
@@ -142,7 +142,7 @@ namespace Hyena
             }
             return null;
         }
-        
+
         private static void OnNotify (LogEntry entry)
         {
             LogNotifyHandler handler = Notify;
@@ -150,95 +150,95 @@ namespace Hyena
                 handler (new LogNotifyArgs (entry));
             }
         }
-        
+
         #region Timer Methods
-        
+
         public static uint DebugTimerStart (string message)
         {
             return TimerStart (message, false);
         }
-        
+
         public static uint InformationTimerStart (string message)
         {
             return TimerStart (message, true);
         }
-        
+
         private static uint TimerStart (string message, bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return 0;
             }
-            
+
             if (isInfo) {
                 Information (message);
             } else {
                 Debug (message);
             }
-            
+
             return TimerStart (isInfo);
         }
-        
+
         public static uint DebugTimerStart ()
         {
             return TimerStart (false);
         }
-        
+
         public static uint InformationTimerStart ()
         {
             return TimerStart (true);
         }
-            
+
         private static uint TimerStart (bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return 0;
             }
-            
+
             uint timer_id = next_timer_id++;
             timers.Add (timer_id, DateTime.Now);
             return timer_id;
         }
-        
+
         public static void DebugTimerPrint (uint id)
         {
             if (!Debugging) {
                 return;
             }
-            
+
             TimerPrint (id, "Operation duration: {0}", false);
         }
-        
+
         public static void DebugTimerPrint (uint id, string message)
         {
             if (!Debugging) {
                 return;
             }
-            
+
             TimerPrint (id, message, false);
         }
-        
+
         public static void InformationTimerPrint (uint id)
         {
             TimerPrint (id, "Operation duration: {0}", true);
         }
-        
+
         public static void InformationTimerPrint (uint id, string message)
         {
             TimerPrint (id, message, true);
         }
-        
+
         private static void TimerPrint (uint id, string message, bool isInfo)
         {
             if (!Debugging && !isInfo) {
                 return;
             }
-            
+
             DateTime finish = DateTime.Now;
-            
+
             if (!timers.ContainsKey (id)) {
                 return;
             }
-            
+
             TimeSpan duration = finish - timers[id];
             string d_message;
             if (duration.TotalSeconds < 60) {
@@ -246,116 +246,116 @@ namespace Hyena
             } else {
                 d_message = duration.ToString ();
             }
-            
+
             if (isInfo) {
                 InformationFormat (message, d_message);
             } else {
                 DebugFormat (message, d_message);
             }
         }
-        
+
         #endregion
-        
+
         #region Public Debug Methods
-                                    
+
         public static void Debug (string message, string details)
         {
             if (Debugging) {
                 Commit (LogEntryType.Debug, message, details, false);
             }
         }
-        
+
         public static void Debug (string message)
         {
             if (Debugging) {
                 Debug (message, null);
             }
         }
-        
+
         public static void DebugFormat (string format, params object [] args)
         {
             if (Debugging) {
                 Debug (String.Format (format, args));
             }
         }
-                
+
         #endregion
-        
+
         #region Public Information Methods
-            
+
         public static void Information (string message)
         {
             Information (message, null);
         }
-        
+
         public static void Information (string message, string details)
         {
             Information (message, details, false);
         }
-        
+
         public static void Information (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Information, message, details, showUser);
         }
-        
+
         public static void Information (string message, bool showUser)
         {
             Information (message, null, showUser);
         }
-        
+
         public static void InformationFormat (string format, params object [] args)
         {
             Information (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Warning Methods
-        
+
         public static void Warning (string message)
         {
             Warning (message, null);
         }
-        
+
         public static void Warning (string message, string details)
         {
             Warning (message, details, false);
         }
-        
+
         public static void Warning (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Warning, message, details, showUser);
         }
-        
+
         public static void Warning (string message, bool showUser)
         {
             Warning (message, null, showUser);
         }
-        
+
         public static void WarningFormat (string format, params object [] args)
         {
             Warning (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Error Methods
-        
+
         public static void Error (string message)
         {
             Error (message, null);
         }
-        
+
         public static void Error (string message, string details)
         {
             Error (message, details, false);
         }
-        
+
         public static void Error (string message, string details, bool showUser)
         {
             Commit (LogEntryType.Error, message, details, showUser);
         }
-        
+
         public static void Error (string message, bool showUser)
         {
             Error (message, null, showUser);
@@ -365,11 +365,11 @@ namespace Hyena
         {
             Error (String.Format (format, args));
         }
-        
+
         #endregion
-        
+
         #region Public Exception Methods
-        
+
         public static void DebugException (Exception e)
         {
             if (Debugging) {
@@ -381,17 +381,17 @@ namespace Hyena
         {
             Exception (null, e);
         }
-        
+
         public static void Exception (string message, Exception e)
         {
             Stack<Exception> exception_chain = new Stack<Exception> ();
             StringBuilder builder = new StringBuilder ();
-            
+
             while (e != null) {
                 exception_chain.Push (e);
                 e = e.InnerException;
             }
-            
+
             while (exception_chain.Count > 0) {
                 e = exception_chain.Pop ();
                 builder.AppendFormat ("{0} (in `{1}')", e.Message, e.Source).AppendLine ();
@@ -400,11 +400,11 @@ namespace Hyena
                     builder.AppendLine ();
                 }
             }
-        
+
             // FIXME: We should save these to an actual log file
             Log.Warning (message ?? "Caught an exception", builder.ToString (), false);
         }
-        
+
         #endregion
     }
 }
diff --git a/src/Libraries/Hyena/Hyena/PlatformUtil.cs b/src/Libraries/Hyena/Hyena/PlatformUtil.cs
index 9ff0f1d..2af4a2f 100644
--- a/src/Libraries/Hyena/Hyena/PlatformUtil.cs
+++ b/src/Libraries/Hyena/Hyena/PlatformUtil.cs
@@ -1,4 +1,4 @@
-// 
+//
 // PlatformUtil.cs
 //
 // Author:
diff --git a/src/Libraries/Hyena/Hyena/StringUtil.cs b/src/Libraries/Hyena/Hyena/StringUtil.cs
index 4d271a9..9070b5c 100644
--- a/src/Libraries/Hyena/Hyena/StringUtil.cs
+++ b/src/Libraries/Hyena/Hyena/StringUtil.cs
@@ -34,10 +34,10 @@ using System.Globalization;
 using System.Text.RegularExpressions;
 
 namespace Hyena
-{    
+{
     public static class StringUtil
     {
-        private static CompareOptions compare_options = 
+        private static CompareOptions compare_options =
             CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace |
             CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth;
 
@@ -45,7 +45,7 @@ namespace Hyena
         {
             return CultureInfo.CurrentCulture.CompareInfo.IndexOf (haystack, needle, compare_options);
         }
-        
+
         public static int RelaxedCompare (string a, string b)
         {
             if (a == null && b == null) {
@@ -55,29 +55,29 @@ namespace Hyena
             } else if (a == null && b != null) {
                 return -1;
             }
-            
+
             int a_offset = a.StartsWith ("the ") ? 4 : 0;
             int b_offset = b.StartsWith ("the ") ? 4 : 0;
 
-            return CultureInfo.CurrentCulture.CompareInfo.Compare (a, a_offset, a.Length - a_offset, 
+            return CultureInfo.CurrentCulture.CompareInfo.Compare (a, a_offset, a.Length - a_offset,
                 b, b_offset, b.Length - b_offset, compare_options);
         }
-        
+
         public static string CamelCaseToUnderCase (string s)
         {
             return CamelCaseToUnderCase (s, '_');
         }
-        
+
         private static Regex camelcase = new Regex ("([A-Z]{1}[a-z]+)", RegexOptions.Compiled);
         public static string CamelCaseToUnderCase (string s, char underscore)
         {
             if (String.IsNullOrEmpty (s)) {
                 return null;
             }
-        
+
             StringBuilder undercase = new StringBuilder ();
             string [] tokens = camelcase.Split (s);
-            
+
             for (int i = 0; i < tokens.Length; i++) {
                 if (tokens[i] == String.Empty) {
                     continue;
@@ -88,7 +88,7 @@ namespace Hyena
                     undercase.Append (underscore);
                 }
             }
-            
+
             return undercase.ToString ();
         }
 
@@ -143,7 +143,7 @@ namespace Hyena
         {
             return DoubleToTenthsPrecision (num, false);
         }
-        
+
         public static string DoubleToTenthsPrecision (double num, bool always_decimal)
         {
             return DoubleToTenthsPrecision (num, always_decimal, NumberFormatInfo.CurrentInfo);
@@ -154,7 +154,7 @@ namespace Hyena
             num = Math.Round (num, 1, MidpointRounding.ToEven);
             return String.Format (provider, !always_decimal && num == (int)num ? "{0:N0}" : "{0:N1}", num);
         }
-        
+
         // This method helps us pluralize doubles. Probably a horrible i18n idea.
         public static int DoubleToPluralInt (double num)
         {
@@ -163,7 +163,7 @@ namespace Hyena
             else
                 return (int)num + 1;
         }
-        
+
         // A mapping of non-Latin characters to be considered the same as
         // a Latin equivalent.
         private static Dictionary<char, char> BuildSpecialCases ()
@@ -174,24 +174,24 @@ namespace Hyena
             return dict;
         }
         private static Dictionary<char, char> searchkey_special_cases = BuildSpecialCases ();
-        
+
         //  Removes accents from Latin characters, and some kinds of punctuation.
         public static string SearchKey (string val)
         {
             if (String.IsNullOrEmpty (val)) {
                 return val;
             }
-            
+
             val = val.ToLower ();
             StringBuilder sb = new StringBuilder ();
             UnicodeCategory category;
             bool previous_was_latin = false;
             bool got_space = false;
-            
+
             // Normalizing to KD splits into (base, combining) so we can check for Latin
             // characters and then strip off any NonSpacingMarks following them
             foreach (char orig_c in val.TrimStart ().Normalize (NormalizationForm.FormKD)) {
-                
+
                 // Check for a special case *before* whitespace. This way, if
                 // a special case is ever added that maps to ' ' or '\t', it
                 // won't cause a run of whitespace in the result.
@@ -199,12 +199,12 @@ namespace Hyena
                 if (searchkey_special_cases.ContainsKey (c)) {
                     c = searchkey_special_cases[c];
                 }
-                
+
                 if (c == ' ' || c == '\t') {
                     got_space = true;
                     continue;
                 }
-                
+
                 category = Char.GetUnicodeCategory (c);
                 if (category == UnicodeCategory.OtherPunctuation) {
                     // Skip punctuation
@@ -215,7 +215,7 @@ namespace Hyena
                     }
                     sb.Append (c);
                 }
-                
+
                 // Can ignore A-Z because we've already lowercased the char
                 previous_was_latin = (c >= 'a' && c <= 'z');
             }
@@ -229,7 +229,7 @@ namespace Hyena
             }
             return result;
         }
-        
+
         private static Regex invalid_path_regex = BuildInvalidPathRegex ();
 
         private static Regex BuildInvalidPathRegex ()
@@ -241,7 +241,7 @@ namespace Hyena
                 '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F',
                 '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
                 '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F',
-                
+
                 // Invalid in FAT32 / NTFS: " \ / : * | ? < >
                 // Invalid in HFS   :
                 // Invalid in ext3  /
@@ -253,10 +253,10 @@ namespace Hyena
                 regex_str += "\\" + invalid_path_characters[i];
             }
             regex_str += "]+";
-            
+
             return new Regex (regex_str, RegexOptions.Compiled);
         }
-        
+
         private static CompareInfo culture_compare_info = CultureInfo.CurrentCulture.CompareInfo;
         public static byte[] SortKey (string orig)
         {
@@ -269,7 +269,7 @@ namespace Hyena
         {
             if (input == null)
                 return "";
-            
+
             // Remove leading and trailing dots and spaces.
             input = input.Trim (escape_path_trim_chars);
 
@@ -304,19 +304,19 @@ namespace Hyena
 
             return builder.ToString ();
         }
-        
+
         public static string MaybeFallback (string input, string fallback)
         {
             string trimmed = input == null ? null : input.Trim ();
             return String.IsNullOrEmpty (trimmed) ? fallback : trimmed;
         }
-        
+
         public static uint SubstringCount (string haystack, string needle)
         {
             if (String.IsNullOrEmpty (haystack) || String.IsNullOrEmpty (needle)) {
                 return 0;
             }
-            
+
             int position = 0;
             uint count = 0;
             while (true) {
diff --git a/src/Libraries/Hyena/Hyena/Tests/CryptoUtilTests.cs b/src/Libraries/Hyena/Hyena/Tests/CryptoUtilTests.cs
index a03b1ac..27866ba 100644
--- a/src/Libraries/Hyena/Hyena/Tests/CryptoUtilTests.cs
+++ b/src/Libraries/Hyena/Hyena/Tests/CryptoUtilTests.cs
@@ -44,7 +44,7 @@ namespace Hyena.Tests
             Assert.AreEqual ("", CryptoUtil.Md5Encode (null));
             Assert.AreEqual ("", CryptoUtil.Md5Encode (""));
         }
-    
+
         [Test]
         public void IsMd5Encoded ()
         {
diff --git a/src/Libraries/Hyena/Hyena/Tests/StringUtilTests.cs b/src/Libraries/Hyena/Hyena/Tests/StringUtilTests.cs
index bf567fe..f0b1df7 100644
--- a/src/Libraries/Hyena/Hyena/Tests/StringUtilTests.cs
+++ b/src/Libraries/Hyena/Hyena/Tests/StringUtilTests.cs
@@ -33,7 +33,7 @@ using System;
 using System.IO;
 using NUnit.Framework;
 using Hyena;
-    
+
 namespace Hyena.Tests
 {
     [TestFixture]
@@ -46,11 +46,11 @@ namespace Hyena.Tests
                 Camel = camel;
                 Under = under;
             }
-    
+
             public string Camel;
             public string Under;
         }
-    
+
         private Map [] u_to_c_maps = new Map [] {
             new Map ("Hello", "hello"),
             new Map ("HelloWorld", "hello_world"),
@@ -64,7 +64,7 @@ namespace Hyena.Tests
             new Map (null, ""),
             new Map ("H", "h")
         };
-    
+
         [Test]
         public void UnderCaseToCamelCase ()
         {
@@ -72,7 +72,7 @@ namespace Hyena.Tests
                 Assert.AreEqual (map.Camel, StringUtil.UnderCaseToCamelCase (map.Under));
             }
         }
-    
+
         private Map [] c_to_u_maps = new Map [] {
             new Map ("Hello", "hello"),
             new Map ("HelloWorld", "hello_world"),
@@ -84,7 +84,7 @@ namespace Hyena.Tests
             new Map ("", null),
             new Map ("H", "h")
         };
-    
+
         [Test]
         public void CamelCaseToUnderCase ()
         {
@@ -92,7 +92,7 @@ namespace Hyena.Tests
                 Assert.AreEqual (map.Under, StringUtil.CamelCaseToUnderCase (map.Camel));
             }
         }
-    
+
         [Test]
         public void DoubleToTenthsPrecision ()
         {
@@ -108,7 +108,7 @@ namespace Hyena.Tests
             Assert.AreEqual ("1.000,3", StringUtil.DoubleToTenthsPrecision (1000.32));
             Assert.AreEqual ("9.233",   StringUtil.DoubleToTenthsPrecision (9233));
         }
-    
+
         [Test]
         public void DoubleToPluralInt ()
         {
@@ -128,13 +128,8 @@ namespace Hyena.Tests
             Assert.AreEqual (null, StringUtil.RemoveNewlines (null));
             Assert.AreEqual ("foobar", StringUtil.RemoveNewlines (@"foo
 bar"));
-            Assert.AreEqual ("foobar baz", StringUtil.RemoveNewlines (@"foo
-bar 
-baz"));
-            Assert.AreEqual ("haswindows newline andunix", StringUtil.RemoveNewlines (@"has
-windows
- newline 
-andunix"));
+            Assert.AreEqual ("foobar baz", StringUtil.RemoveNewlines ("foo\nbar \nbaz"));
+            Assert.AreEqual ("haswindows newline andunix", StringUtil.RemoveNewlines ("has\nwindows\r\n newline \nandunix"));
         }
 
         [Test]
@@ -147,11 +142,11 @@ andunix"));
             Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foo<baz/>bar"));
             Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foo</baz>bar"));
             Assert.AreEqual ("foobazbar", StringUtil.RemoveHtml ("foo<a href=\"http://lkjdflkjdflkjj\">baz</a>bar"));
-            Assert.AreEqual ("foobaz foo bar", StringUtil.RemoveHtml (@"foo<a 
+            Assert.AreEqual ("foobaz foo bar", StringUtil.RemoveHtml (@"foo<a
 href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
         }
     }
-    
+
     [TestFixture]
     public class SearchKeyTests
     {
@@ -159,14 +154,14 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
         {
             Assert.AreEqual (after, StringUtil.SearchKey (before));
         }
-        
+
         [Test]
         public void TestEmpty ()
         {
             AssertSearchKey ("", "");
             AssertSearchKey (null, null);
         }
-        
+
         // Test that resulting search keys are in lower-case
         [Test]
         public void TestLowercase ()
@@ -174,14 +169,14 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertSearchKey ("A", "a");
             AssertSearchKey ("\u0104", "a");
         }
-        
+
         // Test that combining diacritics are removed from Latin characters.
         [Test]
         public void TestRemoveDiacritics ()
         {
             AssertSearchKey ("\u00e9", "e");
             AssertSearchKey ("e\u0301", "e");
-            
+
             AssertSearchKey ("\u014d", "o");
             AssertSearchKey ("o\u0304", "o");
 
@@ -209,7 +204,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertSearchKey ("ż", "z");
             AssertSearchKey ("Ż", "z");
         }
-        
+
         // Test that combining diacritics are preserved, and combined, for non-Latin characters.
         [Test]
         public void TestPreserveDiacritics ()
@@ -217,7 +212,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertSearchKey ("\u304c", "\u304c");
             AssertSearchKey ("\u304b\u3099", "\u304c");
         }
-        
+
         // Test that some non-Latin characters are converted to Latin counterparts.
         [Test]
         public void TestEquivalents ()
@@ -225,7 +220,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertSearchKey ("\u00f8", "o");
             AssertSearchKey ("\u0142", "l");
         }
-        
+
         // Test that some kinds of punctuation are removed.
         [Test]
         public void TestRemovePunctuation ()
@@ -236,16 +231,16 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertSearchKey ("?", "");
             AssertSearchKey ("/", "");
         }
-        
+
         [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=573484
         public void TestCollapseSpaces ()
         {
             AssertSearchKey ("  a  \t  b  ", "a b");
             AssertSearchKey ("100 % techno", "100 techno");
-            
+
             // Character in the set of special overrides
             AssertSearchKey ("a \u00f8", "a o");
-            
+
             // Invalid combining character
             AssertSearchKey ("a \u0301", "a");
         }
@@ -263,7 +258,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
         {
             AssertProduces (input, input);
         }
-        
+
         [Test]
         public void TestEmpty ()
         {
@@ -293,7 +288,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
             AssertProduces ("Greetings! -* 你好?", "Greetings! -_ 你好_");
         }
     }
-    
+
     [TestFixture]
     public class SortKeyTests
     {
@@ -301,19 +296,19 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
         {
             Assert.AreEqual (after, StringUtil.SortKey (before));
         }
-        
+
         [Test]
         public void TestNull ()
         {
             AssertSortKey (null, null);
         }
-        
+
         [Test]
         public void TestEmpty ()
         {
             AssertSortKey ("", new byte[] {1, 1, 1, 1, 0});
         }
-        
+
         [Test]
         public void TestSortKey ()
         {
@@ -379,7 +374,7 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
                 String.Format ("foo{0}01. bar.ogg", dir_sep));
         }
     }
-    
+
     [TestFixture]
     public class SubstringCountTests
     {
@@ -387,21 +382,21 @@ href=http://lkjdflkjdflkjj>baz foo< /a> bar"));
         {
             Assert.AreEqual (expected, StringUtil.SubstringCount (haystack, needle));
         }
-        
+
         [Test]
         public void TestEmpty ()
         {
             AssertCount ("", "a", 0);
             AssertCount ("a", "", 0);
         }
-        
+
         [Test]
         public void TestNoMatches ()
         {
             AssertCount ("a", "b", 0);
             AssertCount ("with needle in", "long needle", 0);
         }
-        
+
         [Test]
         public void TestMatches ()
         {
diff --git a/src/Libraries/Hyena/Hyena/Tests/TestBase.cs b/src/Libraries/Hyena/Hyena/Tests/TestBase.cs
index b6c3e63..3c263b6 100644
--- a/src/Libraries/Hyena/Hyena/Tests/TestBase.cs
+++ b/src/Libraries/Hyena/Hyena/Tests/TestBase.cs
@@ -44,13 +44,13 @@ namespace Hyena.Tests
     {
         public F From;
         public T To;
-    
+
         public TransformPair (F from, T to)
         {
             From = from;
             To = to;
         }
-    
+
         public static TransformPair<F, T> [] GetFrom (params object [] objects)
         {
             TransformPair<F, T> [] pairs = new TransformPair<F, T> [objects.Length / 2];
@@ -59,27 +59,27 @@ namespace Hyena.Tests
             }
             return pairs;
         }
-    
+
         public override string ToString ()
         {
             return From.ToString ();
         }
     }
-    
+
     public delegate To Transform<F, To> (F from);
-    
+
     public abstract class TestBase
     {
         private string bin_dir;
         public string BinDir {
             get { return bin_dir ?? (bin_dir = Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location)); }
         }
-        
+
         private string tests_dir;
         public string TestsDir {
             get { return tests_dir ?? (tests_dir = Path.Combine (Path.GetDirectoryName (BinDir), "tests")); }
         }
-    
+
         public static void AssertForEach<T> (IEnumerable<T> objects, Action<T> runner)
         {
             System.Text.StringBuilder sb = new System.Text.StringBuilder ();
@@ -88,11 +88,11 @@ namespace Hyena.Tests
                 catch (AssertionException e) { sb.AppendFormat ("Failed assertion on {0}: {1}\n", o, e.Message); }
                 catch (Exception e) { sb.AppendFormat ("\nCaught exception on {0}: {1}\n", o, e.ToString ()); }
             }
-    
+
             if (sb.Length > 0)
                 Assert.Fail ("\n" + sb.ToString ());
         }
-    
+
         // Fails to compile, causes SIGABRT in gmcs; boo
         /*public static void AssertTransformsEach<A, B> (IEnumerable<TransformPair<A, B>> pairs, Transform<A, B> transform)
         {
diff --git a/src/Libraries/Hyena/Hyena/Timer.cs b/src/Libraries/Hyena/Hyena/Timer.cs
index 9f4d3f3..1c83e04 100644
--- a/src/Libraries/Hyena/Hyena/Timer.cs
+++ b/src/Libraries/Hyena/Hyena/Timer.cs
@@ -38,8 +38,8 @@ namespace Hyena
         public Timer (string format, params object [] vals) : this (String.Format (format, vals))
         {
         }
-        
-        public Timer (string label) 
+
+        public Timer (string label)
         {
             this.label = label;
             start = DateTime.Now;
diff --git a/src/Libraries/Hyena/Hyena/UndoManager.cs b/src/Libraries/Hyena/Hyena/UndoManager.cs
index 60b43c7..810d4cb 100644
--- a/src/Libraries/Hyena/Hyena/UndoManager.cs
+++ b/src/Libraries/Hyena/Hyena/UndoManager.cs
@@ -53,7 +53,7 @@ namespace Hyena
                 UndoRedo(redo_stack, undo_stack, false);
             }
         }
-        
+
         public void Clear()
         {
             lock(this) {
@@ -128,7 +128,7 @@ namespace Hyena
             get { return undo_stack.Count > 0; }
         }
 
-        public bool CanRedo { 
+        public bool CanRedo {
             get { return redo_stack.Count > 0; }
         }
     }
diff --git a/src/Libraries/Hyena/Makefile.am b/src/Libraries/Hyena/Makefile.am
index a1250f0..466642d 100644
--- a/src/Libraries/Hyena/Makefile.am
+++ b/src/Libraries/Hyena/Makefile.am
@@ -45,6 +45,7 @@ SOURCES =  \
 	Hyena.Data/ISelectable.cs \
 	Hyena.Data/ISortable.cs \
 	Hyena.Data/ISortableColumn.cs \
+	Hyena.Data/MemoryListModel.cs \
 	Hyena.Data/ModelCache.cs \
 	Hyena.Data/ModelSelection.cs \
 	Hyena.Data/PropertyStore.cs \
@@ -67,6 +68,7 @@ SOURCES =  \
 	Hyena.Json/TokenType.cs \
 	Hyena.Query/AliasedObjectSet.cs \
 	Hyena.Query/DateQueryValue.cs \
+	Hyena.Query/EnumQueryValue.cs \
 	Hyena.Query/ExactStringQueryValue.cs \
 	Hyena.Query/FileSizeQueryValue.cs \
 	Hyena.Query/IntegerKeyedObjectQueryValue.cs \
@@ -109,6 +111,7 @@ SOURCES =  \
 	Hyena/CryptoUtil.cs \
 	Hyena/DateTimeUtil.cs \
 	Hyena/Delegates.cs \
+	Hyena/EventArgs.cs \
 	Hyena/IUndoAction.cs \
 	Hyena/Log.cs \
 	Hyena/PlatformUtil.cs \
diff --git a/src/Libraries/Hyena/Makefile.in b/src/Libraries/Hyena/Makefile.in
index 373de32..093f5a0 100644
--- a/src/Libraries/Hyena/Makefile.in
+++ b/src/Libraries/Hyena/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -388,6 +397,7 @@ SOURCES = \
 	Hyena.Data/ISelectable.cs \
 	Hyena.Data/ISortable.cs \
 	Hyena.Data/ISortableColumn.cs \
+	Hyena.Data/MemoryListModel.cs \
 	Hyena.Data/ModelCache.cs \
 	Hyena.Data/ModelSelection.cs \
 	Hyena.Data/PropertyStore.cs \
@@ -410,6 +420,7 @@ SOURCES = \
 	Hyena.Json/TokenType.cs \
 	Hyena.Query/AliasedObjectSet.cs \
 	Hyena.Query/DateQueryValue.cs \
+	Hyena.Query/EnumQueryValue.cs \
 	Hyena.Query/ExactStringQueryValue.cs \
 	Hyena.Query/FileSizeQueryValue.cs \
 	Hyena.Query/IntegerKeyedObjectQueryValue.cs \
@@ -452,6 +463,7 @@ SOURCES = \
 	Hyena/CryptoUtil.cs \
 	Hyena/DateTimeUtil.cs \
 	Hyena/Delegates.cs \
+	Hyena/EventArgs.cs \
 	Hyena/IUndoAction.cs \
 	Hyena/Log.cs \
 	Hyena/PlatformUtil.cs \
@@ -483,6 +495,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -586,11 +599,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -608,6 +622,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -637,6 +652,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -656,14 +672,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Hyena/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Hyena/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Hyena/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Hyena/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -681,25 +697,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -729,13 +761,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -767,6 +803,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -787,6 +824,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -795,18 +834,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -867,7 +916,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -889,6 +938,7 @@ test: all
 	pushd $(top_srcdir)/tests; \
 	make hyena; \
 	popd
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs b/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs
index 06ea853..e6df094 100644
--- a/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs
+++ b/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginDialog.cs
@@ -39,66 +39,67 @@ namespace Lastfm.Gui
         private AccelGroup accel_group;
         private AccountLoginForm login_form;
         private Label message;
-    
+
         public AccountLoginDialog (Account account) : this (account, false)
         {
         }
-    
+
         public AccountLoginDialog (Account account, bool addCloseButton) : base ()
         {
             Title = Catalog.GetString ("Log in to Last.fm");
             HasSeparator = false;
             BorderWidth = 5;
-            
+
             IconName = "gtk-dialog-authentication";
-            
+
             accel_group = new AccelGroup ();
             AddAccelGroup (accel_group);
-            
+
             HBox hbox = new HBox (false, 12);
             VBox vbox = new VBox (false, 0);
             hbox.BorderWidth = 5;
             vbox.Spacing = 5;
             hbox.Show ();
             vbox.Show ();
-            
+
             Image image = new Image ();
             image.Yalign = 0.0f;
             image.IconName = "gtk-dialog-authentication";
             image.IconSize = (int)IconSize.Dialog;
             image.Show ();
-        
+
             hbox.PackStart (image, false, false, 0);
             hbox.PackStart (vbox, true, true, 0);
-        
+
             Label header = new Label ();
             header.Xalign = 0.0f;
             header.Markup = String.Format ("<big><b>{0}</b></big>", Catalog.GetString ("Last.fm Account Login"));
             header.Show ();
-            
+
             message = new Label (Catalog.GetString ("Please enter your Last.fm account credentials."));
             message.Xalign = 0.0f;
             message.Show ();
-            
+
             vbox.PackStart (header, false, false, 0);
             vbox.PackStart (message, false, false, 0);
-        
+
             login_form = new AccountLoginForm (account);
             login_form.AddSignUpButton ();
+            login_form.AddAuthorizeButton ();
             login_form.Show ();
-            
+
             vbox.PackStart (login_form, true, true, 0);
-            
+
             VBox.PackStart (hbox, true, true, 0);
             VBox.Remove (ActionArea);
             VBox.Spacing = 10;
-            
+
             HBox bottom_box = new HBox ();
             bottom_box.PackStart (new Badge (account), true, true, 5);
             bottom_box.PackStart (ActionArea, false, false, 0);
             bottom_box.ShowAll ();
             VBox.PackEnd (bottom_box, false, false, 0);
-            
+
             if (addCloseButton) {
                 AddButton (Stock.Cancel, ResponseType.Cancel);
                 Button button = new Button ();
@@ -112,42 +113,42 @@ namespace Lastfm.Gui
                     login_form.Save ();
                 };
                 AddActionWidget (button, ResponseType.Ok);
-                login_form.SaveOnEnter (this);
             }
         }
-        
+
         public void AddButton (string message, ResponseType response, bool isDefault)
         {
             Button button = (Button)AddButton (message, response);
-            
+
             if (isDefault) {
                 DefaultResponse = response;
-                button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return, 
+                button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return,
                     0, Gtk.AccelFlags.Visible);
             }
         }
-        
+
         public void AddSignUpButton ()
         {
             login_form.AddSignUpButton ();
         }
-        
+
+        public void AddAuthorizeButton ()
+        {
+            login_form.AddAuthorizeButton ();
+        }
+
         public string Message {
             get { return message.Text; }
             set { message.Text = value; }
         }
-        
+
         public bool SaveOnEdit {
             get { return login_form.SaveOnEdit; }
             set { login_form.SaveOnEdit = value; }
         }
-        
+
         public string Username {
             get { return login_form.Username; }
         }
-        
-        public string Password {
-            get { return login_form.Password; }
-        }
     }
 }
diff --git a/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs b/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs
index 00c04cc..2f9bdd2 100644
--- a/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs
+++ b/src/Libraries/Lastfm.Gui/Lastfm.Gui/AccountLoginForm.cs
@@ -38,88 +38,89 @@ namespace Lastfm.Gui
     {
         private Account account;
         private Entry username_entry;
-        private Entry password_entry;
         private LinkButton signup_button;
-        
+        private Button authorize_button;
+
         private bool save_on_edit = false;
-        
-        private bool save_on_enter = false;
-        private Gtk.Dialog parentDialog;
 
-        public AccountLoginForm (Account account) : base (2, 2, false)
+        public AccountLoginForm (Account account) : base (1, 2, false)
         {
             this.account = account;
 
             BorderWidth = 5;
             RowSpacing = 5;
             ColumnSpacing = 5;
-        
+
             Label username_label = new Label (Catalog.GetString ("Username:"));
             username_label.Xalign = 1.0f;
             username_label.Show ();
-            
+
             username_entry = new Entry ();
             username_entry.Show ();
-            
-            Label password_label = new Label (Catalog.GetString ("Password:"));
-            password_label.Xalign = 1.0f;
-            password_label.Show ();
-            
-            password_entry = new Entry ();
-            password_entry.Visibility = false;
-
-            //When the user presses enter in the password field: save, and then destroy the AcountLoginDialog
-            password_entry.Activated += delegate {
-                    if (save_on_enter) {
-                        this.Save ();
-                        parentDialog.Destroy ();
-                    }
-                };
-            
-            password_entry.Show ();
-            
-            Attach (username_label, 0, 1, 0, 1, AttachOptions.Fill, 
-                AttachOptions.Shrink, 0, 0);
-            
-            Attach (username_entry, 1, 2, 0, 1, AttachOptions.Fill | AttachOptions.Expand, 
-                AttachOptions.Shrink, 0, 0);
-            
-            Attach (password_label, 0, 1, 1, 2, AttachOptions.Fill, 
+
+            Attach (username_label, 0, 1, 0, 1, AttachOptions.Fill,
                 AttachOptions.Shrink, 0, 0);
-            
-            Attach (password_entry, 1, 2, 1, 2, AttachOptions.Fill | AttachOptions.Expand, 
+
+            Attach (username_entry, 1, 2, 0, 1, AttachOptions.Fill | AttachOptions.Expand,
                 AttachOptions.Shrink, 0, 0);
-                
+
             username_entry.Text = account.UserName ?? String.Empty;
-            password_entry.Text = account.Password ?? String.Empty;
         }
-        
+
         protected override void OnDestroyed ()
         {
             if (save_on_edit) {
                 Save ();
             }
-            
+
             base.OnDestroyed ();
         }
-        
+
         public void AddSignUpButton ()
         {
             if (signup_button != null) {
                 return;
             }
-            
-            Resize (3, 2);
+
+            Resize (2, 2);
             signup_button = new LinkButton (account.SignUpUrl, Catalog.GetString ("Sign up for Last.fm"));
             signup_button.Show ();
-            Attach (signup_button, 1, 2, 2, 3, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
+            Attach (signup_button, 1, 2, 1, 2, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
+        }
+
+        public void AddAuthorizeButton ()
+        {
+            if (authorize_button != null) {
+                return;
+            }
+
+            Resize (3, 2);
+            authorize_button = new Button (Catalog.GetString ("Authorize for Last.fm"));
+            authorize_button.Clicked += OnAuthorize;
+            authorize_button.Show ();
+            Attach (authorize_button, 1, 2, 2, 3, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0);
         }
-        
+
+        private void OnAuthorize (object o, EventArgs args)
+        {
+            account.SessionKey = null;
+            account.RequestAuthorization ();
+        }
+
         public void Save ()
         {
-            if (account.UserName != username_entry.Text.Trim () || account.Password != password_entry.Text.Trim ()) {
+            bool is_modified = false;
+
+            if (account.UserName != username_entry.Text.Trim ()) {
                 account.UserName = username_entry.Text.Trim ();
-                account.Password = password_entry.Text.Trim ();
+                is_modified = true;
+            }
+            if (account.SessionKey == null) {
+                account.FetchSessionKey ();
+                is_modified = true;
+            }
+
+            if (is_modified) {
                 account.Save ();
             }
         }
@@ -128,21 +129,10 @@ namespace Lastfm.Gui
             get { return save_on_edit; }
             set { save_on_edit = value; }
         }
-        
-        //enable save on Enter and destruction of the parentDialog.
-        public void SaveOnEnter (Gtk.Dialog parentDialog) 
-        {
-           save_on_enter = true;
-           this.parentDialog = parentDialog;
-        }
-                
+
         public string Username {
             get { return username_entry.Text; }
         }
-        
-        public string Password {
-            get { return password_entry.Text; }
-        }
     }
 }
 
diff --git a/src/Libraries/Lastfm.Gui/Lastfm.Gui/Badge.cs b/src/Libraries/Lastfm.Gui/Lastfm.Gui/Badge.cs
index 3245ee0..6519f28 100644
--- a/src/Libraries/Lastfm.Gui/Lastfm.Gui/Badge.cs
+++ b/src/Libraries/Lastfm.Gui/Lastfm.Gui/Badge.cs
@@ -38,10 +38,10 @@ namespace Lastfm.Gui
     {
         private static Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("badge.png");
         private static Gdk.Pixbuf pixbuf_hover = Gdk.Pixbuf.LoadFromResource ("badge-hover.png");
-        
+
         private Image image;
         private bool link = true;
-        
+
         public Badge (Account account) : base (account.HomePageUrl)
         {
             image = new Image ();
@@ -49,27 +49,27 @@ namespace Lastfm.Gui
             image.Xalign = 0.0f;
             Image = image;
         }
-                
+
         protected override bool OnEnterNotifyEvent (Gdk.EventCrossing evnt)
         {
             if (link) {
                 (Image as Image).Pixbuf = pixbuf_hover;
             }
-            
+
             return base.OnEnterNotifyEvent (evnt);
         }
 
         protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt)
         {
             (Image as Image).Pixbuf = pixbuf;
-            
+
             return base.OnLeaveNotifyEvent (evnt);
         }
-        
+
         public static Gdk.Pixbuf Pixbuf {
             get { return pixbuf; }
         }
-        
+
         public static Gdk.Pixbuf PixbufHover {
             get { return pixbuf_hover; }
         }
diff --git a/src/Libraries/Lastfm.Gui/Makefile.in b/src/Libraries/Lastfm.Gui/Makefile.in
index e53ce7f..900e4b8 100644
--- a/src/Libraries/Lastfm.Gui/Makefile.in
+++ b/src/Libraries/Lastfm.Gui/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -374,6 +383,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -477,11 +487,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -499,6 +510,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -528,6 +540,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -547,14 +560,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Lastfm.Gui/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Lastfm.Gui/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Lastfm.Gui/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Lastfm.Gui/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -572,25 +585,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -620,13 +649,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -658,6 +691,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -678,6 +712,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -686,18 +722,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -758,7 +804,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -775,6 +821,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Lastfm/Lastfm.Data/DataCore.cs b/src/Libraries/Lastfm/Lastfm.Data/DataCore.cs
index beee42e..30a7b51 100644
--- a/src/Libraries/Lastfm/Lastfm.Data/DataCore.cs
+++ b/src/Libraries/Lastfm/Lastfm.Data/DataCore.cs
@@ -64,12 +64,12 @@ namespace Lastfm.Data
                 SetupCache();
             }
         }
-        
+
         public static string DownloadContent (string data_url)
         {
             return DownloadContent (data_url, CacheDuration.Infinite);
         }
-        
+
         public static string DownloadContent (string data_url, CacheDuration cache_duration)
         {
             return DownloadContent (data_url, GetCachedPathFromUrl (data_url), cache_duration);
@@ -95,20 +95,20 @@ namespace Lastfm.Data
             HttpWebRequest request = (HttpWebRequest) WebRequest.Create (data_url);
             request.UserAgent = DataCore.UserAgent;
             request.KeepAlive = false;
-            
+
             using (HttpWebResponse response = (HttpWebResponse) request.GetResponse ()) {
                 using (Stream stream = GetResponseStream (response)) {
                     using (FileStream file_stream = File.Open (cache_file, FileMode.Create)) {
                         using (BufferedStream buffered_stream = new BufferedStream (file_stream)) {
                             byte [] buffer = new byte[8192];
                             int read;
-                            
+
                             while (true) {
                                 read = stream.Read (buffer, 0, buffer.Length);
                                 if (read <= 0) {
                                     break;
                                 }
-                                
+
                                 buffered_stream.Write (buffer, 0, read);
                             }
                         }
@@ -118,7 +118,7 @@ namespace Lastfm.Data
             return cache_file;
         }
 
-        
+
         public static string GetCachedPathFromUrl (string url)
         {
             if (url == null) {
@@ -132,8 +132,8 @@ namespace Lastfm.Data
                 return String.Empty;
             }
         }
-        
-        private static Stream GetResponseStream (HttpWebResponse response) 
+
+        private static Stream GetResponseStream (HttpWebResponse response)
         {
             return response.ContentEncoding == "gzip"
                 ? new GZipInputStream (response.GetResponseStream ())
@@ -159,28 +159,28 @@ namespace Lastfm.Data
         private static void SetupCache()
         {
             bool clean = false;
-            
+
             if(!Directory.Exists(CachePath)) {
                 clean = true;
                 Directory.CreateDirectory(CachePath);
             }
-            
+
             // Create our cache subdirectories.
             for(int i = 0; i < 256; ++i) {
                 string subdir = i.ToString("x");
                 if(i < 16) {
                     subdir = "0" + subdir;
                 }
-                
+
                 subdir = System.IO.Path.Combine(CachePath, subdir);
-                
+
                 if(!Directory.Exists(subdir)) {
                     Directory.CreateDirectory(subdir);
                 }
             }
-            
+
             //RecommendationPlugin.CacheVersion.Set (CACHE_VERSION);
-            
+
             if(clean) {
                 Log.Debug("Recommendation Plugin", "Created a new cache layout");
             }
@@ -189,11 +189,11 @@ namespace Lastfm.Data
         private static void CheckForCacheWipe()
         {
             //bool wipe = false;
-            
+
             if(!Directory.Exists(CachePath)) {
                 return;
             }
-            
+
             /*if (RecommendationPlugin.CacheVersion.Get() < CACHE_VERSION) {
                 Directory.Delete(CachePath, true);
                 Log.Debug("Recommendation Plugin", "Destroyed outdated cache");
diff --git a/src/Libraries/Lastfm/Lastfm.Data/DataEntry.cs b/src/Libraries/Lastfm/Lastfm.Data/DataEntry.cs
index 69dc754..981dce2 100644
--- a/src/Libraries/Lastfm/Lastfm.Data/DataEntry.cs
+++ b/src/Libraries/Lastfm/Lastfm.Data/DataEntry.cs
@@ -63,7 +63,7 @@ namespace Lastfm.Data
             } catch (Exception) {}
             return default(T);
         }
-        
+
         protected string GetUrl (string name)
         {
             return Uri.UnescapeDataString (Get<string> (name));
@@ -217,29 +217,29 @@ namespace Lastfm.Data
     {
         public int Reach                { get { return Get<int>      ("reach"); } }
     }
-    
+
     // Album Data
-    public class AlbumData : DataEntry 
-    {            
-        public string Reach             { get { return Get<string>      ("reach"); } }            
+    public class AlbumData : DataEntry
+    {
+        public string Reach             { get { return Get<string>      ("reach"); } }
         public string LastfmUrl         { get { return Get<string>      ("url"); } }
-        public DateTime ReleaseDate     { get { return Get<DateTime>    ("releasedate"); } }        
+        public DateTime ReleaseDate     { get { return Get<DateTime>    ("releasedate"); } }
     }
-    
+
     public class AlbumCoverUrls : DataEntry
-    {        
+    {
         public string Small             { get { return Get<string>      ("small"); } }
         public string Medium            { get { return Get<string>      ("medium"); } }
-        public string Large             { get { return Get<string>      ("large"); } }        
+        public string Large             { get { return Get<string>      ("large"); } }
         public string[] AllUrls() {
             return (new string[] {Small, Medium, Large});
         }
     }
-       
+
     public class AlbumTrack : DataEntry
     {
-        public string Title             { get { return Get<string>      ("title"); } }            
+        public string Title             { get { return Get<string>      ("title"); } }
         public int Reach                { get { return Get<int>         ("reach"); } }
         public string LastfmUrl         { get { return Get<string>      ("url"); } }
-    }   
+    }
 }
diff --git a/src/Libraries/Lastfm/Lastfm.Data/LastfmAlbumData.cs b/src/Libraries/Lastfm/Lastfm.Data/LastfmAlbumData.cs
index b6fb787..7a4fc54 100644
--- a/src/Libraries/Lastfm/Lastfm.Data/LastfmAlbumData.cs
+++ b/src/Libraries/Lastfm/Lastfm.Data/LastfmAlbumData.cs
@@ -43,26 +43,26 @@ namespace Lastfm.Data
         public string Artist {
             get { return artist; }
         }
-        
+
         protected string album;
         public string Album {
             get { return album; }
         }
 
-        public LastfmAlbumData (string artist, string album) 
+        public LastfmAlbumData (string artist, string album)
         {
             this.artist = artist;
             this.album = album;
-            
+
             //Return Exception if the album is not found on Lastfm.
             try {
                 if (AlbumData != null) {
                     return;
                 }
-                } catch { throw; } 
+                } catch { throw; }
         }
 
-        
+
         protected LastfmData<T> Get<T> (string fragment) where T : DataEntry
         {
             return Get<T> (fragment, null);
@@ -72,7 +72,7 @@ namespace Lastfm.Data
         {
             //using cacheKey because the public methods all use the same fragment but with a different xpath.
             string cacheKey = fragment + xpath;
-                    
+
             if (cache.ContainsKey (cacheKey)) {
                 return (LastfmData<T>) cache [cacheKey];
             }
@@ -81,26 +81,26 @@ namespace Lastfm.Data
             cache [cacheKey] = obj;
             return obj;
         }
-        
-        
+
+
 #region Public Properties
 //      All these methods use the same fragment, but with a different xpath. This because the info.xml contains lots of different stuff.
 //      Couldn't figure out how to process it otherwise.
-        
+
         public AlbumData AlbumData {
             // We don't need the array, since there is only 1 set of albumdata for any album. Therefore "[0]".
             get { return (Get<AlbumData> ("info.xml", "/album"))[0]; }
         }
-        
+
         public LastfmData<AlbumTrack> AlbumTracks {
             get { return Get<AlbumTrack> ("info.xml", "/album/tracks/track"); }
         }
-        
+
         public AlbumCoverUrls AlbumCoverUrls {
             // We don't need the array, since there is only 1 set of covers for any album. Therefore "[0]".
             get { return (Get<AlbumCoverUrls> ("info.xml", "/album/coverart"))[0]; }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Libraries/Lastfm/Lastfm.Data/LastfmData.cs b/src/Libraries/Lastfm/Lastfm.Data/LastfmData.cs
index a12e0c4..8511ab3 100644
--- a/src/Libraries/Lastfm/Lastfm.Data/LastfmData.cs
+++ b/src/Libraries/Lastfm/Lastfm.Data/LastfmData.cs
@@ -105,7 +105,7 @@ namespace Lastfm.Data
 
             XmlReaderSettings settings = new XmlReaderSettings ();
             settings.CheckCharacters = false;
-            
+
             using (XmlReader reader = XmlReader.Create (cache_file, settings)) {
                 doc.Load (reader);
             }
diff --git a/src/Libraries/Lastfm/Lastfm/Account.cs b/src/Libraries/Lastfm/Lastfm/Account.cs
index de82369..d5048b4 100644
--- a/src/Libraries/Lastfm/Lastfm/Account.cs
+++ b/src/Libraries/Lastfm/Lastfm/Account.cs
@@ -31,39 +31,33 @@ using System;
 using System.Collections;
 using System.Text;
 
+using Hyena;
+
 namespace Lastfm
 {
     public class Account
-    {    
+    {
         public event EventHandler Updated;
 
+        // Only used during the authentication process
+        private string authentication_token;
+
         private string username;
         public string UserName {
             get { return username; }
             set { username = value; }
         }
 
-        private string password; 
-        public string Password {
-            get { return password; }
-            set { password = value; }
+        private string session_key;
+        public string SessionKey {
+            get { return session_key; }
+            set { session_key = value; }
         }
 
-        public string CryptedPassword {
-            get {
-                // Okay, so this will explode if someone has a raw text password 
-                // that matches ^[a-f0-9]{32}$ ... likely? I hope not.
-            
-                if (password == null) {
-                    return null;
-                } else if (Hyena.CryptoUtil.IsMd5Encoded (password)) {
-                    return password;
-                }
-                
-                password = Hyena.CryptoUtil.Md5Encode (password);
-                return password;
-            }
-            set { password = String.IsNullOrEmpty (value) ? null : value; }
+        private bool subscriber;
+        public bool Subscriber {
+            get { return subscriber; }
+            set { subscriber = value; }
         }
 
         private string scrobble_url;
@@ -80,26 +74,71 @@ namespace Lastfm
         {
             Browser.Open (SignUpUrl);
         }
-        
+
         public void VisitUserProfile (string username)
         {
             Browser.Open (String.Format ("http://last.fm/user/{0}", username));
         }
-        
+
         public string HomePageUrl {
             get { return "http://www.last.fm/"; }
         }
-        
+
         public void VisitHomePage ()
         {
             Browser.Open (HomePageUrl);
         }
-        
+
         public virtual void Save ()
         {
             OnUpdated ();
         }
 
+        public StationError RequestAuthorization ()
+        {
+            LastfmRequest get_token = new LastfmRequest ("auth.getToken", RequestType.Read, ResponseFormat.Json);
+            get_token.Send ();
+
+            var response = get_token.GetResponseObject ();
+            object error_code;
+            if (response.TryGetValue ("error", out error_code)) {
+                Log.WarningFormat ("Lastfm error {0} : {1}", (int)error_code, (string)response["message"]);
+                return (StationError) error_code;
+            }
+
+            authentication_token = (string)response["token"];
+            Browser.Open (String.Format ("http://www.last.fm/api/auth?api_key={0}&token={1}", LastfmCore.ApiKey, authentication_token));
+
+            return StationError.None;
+        }
+
+        public StationError FetchSessionKey ()
+        {
+            if (authentication_token == null) {
+                throw new InvalidOperationException ("RequestAuthorization should be called before calling FetchSessionKey");
+            }
+
+            LastfmRequest get_session = new LastfmRequest ("auth.getSession", RequestType.SessionRequest, ResponseFormat.Json);
+            get_session.AddParameter ("token", authentication_token);
+            get_session.Send ();
+            var response = get_session.GetResponseObject ();
+            object error_code;
+            if (response.TryGetValue ("error", out error_code)) {
+                Log.WarningFormat ("Lastfm error {0} : {1}", (int)error_code, (string)response["message"]);
+                return (StationError) error_code;
+            }
+
+            var session = (Hyena.Json.JsonObject)response["session"];
+            UserName = (string)session["name"];
+            SessionKey = (string)session["key"];
+            Subscriber = session["subscriber"].ToString ().Equals ("1");
+
+            // The authentication token is only valid once, and for a limited time
+            authentication_token = null;
+
+            return StationError.None;
+        }
+
         protected void OnUpdated ()
         {
             EventHandler handler = Updated;
diff --git a/src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs b/src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs
index 3ed2cca..c2908cc 100644
--- a/src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs
+++ b/src/Libraries/Lastfm/Lastfm/AudioscrobblerConnection.cs
@@ -60,17 +60,17 @@ namespace Lastfm
         private const string CLIENT_ID = "bsh";
         private const string CLIENT_VERSION = "0.1";
         private const string SCROBBLER_URL = "http://post.audioscrobbler.com/";
-        private const string SCROBBLER_VERSION = "1.2";
+        private const string SCROBBLER_VERSION = "1.2.1";
 
         private string post_url;
         private string session_id = null;
         private string now_playing_url;
-        
+
         private bool connected = false; /* if we're connected to network or not */
         public bool Connected {
             get { return connected; }
         }
-        
+
         private bool started = false; /* engine has started and was/is connected to AS */
         public bool Started {
             get { return started; }
@@ -81,32 +81,32 @@ namespace Lastfm
         private DateTime last_upload_failed_logged;
 
         private IQueue queue;
-        
+
         private int hard_failures = 0;
         private int hard_failure_retry_sec = 60;
-        
+
         private HttpWebRequest now_playing_post;
         private bool now_playing_started;
         private string current_now_playing_data;
         private HttpWebRequest current_web_req;
         private IAsyncResult current_async_result;
         private State state;
-        
+
         internal AudioscrobblerConnection (IQueue queue)
         {
             LastfmCore.Account.Updated += AccountUpdated;
-            
+
             state = State.Idle;
             this.queue = queue;
         }
-        
+
         private void AccountUpdated (object o, EventArgs args)
         {
             Stop ();
             session_id = null;
             Start ();
         }
-        
+
         public void UpdateNetworkState (bool connected)
         {
             Log.DebugFormat ("Audioscrobbler state: {0}", connected ? "connected" : "disconnected");
@@ -114,17 +114,17 @@ namespace Lastfm
         }
 
         public void Start ()
-        {            
+        {
             if (started) {
                 return;
             }
-            
+
             started = true;
             hard_failures = 0;
             queue.TrackAdded += delegate(object o, EventArgs args) {
                 StartTransitionHandler ();
             };
-            
+
             queue.Load ();
             StartTransitionHandler ();
         }
@@ -135,13 +135,13 @@ namespace Lastfm
                 // Don't run if we're not actually started.
                 return;
             }
-            
+
             if (timer == null) {
                 timer = new System.Timers.Timer ();
                 timer.Interval = TICK_INTERVAL;
                 timer.AutoReset = true;
                 timer.Elapsed += new ElapsedEventHandler (StateTransitionHandler);
-                
+
                 timer.Start ();
             } else if (!timer.Enabled) {
                 timer.Start ();
@@ -157,7 +157,7 @@ namespace Lastfm
             }
 
             queue.Save ();
-            
+
             started = false;
         }
 
@@ -174,18 +174,18 @@ namespace Lastfm
             if (!connected) {
                 return;
             }
-                        
+
             if ((state == State.Idle || state == State.NeedTransmit) && hard_failures > 2) {
                 state = State.NeedHandshake;
                 hard_failures = 0;
             }
-            
+
             // and address changes in our engine state
             switch (state) {
             case State.Idle:
                 if (LastfmCore.Account.UserName != null &&
-                    LastfmCore.Account.CryptedPassword != null && session_id == null) {
-                    
+                    LastfmCore.Account.SessionKey != null && session_id == null) {
+
                     state = State.NeedHandshake;
                 } else {
                     if (queue.Count > 0 && session_id != null) {
@@ -197,13 +197,13 @@ namespace Lastfm
                         StopTransitionHandler ();
                     }
                 }
-                
+
                 break;
             case State.NeedHandshake:
                 if (DateTime.Now > next_interval) {
                     Handshake ();
                 }
-                
+
                 break;
             case State.NeedTransmit:
                 if (DateTime.Now > next_interval) {
@@ -253,7 +253,7 @@ namespace Lastfm
             current_web_req.Method = "POST";
             current_web_req.ContentType = "application/x-www-form-urlencoded";
             current_web_req.ContentLength = sb.Length;
-            
+
             //Console.WriteLine ("Sending {0} ({1} bytes) to {2}", sb.ToString (), sb.Length, post_url);
 
             TransmitState ts = new TransmitState ();
@@ -267,7 +267,7 @@ namespace Lastfm
                 next_interval = DateTime.Now + new TimeSpan (0, 0, RETRY_SECONDS);
                 hard_failures++;
                 state = State.Idle;
-                
+
                 current_web_req.Abort();
             }
         }
@@ -324,14 +324,14 @@ namespace Lastfm
 
             string line;
             line = sr.ReadLine ();
-            
+
             DateTime now = DateTime.Now;
             if (line.StartsWith ("FAILED")) {
                 if (now - last_upload_failed_logged > TimeSpan.FromMinutes(FAILURE_LOG_MINUTES)) {
                     Log.Warning ("Audioscrobbler upload failed", line.Substring ("FAILED".Length).Trim(), false);
                     last_upload_failed_logged = now;
                 }
-                
+
                 // retransmit the queue on the next interval
                 hard_failures++;
                 state = State.NeedTransmit;
@@ -341,7 +341,7 @@ namespace Lastfm
                     Log.Warning ("Audioscrobbler upload failed", "session ID sent was invalid", false);
                     last_upload_failed_logged = now;
                 }
-                
+
                 // attempt to re-handshake (and retransmit) on the next interval
                 session_id = null;
                 next_interval = DateTime.Now + new TimeSpan (0, 0, RETRY_SECONDS);
@@ -353,20 +353,20 @@ namespace Lastfm
                     Log.Debug ("Audioscrobbler upload succeeded");
                     last_upload_failed_logged = DateTime.MinValue;
                 }
-                
+
                 hard_failures = 0;
-                
+
                 // we succeeded, pop the elements off our queue
                 queue.RemoveRange (0, ts.Count);
                 queue.Save ();
-                
+
                 state = State.Idle;
             } else {
                 if (now - last_upload_failed_logged > TimeSpan.FromMinutes(FAILURE_LOG_MINUTES)) {
                     Log.Warning ("Audioscrobbler upload failed", String.Format ("Unrecognized response: {0}", line), false);
                     last_upload_failed_logged = now;
                 }
-                
+
                 state = State.Idle;
             }
         }
@@ -374,18 +374,18 @@ namespace Lastfm
         //
         // Async code for handshaking
         //
-        
+
         private string UnixTime ()
         {
             return ((int) (DateTime.UtcNow - new DateTime (1970, 1, 1)).TotalSeconds).ToString ();
         }
-        
+
         private void Handshake ()
         {
             string timestamp = UnixTime();
-            string security_token = Hyena.CryptoUtil.Md5Encode
-                (LastfmCore.Account.CryptedPassword + timestamp);
-            
+            string authentication_token = Hyena.CryptoUtil.Md5Encode
+                (LastfmCore.ApiSecret + timestamp);
+
             string api_url = LastfmCore.Account.ScrobbleUrl;
             if (String.IsNullOrEmpty (api_url)) {
                 api_url = SCROBBLER_URL;
@@ -393,13 +393,15 @@ namespace Lastfm
                 Log.DebugFormat ("Scrobbling to non-standard API URL: {0}", api_url);
             }
 
-            string uri = String.Format ("{0}?hs=true&p={1}&c={2}&v={3}&u={4}&t={5}&a={6}",
+            string uri = String.Format ("{0}?hs=true&p={1}&c={2}&v={3}&u={4}&t={5}&a={6}&api_key={7}&sk={8}",
                                         api_url,
                                         SCROBBLER_VERSION,
                                         CLIENT_ID, CLIENT_VERSION,
                                         HttpUtility.UrlEncode (LastfmCore.Account.UserName),
                                         timestamp,
-                                        security_token);
+                                        authentication_token,
+                                        LastfmCore.ApiKey,
+                                        LastfmCore.Account.SessionKey);
 
             current_web_req = (HttpWebRequest) WebRequest.Create (uri);
 
@@ -441,12 +443,12 @@ namespace Lastfm
             line = sr.ReadLine ();
             if (line.StartsWith ("BANNED")) {
                 Log.Warning ("Audioscrobbler sign-on failed", "Player is banned", false);
-                                   
+
             } else if (line.StartsWith ("BADAUTH")) {
-                Log.Warning ("Audioscrobbler sign-on failed", Catalog.GetString ("Last.fm username or password is invalid."));
-                LastfmCore.Account.CryptedPassword = null;
+                Log.Warning ("Audioscrobbler sign-on failed", Catalog.GetString ("Last.fm username is invalid or Banshee is not authorized to access you account."));
+                LastfmCore.Account.SessionKey = null;
             } else if (line.StartsWith ("BADTIME")) {
-                Log.Warning ("Audioscrobbler sign-on failed", 
+                Log.Warning ("Audioscrobbler sign-on failed",
                                                   "timestamp provided was not close enough to the current time", false);
             } else if (line.StartsWith ("FAILED")) {
                 Log.Warning ("Audioscrobbler sign-on failed",
@@ -458,13 +460,13 @@ namespace Lastfm
                 Log.Error ("Audioscrobbler sign-on failed", String.Format ("Unknown error: {0}", line.Trim()));
                 hard_failure = true;
             }
-            
+
             if (success == true) {
-                Log.Debug ("Audioscrobbler sign-on succeeded", "Session ID received"); 
+                Log.Debug ("Audioscrobbler sign-on succeeded", "Session ID received");
                 session_id = sr.ReadLine ().Trim ();
                 now_playing_url = sr.ReadLine ().Trim ();
                 post_url = sr.ReadLine ().Trim ();
-                
+
                 hard_failures = 0;
                 hard_failure_retry_sec = 60;
             } else {
@@ -478,37 +480,37 @@ namespace Lastfm
 
             state = State.Idle;
         }
-        
+
         //
         // Async code for now playing
-        
+
         public void NowPlaying (string artist, string title, string album, double duration,
                                 int tracknum)
         {
             NowPlaying (artist, title, album, duration, tracknum, "");
         }
-        
+
         public void NowPlaying (string artist, string title, string album, double duration,
                                 int tracknum, string mbrainzid)
         {
             if (String.IsNullOrEmpty(artist) || String.IsNullOrEmpty(title) || !connected) {
                 return;
             }
-        
+
             string str_track_number = String.Empty;
             if (tracknum != 0) {
                 str_track_number = tracknum.ToString();
             }
-            
+
             // Fall back to prefixing the URL with a # in case we haven't actually
             // authenticated yet. We replace it with the now_playing_url and session_id
             // later on in NowPlaying(uri).
             string dataprefix = "#";
-            
+
             if (session_id != null) {
                 dataprefix = String.Format ("s={0}", session_id);
             }
-            
+
             string data = String.Format ("{0}&a={1}&t={2}&b={3}&l={4}&n={5}&m={6}",
                                         dataprefix,
                                         HttpUtility.UrlEncode(artist),
@@ -518,16 +520,15 @@ namespace Lastfm
                                         str_track_number,
                                         mbrainzid);
 
-            Console.WriteLine ("Submitting via non-uri handler.");            
             NowPlaying (data);
         }
-        
+
         private void NowPlaying (string data)
-        {            
+        {
             if (now_playing_started) {
                 return;
             }
-            
+
             // If the URI begins with #, then we know the URI was created before we
             // had actually authenticated. So, because we didn't know the session_id and
             // now_playing_url previously, we should now, so we put that in and create our
@@ -537,9 +538,9 @@ namespace Lastfm
                                       session_id,
                                       data.Substring (1));
             }
-            
+
             current_now_playing_data = data;
-            
+
             if (session_id == null) {
                 // Go connect - we'll come back later in main timer loop.
                 Start ();
@@ -562,7 +563,7 @@ namespace Lastfm
             } catch (Exception ex) {
                 Log.Warning ("Audioscrobbler NowPlaying failed",
                                   String.Format ("Exception while creating request: {0}", ex), false);
-                
+
                 // Reset current_now_playing_data if it was the problem.
                 current_now_playing_data = null;
             }
@@ -596,7 +597,7 @@ namespace Lastfm
                 if (line == null) {
                     Log.Warning ("Audioscrobbler NowPlaying failed", "No response", false);
                 }
-                
+
                 if (line.StartsWith ("BADSESSION")) {
                     Log.Warning ("Audioscrobbler NowPlaying failed", "Session ID sent was invalid", false);
                     // attempt to re-handshake on the next interval
@@ -606,22 +607,22 @@ namespace Lastfm
                     StartTransitionHandler ();
                     return;
                 } else if (line.StartsWith ("OK")) {
-                    // NowPlaying submitted  
+                    // NowPlaying submitted
                     Log.DebugFormat ("Submitted NowPlaying track to Audioscrobbler");
                     now_playing_started = false;
                     now_playing_post = null;
                     current_now_playing_data = null;
                     return;
                 } else {
-                    Log.Warning ("Audioscrobbler NowPlaying failed", "Unexpected or no response", false);       
+                    Log.Warning ("Audioscrobbler NowPlaying failed", "Unexpected or no response", false);
                 }
             }
             catch (Exception e) {
-                Log.Warning ("Audioscrobbler NowPlaying failed", 
+                Log.Warning ("Audioscrobbler NowPlaying failed",
                     String.Format("Failed to post NowPlaying: {0}", e), false);
             }
-            
-            // NowPlaying error/success is non-crutial.
+
+            // NowPlaying error/success is non-crucial.
             hard_failures++;
             if (hard_failures < 3) {
                 NowPlaying (current_now_playing_data);
diff --git a/src/Libraries/Lastfm/Lastfm/Browser.cs b/src/Libraries/Lastfm/Lastfm/Browser.cs
index eca40f1..2fe173f 100644
--- a/src/Libraries/Lastfm/Lastfm/Browser.cs
+++ b/src/Libraries/Lastfm/Lastfm/Browser.cs
@@ -33,13 +33,13 @@ namespace Lastfm
     public static class Browser
     {
         public delegate bool OpenHandler (string uri);
-        
+
         private static OpenHandler open_handler = DefaultOpen;
         public static OpenHandler Open {
             get { return open_handler; }
             set { open_handler = value; }
         }
-        
+
         private static bool DefaultOpen (string uri)
         {
             return false;
diff --git a/src/Libraries/Lastfm/Lastfm/IQueue.cs b/src/Libraries/Lastfm/Lastfm/IQueue.cs
index 2c6edd3..58d2975 100644
--- a/src/Libraries/Lastfm/Lastfm/IQueue.cs
+++ b/src/Libraries/Lastfm/Lastfm/IQueue.cs
@@ -33,16 +33,16 @@ namespace Lastfm
     public interface IQueue
     {
         event EventHandler TrackAdded;
-        
+
         int Count {
             get;
         }
-        
+
         void Save ();
         void Load ();
-        
+
         string GetTransmitInfo (out int numtracks);
-        
+
         void Add (object track, DateTime started);
         void RemoveRange (int first, int count);
     }
diff --git a/src/Libraries/Lastfm/Lastfm/LastfmCore.cs b/src/Libraries/Lastfm/Lastfm/LastfmCore.cs
index 7328210..c5899e0 100644
--- a/src/Libraries/Lastfm/Lastfm/LastfmCore.cs
+++ b/src/Libraries/Lastfm/Lastfm/LastfmCore.cs
@@ -32,40 +32,54 @@ namespace Lastfm
 {
     public static class LastfmCore
     {
+        // The default API key and secret are for a "Non-commercial Use" API account.
+        // See http://www.last.fm/api/account for more information.
+        private static string api_key = "344e9141fffeb02201e1ae455d92ae9f";
+        public static string ApiKey {
+            get { return api_key; }
+            set { api_key = value; }
+        }
+
+        private static string api_secret = "af3f4459eebbe1bde84fa9f8cf1a75fb";
+        internal static string ApiSecret {
+            get { return api_secret; }
+            set { api_secret = value; }
+        }
+
         private static Account account;
         public static Account Account {
             get {
                 if (account == null) {
                     account = new Account ();
                 }
-                
+
                 return account;
             }
         }
-        
+
         private static string user_agent;
         public static string UserAgent {
             get { return user_agent; }
             set { user_agent = value; }
         }
-        
+
         private static RadioConnection radio;
         public static RadioConnection Radio {
             get {
                 if (radio == null) {
                     radio = new RadioConnection ();
                 }
-                
+
                 return radio;
             }
         }
-        
+
         private static IQueue queue;
         public static IQueue AudioscrobblerQueue {
             get { return queue; }
             set { queue = value; }
         }
-        
+
         private static AudioscrobblerConnection audioscrobbler;
         public static AudioscrobblerConnection Audioscrobbler {
             get {
@@ -74,10 +88,10 @@ namespace Lastfm
                         throw new ApplicationException
                             ("Queue instance must be defined before referencing Audioscrobbler.");
                     }
-                    
+
                     audioscrobbler = new AudioscrobblerConnection (queue);
                 }
-                
+
                 return audioscrobbler;
             }
         }
diff --git a/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs b/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs
new file mode 100644
index 0000000..f69b5e5
--- /dev/null
+++ b/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs
@@ -0,0 +1,261 @@
+//
+// LastfmRequest.cs
+//
+// Authors:
+//   Bertrand Lorentz <bertrand.lorentz at gmail.com>
+//
+// Copyright (C) 2009 Bertrand Lorentz
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Web;
+
+using Hyena;
+using Hyena.Json;
+
+namespace Lastfm
+{
+    public enum RequestType {
+        Read,
+        SessionRequest, // Needs the signature, but we don't have the session key yet
+        AuthenticatedRead,
+        Write
+    }
+
+    public enum ResponseFormat {
+        Json,
+        Raw
+    }
+
+    public class LastfmRequest
+    {
+        private const string API_ROOT = "http://ws.audioscrobbler.com/2.0/";
+
+        private Dictionary<string, string> parameters = new Dictionary<string, string> ();
+        private Stream response_stream;
+
+        public LastfmRequest ()
+        {}
+
+        public LastfmRequest (string method) : this (method, RequestType.Read, ResponseFormat.Json)
+        {}
+
+        public LastfmRequest (string method, RequestType request_type, ResponseFormat response_format)
+        {
+            this.method = method;
+            this.request_type = request_type;
+            this.response_format = response_format;
+        }
+
+        private string method;
+        public string Method { get; set; }
+
+
+        private RequestType request_type;
+        public RequestType RequestType { get; set; }
+
+
+        private ResponseFormat response_format;
+        public ResponseFormat ResponseFormat { get; set; }
+
+
+        public void AddParameter (string param_name, string param_value)
+        {
+            parameters.Add (param_name, param_value);
+        }
+
+        public Stream GetResponseStream ()
+        {
+            return response_stream;
+        }
+
+        public void Send ()
+        {
+            if (method == null) {
+                throw new InvalidOperationException ("The method name should be set");
+            }
+
+            if (response_format == ResponseFormat.Json) {
+                AddParameter ("format", "json");
+            } else if (response_format == ResponseFormat.Raw) {
+                AddParameter ("raw", "true");
+            }
+
+            if (request_type == RequestType.Write) {
+                response_stream = Post (API_ROOT, BuildPostData ());
+            } else {
+                response_stream = Get (BuildGetUrl ());
+            }
+        }
+
+        public JsonObject GetResponseObject ()
+        {
+            Deserializer deserializer = new Deserializer (response_stream);
+            object obj = deserializer.Deserialize ();
+            JsonObject json_obj = obj as Hyena.Json.JsonObject;
+
+            if (json_obj == null) {
+                throw new ApplicationException ("Lastfm invalid response : not a JSON object");
+            }
+
+            return json_obj;
+        }
+
+        public StationError GetError ()
+        {
+            StationError error = StationError.None;
+
+            string response;
+            using (StreamReader sr = new StreamReader (response_stream)) {
+                response = sr.ReadToEnd ();
+            }
+
+            if (response.Contains ("<lfm status=\"failed\">")) {
+                // XML reply indicates an error
+                Match match = Regex.Match (response, "<error code=\"(\\d+)\">");
+                if (match.Success) {
+                    error = (StationError) Int32.Parse (match.Value);
+                    Log.WarningFormat ("Lastfm error {0}", error);
+                } else {
+                    error = StationError.Unknown;
+                }
+            }
+            if (response_format == ResponseFormat.Json && response.Contains ("\"error\":")) {
+                // JSON reply indicates an error
+                Deserializer deserializer = new Deserializer (response);
+                JsonObject json = deserializer.Deserialize () as JsonObject;
+                if (json != null && json.ContainsKey ("error")) {
+                    error = (StationError) json["error"];
+                    Log.WarningFormat ("Lastfm error {0} : {1}", error, (string)json["message"]);
+                }
+            }
+
+            return error;
+        }
+
+        private string BuildGetUrl ()
+        {
+            if (request_type == RequestType.AuthenticatedRead) {
+                parameters.Add ("sk", LastfmCore.Account.SessionKey);
+            }
+
+            StringBuilder url = new StringBuilder (API_ROOT);
+            url.AppendFormat ("?method={0}", method);
+            url.AppendFormat ("&api_key={0}", LastfmCore.ApiKey);
+            foreach (KeyValuePair<string, string> param in parameters) {
+                url.AppendFormat ("&{0}={1}", param.Key, Uri.EscapeDataString (param.Value));
+            }
+            if (request_type == RequestType.AuthenticatedRead || request_type == RequestType.SessionRequest) {
+                url.AppendFormat ("&api_sig={0}", GetSignature ());
+            }
+
+            return url.ToString ();
+        }
+
+        private string BuildPostData ()
+        {
+            parameters.Add ("sk", LastfmCore.Account.SessionKey);
+
+            StringBuilder data = new StringBuilder ();
+            data.AppendFormat ("method={0}", method);
+            data.AppendFormat ("&api_key={0}", LastfmCore.ApiKey);
+            foreach (KeyValuePair<string, string> param in parameters) {
+                data.AppendFormat ("&{0}={1}", param.Key, Uri.EscapeDataString (param.Value));
+            }
+            data.AppendFormat ("&api_sig={0}", GetSignature ());
+
+            return data.ToString ();
+        }
+
+        private string GetSignature ()
+        {
+            SortedDictionary<string, string> sorted_params = new SortedDictionary<string, string> (parameters);
+
+            if (!sorted_params.ContainsKey ("api_key")) {
+                sorted_params.Add ("api_key", LastfmCore.ApiKey);
+            }
+            if (!sorted_params.ContainsKey ("method")) {
+                sorted_params.Add ("method", method);
+            }
+            StringBuilder signature = new StringBuilder ();
+            foreach (KeyValuePair<string, string> parm in sorted_params) {
+                if (parm.Key.Equals ("format")) {
+                    continue;
+                }
+                signature.Append (parm.Key);
+                signature.Append (parm.Value);
+            }
+            signature.Append (LastfmCore.ApiSecret);
+
+            return Hyena.CryptoUtil.Md5Encode (signature.ToString (), Encoding.UTF8);
+        }
+
+#region HTTP helpers
+
+        private Stream Get (string uri)
+        {
+            return Get (uri, null);
+        }
+
+        private Stream Get (string uri, string accept)
+        {
+            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);
+            if (accept != null) {
+                request.Accept = accept;
+            }
+            request.UserAgent = LastfmCore.UserAgent;
+            request.Timeout = 10000;
+            request.KeepAlive = false;
+            request.AllowAutoRedirect = true;
+
+            HttpWebResponse response = (HttpWebResponse) request.GetResponse ();
+            return response.GetResponseStream ();
+        }
+
+        private Stream Post (string uri, string data)
+        {
+            // Do not trust docs : it doesn't work if parameters are in the request body
+            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (String.Concat (uri, "?", data));
+            request.UserAgent = LastfmCore.UserAgent;
+            request.Timeout = 10000;
+            request.Method = "POST";
+            request.KeepAlive = false;
+            request.ContentType = "application/x-www-form-urlencoded";
+
+            HttpWebResponse response = null;
+            try {
+                response = (HttpWebResponse) request.GetResponse ();
+            } catch (WebException e) {
+                Log.DebugException (e);
+                response = (HttpWebResponse)e.Response;
+            }
+            return response.GetResponseStream ();
+        }
+
+#endregion
+    }
+}
diff --git a/src/Libraries/Lastfm/Lastfm/RadioConnection.cs b/src/Libraries/Lastfm/Lastfm/RadioConnection.cs
index 7206305..bae2af4 100644
--- a/src/Libraries/Lastfm/Lastfm/RadioConnection.cs
+++ b/src/Libraries/Lastfm/Lastfm/RadioConnection.cs
@@ -38,6 +38,7 @@ using System.Web;
 using System.Threading;
 
 using Hyena;
+using Hyena.Json;
 using Mono.Unix;
 
 using Media.Playlists.Xspf;
@@ -59,43 +60,50 @@ namespace Lastfm
         NoAccount,
         NoNetwork,
         InvalidAccount,
+        NotAuthorized,
         Connecting,
         Connected
     };
 
-    // Error codes returned when trying to adjust.php to a new station
+    // Error codes returned by the API methods
     public enum StationError
     {
         None = 0,
-        NotEnoughContent = 1,
-        FewGroupMembers,
-        FewFans,
-        Unavailable,
-        Subscribe,
-        FewNeighbors,
-        Offline,
+        NotUsed = 1,
+        InvalidService,
+        InvalidMethod,
+        AuthenticationFailed,
+        InvalidFormat,
+        InvalidParameters,
+        InvalidResource,
+        TokenFailure,
+        InvalidSessionKey,
+        InvalidApiKey,
+        ServiceOffline,
+        SubscriptionError,
+        InvalidSignature,
+        TokenNotAuthorized,
+        ExpiredToken,
+
+        SubscriptionRequired = 18,
+
+        NotEnoughContent = 20,
+        NotEnoughMembers,
+        NotEnoughFans,
+        NotEnoughNeighbours,
+
         Unknown // not an official code, just the fall back
     }
 
-    public class RadioConnection 
+    public class RadioConnection
     {
         public delegate void StateChangedHandler (RadioConnection connection, ConnectionStateChangedArgs args);
         public event StateChangedHandler StateChanged;
 
         private ConnectionState state;
-        private string session;
-        private string base_url;
-        private string base_path;
         private string info_message;
         private bool network_connected = false;
 
-        private static Regex station_error_regex = new Regex ("error=(\\d+)", RegexOptions.Compiled);
-        
-        private bool subscriber;
-        public bool Subscriber {
-            get { return subscriber; }
-        }
-
         public string InfoMessage {
             get { return info_message; }
         }
@@ -143,25 +151,27 @@ namespace Lastfm
             if (State == ConnectionState.Connecting || State == ConnectionState.Connected)
                 return;
 
-            if (LastfmCore.Account.UserName == null || LastfmCore.Account.CryptedPassword == null) {
+            if (String.IsNullOrEmpty (LastfmCore.Account.UserName)) {
                 State = ConnectionState.NoAccount;
                 return;
             }
 
+            if (String.IsNullOrEmpty (LastfmCore.Account.SessionKey)) {
+                State = ConnectionState.NotAuthorized;
+                return;
+            }
+
             if (!network_connected) {
                 State = ConnectionState.NoNetwork;
                 return;
             }
 
-            // Otherwise, we're good to try to connect
-            State = ConnectionState.Connecting;
-            Handshake ();
+            // Otherwise, we're good and consider ourselves connected
+            State = ConnectionState.Connected;
         }
 
-        public bool Love    (string artist, string title) { return PostTrackRequest ("loveTrack", artist, title); }
-        public bool UnLove  (string artist, string title) { return PostTrackRequest ("unLoveTrack", artist, title); }
-        public bool Ban     (string artist, string title) { return PostTrackRequest ("banTrack", artist, title); }
-        public bool UnBan   (string artist, string title) { return PostTrackRequest ("unBanTrack", artist, title); }
+        public bool Love    (string artist, string title) { return PostTrackRequest ("love", artist, title); }
+        public bool Ban     (string artist, string title) { return PostTrackRequest ("ban", artist, title); }
 
         public StationError ChangeStationTo (string station)
         {
@@ -170,18 +180,13 @@ namespace Lastfm
                     return StationError.None;
 
                 try {
-                    Stream stream = Get (StationUrlFor (station));
-                    using (StreamReader strm = new StreamReader (stream)) {
-                        string body = strm.ReadToEnd ();
-                        if (body.IndexOf ("response=OK") == -1) {
-                            Match match = station_error_regex.Match (body);
-                            if (match.Success) {
-                                int i = Int32.Parse (match.Groups[1].Value);
-                                return (StationError) i;
-                            } else {
-                                return StationError.Unknown;
-                            }
-                        }
+
+                    LastfmRequest radio_tune = new LastfmRequest ("radio.tune", RequestType.Write, ResponseFormat.Json);
+                    radio_tune.AddParameter ("station", station);
+                    radio_tune.Send ();
+                    StationError error = radio_tune.GetError ();
+                    if (error != StationError.None) {
+                        return error;
                     }
 
                     this.station = station;
@@ -193,24 +198,25 @@ namespace Lastfm
             }
         }
 
-        public Playlist LoadPlaylistFor (string station) 
+        public Playlist LoadPlaylistFor (string station)
         {
             lock (this) {
                 if (station != Station)
                     return null;
 
-                string url = StationRefreshUrl;
                 Playlist pl = new Playlist ();
                 Stream stream = null;
+                LastfmRequest radio_playlist = new LastfmRequest ("radio.getPlaylist", RequestType.AuthenticatedRead, ResponseFormat.Raw);
                 try {
-                    stream = GetXspfStream (url);
+                    radio_playlist.Send ();
+                    stream = radio_playlist.GetResponseStream ();
                     pl.Load (stream);
                     Log.Debug (String.Format ("Adding {0} Tracks to Last.fm Station {1}", pl.TrackCount, station), null);
                 } catch (System.Net.WebException e) {
                     Log.Warning ("Error Loading Last.fm Station", e.Message, false);
                     return null;
                 } catch (Exception e) {
-                    string body = "Unable to get body";
+                    string body = null;
                     try {
                         using (StreamReader strm = new StreamReader (stream)) {
                             body = strm.ReadToEnd ();
@@ -218,7 +224,7 @@ namespace Lastfm
                     } catch {}
                     Log.Warning (
                         "Error loading station",
-                        String.Format ("Exception:\n{0}\n\nResponse Body:\n{1}", e.ToString (), body), false
+                        String.Format ("Exception:\n{0}\n\nResponse:\n{1}", e.ToString (), body ?? "Unable to get response"), false
                     );
                     return null;
                 }
@@ -231,8 +237,7 @@ namespace Lastfm
 
         private void Initialize ()
         {
-            subscriber = false;
-            base_url = base_path = session = station = info_message = null;
+            station = info_message = null;
         }
 
         private void HandleAccountUpdated (object o, EventArgs args)
@@ -256,195 +261,47 @@ namespace Lastfm
             }
         }
 
-        private void Handshake ()
-        {
-            ThreadPool.QueueUserWorkItem (delegate {
-                try {
-                    Stream stream = Get (String.Format (
-                        "http://ws.audioscrobbler.com/radio/handshake.php?version={0}&platform={1}&username={2}&passwordmd5={3}&language={4}&session=324234",
-                        "1.1.1",
-                        "linux", // FIXME
-                        LastfmCore.Account.UserName, LastfmCore.Account.CryptedPassword,
-                        "en" // FIXME
-                    ));
-
-                    // Set us as connecting, assuming the connection attempt wasn't changed out from under us
-                    if (ParseHandshake (new StreamReader (stream).ReadToEnd ()) && session != null) {
-                        State = ConnectionState.Connected;
-                        Log.Debug (String.Format ("Logged into Last.fm as {0} ({1}subscriber)",
-                            LastfmCore.Account.UserName, subscriber ? null : "not a "), null);
-                        return;
-                    }
-                } catch (Exception e) {
-                    Log.Debug ("Error in Last.fm Handshake", e.ToString ());
-                }
-                
-                // Must not have parsed correctly
-                Initialize ();
-                if (State == ConnectionState.Connecting)
-                    State = ConnectionState.Disconnected;
-            });
-        }
-
-        private bool ParseHandshake (string content) 
-        {
-            string [] lines = content.Split (new Char[] {'\n'});
-            foreach (string line in lines) {
-                string [] opts = line.Split (new Char[] {'='});
-
-                switch (opts[0].Trim ().ToLower ()) {
-                case "session":
-                    if (opts[1].ToLower () == "failed") {
-                        session = null;
-                        State = ConnectionState.InvalidAccount;
-                        Log.Warning (
-                            Catalog.GetString ("Failed to Login to Last.fm"),
-                            Catalog.GetString ("Either your username or password is invalid."),
-                            false
-                        );
-                        LastfmCore.Account.CryptedPassword = null;
-                        return false;
-                    }
-
-                    session = opts[1];
-                    break;
-
-                case "stream_url":
-                    //stream_url = opts[1];
-                    break;
-
-                case "subscriber":
-                    subscriber = (opts[1] != "0");
-                    break;
-
-                case "base_url":
-                    base_url = opts[1];
-                    break;
-
-                case "base_path":
-                    base_path = opts[1];
-                    break;
-                    
-                case "info_message":
-                    info_message = opts[1];
-                    break;
-
-                default:
-                    break;
-                }
-            }
-
-            return true;
-        }
-
-        // Basic HTTP helpers
-
-        private HttpStatusCode Post (string uri, string body)
-        {
-            if (!network_connected) {
-                //throw new NetworkUnavailableException ();
-                return HttpStatusCode.RequestTimeout;
-            }
-        
-            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);
-            request.UserAgent = LastfmCore.UserAgent;
-            request.Timeout = 10000;
-            request.Method = "POST";
-            request.KeepAlive = false;
-            request.ContentLength = body.Length;
-
-            using (StreamWriter writer = new StreamWriter (request.GetRequestStream ())) {
-                writer.Write (body);
-            }
-
-            HttpWebResponse response = (HttpWebResponse) request.GetResponse ();
-            using (Stream stream = response.GetResponseStream ()) {
-                /*using (StreamReader reader = new StreamReader (stream)) {
-                    Console.WriteLine ("Posted {0} got response {1}", body, reader.ReadToEnd ());
-                }*/
-            }
-            return response.StatusCode;
-        }
-
-        private Stream GetXspfStream (string uri)
-        {
-            return Get (uri, "application/xspf+xml");
-        }
-
-        private Stream Get (string uri)
-        {
-            return Get (uri, null);
-        }
-
-        private Stream Get (string uri, string accept)
-        {
-            if (!network_connected) {
-                //throw new NetworkUnavailableException ();
-                return null;
-            }
-        
-            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);
-            if (accept != null) {
-                request.Accept = accept;
-            }
-            request.UserAgent = LastfmCore.UserAgent;
-            request.Timeout = 10000;
-            request.KeepAlive = false;
-            request.AllowAutoRedirect = true;
-
-            HttpWebResponse response = (HttpWebResponse) request.GetResponse ();
-            return response.GetResponseStream ();
-        }
-
-        /* ArtistMetaDataRequest.cpp:    rpc.setMethod( "artistMetadata" );
-         * DeleteFriendRequest.cpp:    xmlrpc.setMethod( "removeFriend" );
-         * RecommendRequest.cpp:    xml_rpc.setMethod( "recommendItem" );
-         * SetTagRequest.cpp:            xml_rpc.setMethod( "tagArtist" );
-         * SetTagRequest.cpp:            xml_rpc.setMethod( "tagAlbum" );
-         * SetTagRequest.cpp:            xml_rpc.setMethod( "tagTrack" );
-         * SimilarTagsRequest.cpp:    xmlrpc.setMethod( "getSimilarTags" );
-         * TrackMetaDataRequest.cpp:    xmlrpc.setMethod( "trackMetadata" );
-         * TrackToIdRequest.cpp:    xmlrpc.setMethod( "trackToId" );
-         * UserPicturesRequest.cpp:    xmlrpc.setMethod( "getAvatarUrls" );
-         */
-
-
-        // URL generators for internal use
- 
-        private string XmlRpcUrl {
-            get { return String.Format ("http://{0}/1.0/rw/xmlrpc.php", base_url); }
-        }
-
-        private string StationUrlFor (string station) 
-        {
-            return String.Format (
-                "http://{0}{1}/adjust.php?session={2}&url={3}&lang=en",
-                base_url, base_path, session, HttpUtility.UrlEncode (station)
-            );
-        }
-
-        private string StationRefreshUrl {
-            get {
-                return String.Format (
-                    "http://{0}{1}/xspf.php?sk={2}&discovery=0&desktop=1.3.1.1",
-                    base_url, base_path, session
-                );
-            }
-        }
-
         // Translated error message strings
 
         public static string ErrorMessageFor (StationError error)
         {
             switch (error) {
-            case StationError.NotEnoughContent:  return Catalog.GetString ("There is not enough content to play this station.");
-            case StationError.FewGroupMembers:   return Catalog.GetString ("This group does not have enough members for radio.");
-            case StationError.FewFans:           return Catalog.GetString ("This artist does not have enough fans for radio.");
-            case StationError.Unavailable:       return Catalog.GetString ("This station is not available.");
-            case StationError.Subscribe:         return Catalog.GetString ("This station is only available to subscribers.");
-            case StationError.FewNeighbors:      return Catalog.GetString ("There are not enough neighbours for this station.");
-            case StationError.Offline:           return Catalog.GetString ("The streaming system is offline for maintenance, please try again later.");
-            case StationError.Unknown:           return Catalog.GetString ("There was an unknown error.");
+                case StationError.InvalidService:
+                case StationError.InvalidMethod:
+                    return Catalog.GetString ("This service does not exist.");
+                case StationError.AuthenticationFailed:
+                case StationError.SubscriptionError:
+                case StationError.SubscriptionRequired:
+                    return Catalog.GetString ("This station is only available to subscribers.");
+                case StationError.InvalidFormat:
+                    return Catalog.GetString ("This station is not available.");
+                case StationError.InvalidParameters:
+                    return Catalog.GetString ("The request is missing a required parameter.");
+                case StationError.InvalidResource:
+                    return Catalog.GetString ("The specified resource is invalid.");
+                case StationError.TokenFailure:
+                    return Catalog.GetString ("Server error, please try again later.");
+                case StationError.InvalidSessionKey:
+                    return Catalog.GetString ("Invalid authentication information, please re-authenticate.");
+                case StationError.InvalidApiKey:
+                    return Catalog.GetString ("The API key used by this application is invalid.");
+                case StationError.ServiceOffline:
+                    return Catalog.GetString ("The streaming system is offline for maintenance, please try again later.");
+                case StationError.InvalidSignature:
+                    return Catalog.GetString ("The method signature is invalid.");
+                case StationError.TokenNotAuthorized:
+                case StationError.ExpiredToken:
+                    return Catalog.GetString ("You need to allow Banshee to access your Last.fm account.");
+                case StationError.NotEnoughContent:
+                    return Catalog.GetString ("There is not enough content to play this station.");
+                case StationError.NotEnoughMembers:
+                    return Catalog.GetString ("This group does not have enough members for radio.");
+                case StationError.NotEnoughFans:
+                    return Catalog.GetString ("This artist does not have enough fans for radio.");
+                case StationError.NotEnoughNeighbours:
+                    return Catalog.GetString ("There are not enough neighbours for this station.");
+                case StationError.Unknown:
+                    return Catalog.GetString ("There was an unknown error.");
             }
             return String.Empty;
         }
@@ -452,93 +309,36 @@ namespace Lastfm
         public static string MessageFor (ConnectionState state)
         {
             switch (state) {
-            case ConnectionState.Disconnected:      return Catalog.GetString ("Not connected to Last.fm.");
-            case ConnectionState.NoAccount:         return Catalog.GetString ("Account details are needed before you can connect to Last.fm");
-            case ConnectionState.NoNetwork:         return Catalog.GetString ("No network connection detected.");
-            case ConnectionState.InvalidAccount:    return Catalog.GetString ("Last.fm username or password is invalid.");
-            case ConnectionState.Connecting:        return Catalog.GetString ("Connecting to Last.fm.");
-            case ConnectionState.Connected:         return Catalog.GetString ("Connected to Last.fm.");
+                case ConnectionState.Disconnected:
+                    return Catalog.GetString ("Not connected to Last.fm.");
+                case ConnectionState.NoAccount:
+                    return Catalog.GetString ("Account details are needed before you can connect to Last.fm");
+                case ConnectionState.NoNetwork:
+                    return Catalog.GetString ("No network connection detected.");
+                case ConnectionState.InvalidAccount:
+                    return Catalog.GetString ("Last.fm username is invalid.");
+                case ConnectionState.NotAuthorized:
+                    return Catalog.GetString ("You need to allow Banshee to access your Last.fm account.");
+                case ConnectionState.Connecting:
+                    return Catalog.GetString ("Connecting to Last.fm.");
+                case ConnectionState.Connected:
+                    return Catalog.GetString ("Connected to Last.fm.");
             }
             return String.Empty;
         }
 
-        // XML-RPC foo
-
         private bool PostTrackRequest (string method, string artist, string title)
         {
-            return PostXmlRpc (LastFMXmlRpcRequest (method).AddStringParams (artist, title));
-        }
-
-        private bool PostXmlRpc (LameXmlRpcRequest request)
-        {
             if (State != ConnectionState.Connected)
                 return false;
 
-            return Post (XmlRpcUrl, request.ToString ()) == HttpStatusCode.OK;
-        }
-
-        private string UnixTime ()
-        {
-            return ((int) (DateTime.Now - new DateTime (1970, 1, 1)).TotalSeconds).ToString ();
-        }
-
-        private LameXmlRpcRequest LastFMXmlRpcRequest (string method)
-        {
-            string time = UnixTime ();
-            string auth_hash = Hyena.CryptoUtil.Md5Encode (LastfmCore.Account.CryptedPassword + time);
-            return new LameXmlRpcRequest (method).AddStringParams (LastfmCore.Account.UserName, time, auth_hash);
-        }
+            // track.love and track.ban do not return JSON
+            LastfmRequest track_request = new LastfmRequest (String.Concat ("track.", method), RequestType.Write, ResponseFormat.Raw);
+            track_request.AddParameter ("track", title);
+            track_request.AddParameter ("artist", artist);
+            track_request.Send ();
 
-        protected class LameXmlRpcRequest
-        {
-            private StringBuilder sb = new StringBuilder ();
-            public LameXmlRpcRequest (string method_name)
-            {
-                sb.Append ("<?xml version=\"1.0\" encoding=\"us-ascii\"?>\n");
-                sb.Append ("<methodCall><methodName>");
-                sb.Append (Encode (method_name));
-                sb.Append ("</methodName>\n");
-                sb.Append ("<params>\n");
-            }
-
-            public LameXmlRpcRequest AddStringParams (params string [] values)
-            {
-                foreach (string value in values)
-                    AddStringParam (value);
-                return this;
-            }
-
-            public LameXmlRpcRequest AddStringParam (string value)
-            {
-                sb.Append ("<param><value><string>");
-                sb.Append (Encode (value));
-                sb.Append ("</string></value></param>\n");
-                return this;
-            }
-
-            public static string Encode (string val)
-            {
-                return HttpUtility.HtmlEncode (val);
-            }
-
-            private bool closed = false;
-            public override string ToString ()
-            {
-                if (!closed) {
-                    sb.Append ("</params>\n</methodCall>");
-                    closed = true;
-                }
-
-                return sb.ToString ();
-            }
-        }
-    }
-
-    public sealed class StringUtils {
-        public static string StringToUTF8 (string s)
-        {
-            byte [] ba = (new UnicodeEncoding ()).GetBytes (s);
-            return System.Text.Encoding.UTF8.GetString (ba);
+            return (track_request.GetError () == StationError.None);
         }
     }
 }
diff --git a/src/Libraries/Lastfm/Makefile.am b/src/Libraries/Lastfm/Makefile.am
index 1044dc4..22df01f 100644
--- a/src/Libraries/Lastfm/Makefile.am
+++ b/src/Libraries/Lastfm/Makefile.am
@@ -15,6 +15,7 @@ SOURCES =  \
 	Lastfm/Browser.cs \
 	Lastfm/IQueue.cs \
 	Lastfm/LastfmCore.cs \
+	Lastfm/LastfmRequest.cs \
 	Lastfm/RadioConnection.cs 
 
 include $(top_srcdir)/build/build.mk
diff --git a/src/Libraries/Lastfm/Makefile.in b/src/Libraries/Lastfm/Makefile.in
index 4fe68f7..d421562 100644
--- a/src/Libraries/Lastfm/Makefile.in
+++ b/src/Libraries/Lastfm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -357,6 +366,7 @@ SOURCES = \
 	Lastfm/Browser.cs \
 	Lastfm/IQueue.cs \
 	Lastfm/LastfmCore.cs \
+	Lastfm/LastfmRequest.cs \
 	Lastfm/RadioConnection.cs 
 
 
@@ -380,6 +390,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -483,11 +494,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -505,6 +517,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -534,6 +547,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -553,14 +567,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Lastfm/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Lastfm/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Lastfm/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Lastfm/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -578,25 +592,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -626,13 +656,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -664,6 +698,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -684,6 +719,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -692,18 +729,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -764,7 +811,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -787,6 +834,7 @@ test: Test.cs
 	mv TestLastfm.exe $(top_builddir)/bin/
 	@pushd $(top_builddir)/bin/; mono --debug TestLastfm.exe; \
 	popd;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Makefile.in b/src/Libraries/Makefile.in
index f4b10ef..bd46504 100644
--- a/src/Libraries/Makefile.in
+++ b/src/Libraries/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -49,6 +51,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -68,6 +71,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -79,10 +83,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -144,6 +176,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -163,6 +197,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -176,29 +212,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -367,14 +384,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -392,6 +409,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -423,7 +441,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -457,16 +475,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -474,14 +492,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -493,7 +511,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -502,29 +520,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -545,29 +568,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -597,6 +635,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -616,6 +655,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -624,18 +665,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -656,8 +707,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -673,6 +724,7 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
 	uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Migo/Makefile.in b/src/Libraries/Migo/Makefile.in
index d4f8545..6a2d4eb 100644
--- a/src/Libraries/Migo/Makefile.in
+++ b/src/Libraries/Migo/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -437,6 +446,7 @@ SOURCES = \
 @ENABLE_PODCAST_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_PODCAST_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_PODCAST_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_PODCAST_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -540,11 +550,12 @@ SOURCES = \
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_PODCAST_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_PODCAST_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_PODCAST_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_PODCAST_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_PODCAST_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -562,6 +573,7 @@ SOURCES = \
 @ENABLE_PODCAST_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_PODCAST_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_PODCAST_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -592,6 +604,7 @@ SOURCES = \
 @ENABLE_PODCAST_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_PODCAST_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_PODCAST_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_PODCAST_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_PODCAST_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_PODCAST_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_PODCAST_TRUE at OUTPUT_FILES = \
@@ -612,14 +625,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Migo/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Migo/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Migo/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Migo/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -637,25 +650,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -685,13 +714,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -723,6 +756,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -745,6 +779,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -753,18 +789,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -825,7 +871,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_PODCAST_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_PODCAST_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_PODCAST_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_PODCAST_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_PODCAST_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_PODCAST_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_PODCAST_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_PODCAST_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -842,6 +888,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_PODCAST_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_PODCAST_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusChangedEventArgs.cs b/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusChangedEventArgs.cs
index f97ef6a..257a133 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusChangedEventArgs.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 using Migo.TaskCore;
@@ -35,12 +35,12 @@ namespace Migo.DownloadCore
     public class DownloadGroupStatusChangedEventArgs : GroupStatusChangedEventArgs
     {
         private readonly long bytesPerSecond;
-        
-        public long BytesPerSecond 
+
+        public long BytesPerSecond
         {
             get { return bytesPerSecond; }
         }
-        
+
         public DownloadGroupStatusChangedEventArgs (int totalTasks,
                                                     int runningTasks,
                                                     int completedTasks,
@@ -51,5 +51,5 @@ namespace Migo.DownloadCore
         {
             this.bytesPerSecond = bytesPerSecond;
         }
-    }   
+    }
 }
diff --git a/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusManager.cs b/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusManager.cs
index 76b5f34..b297bf9 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusManager.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/DownloadGroupStatusManager.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -30,42 +30,42 @@ using System;
 using System.Timers;
 using System.Collections.Generic;
 
-using Migo.TaskCore; 
+using Migo.TaskCore;
 
 namespace Migo.DownloadCore
 {
     public class DownloadGroupStatusManager : GroupStatusManager
     {
-        private long bytesPerSecond;    
-                
-        public DownloadGroupStatusManager () 
-            : this (0,0) {}    
-        
+        private long bytesPerSecond;
+
+        public DownloadGroupStatusManager ()
+            : this (0,0) {}
+
         public DownloadGroupStatusManager (int totalDownloads, int maxRunningDownloads)
             : base (totalDownloads, maxRunningDownloads) {}
-        
+
         public override void Reset ()
         {
             bytesPerSecond = 0;
             base.Reset ();
         }
-        
+
         public virtual void SetTransferRate (long bytesPerSecond)
         {
             if (this.bytesPerSecond != bytesPerSecond) {
-                this.bytesPerSecond = bytesPerSecond;   
+                this.bytesPerSecond = bytesPerSecond;
                 OnStatusChanged ();
             }
         }
-        
+
         protected override void OnStatusChanged ()
         {
             base.OnStatusChanged (
                 new DownloadGroupStatusChangedEventArgs (
-                    RemainingTasks, RunningTasks, 
+                    RemainingTasks, RunningTasks,
                     CompletedTasks, bytesPerSecond
                 ) as GroupStatusChangedEventArgs
-            );        
-        }            
+            );
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.DownloadCore/DownloadManager.cs b/src/Libraries/Migo/Migo.DownloadCore/DownloadManager.cs
index 25e24f6..30eb8ef 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/DownloadManager.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/DownloadManager.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -60,37 +60,37 @@ namespace Migo.DownloadCore
 		
         private bool disposed;
         private string tmpDir;
-        
+
         private HttpFileDownloadGroup dg;
-        private TaskList<HttpFileDownloadTask> tasks;    
-        
+        private TaskList<HttpFileDownloadTask> tasks;
+
         public HttpFileDownloadGroup Group
         {
             get {
-                return dg;   
+                return dg;
             }
         }
-        
+
         public object SyncRoot
         {
             get {
-                return tasks.SyncRoot;   
+                return tasks.SyncRoot;
             }
         }
-        
+
         public TaskList<HttpFileDownloadTask> Tasks
         {
             get {
-                return tasks;   
+                return tasks;
             }
         }
-        
+
         public DownloadManager (int maxDownloads, string tmpDownloadDir)
         {
             if (!tmpDownloadDir.EndsWith (Convert.ToString (Path.DirectorySeparatorChar))) {
                 tmpDownloadDir += Path.DirectorySeparatorChar;
             }
-            
+
             if (!Directory.Exists (tmpDownloadDir)) {
                 try {
                     Directory.CreateDirectory (tmpDownloadDir);
@@ -101,35 +101,35 @@ namespace Migo.DownloadCore
                     ));
                 }
             }
-            
+
             tmpDir = tmpDownloadDir;
             tasks = new TaskList<HttpFileDownloadTask> ();
-            
-            dg = new HttpFileDownloadGroup (maxDownloads, tasks); 
+
+            dg = new HttpFileDownloadGroup (maxDownloads, tasks);
             dg.TaskStopped += TaskStoppedHandler;
             dg.TaskAssociated += TaskAssociatedHandler;
         }
-        
-        public HttpFileDownloadTask CreateDownloadTask (string url) 
+
+        public HttpFileDownloadTask CreateDownloadTask (string url)
         {
             return CreateDownloadTask (url, null);
         }
-        
+
         public HttpFileDownloadTask CreateDownloadTask (string url, object userState)
         {
             Uri uri;
-            
+
             if (String.IsNullOrEmpty (url)) {
                 throw new ArgumentException ("Cannot be null or empty", "url");
             } else if (!Uri.TryCreate (url, UriKind.Absolute, out uri)) {
                 throw new UriFormatException ("url:  Is not a well formed Uri.");
             }
-            
-            string[] segments = uri.Segments;        
+
+            string[] segments = uri.Segments;
             string fileName = System.Web.HttpUtility.UrlDecode (segments[segments.Length-1].Trim ('/'));
-            
+
             MD5 hasher = MD5.Create ();
-            
+
             byte[] hash = hasher.ComputeHash (
                 Encoding.UTF8.GetBytes (url)
             );
@@ -137,7 +137,7 @@ namespace Migo.DownloadCore
             string urlHash = BitConverter.ToString (hash)
                                          .Replace ("-", String.Empty)
                                          .ToLower ();
-            
+
             string remoteUri = url;
             string localPath = tmpDir + urlHash + Path.DirectorySeparatorChar + Hyena.StringUtil.EscapeFilename (fileName);
 
@@ -155,18 +155,18 @@ namespace Migo.DownloadCore
         public void Dispose ()
         {
             if (SetDisposed ()) {
-                if (dg != null) {                
+                if (dg != null) {
                     dg.StopAsync ();
                     dg.Handle.WaitOne ();
 
-                    dg.TaskStopped -= TaskStoppedHandler;       
+                    dg.TaskStopped -= TaskStoppedHandler;
                     dg.Dispose ();
                 }
-                
+
                 tasks = null;
             }
         }
-                
+
         public void QueueDownload (HttpFileDownloadTask task)
         {
             if (task == null) {
@@ -177,11 +177,11 @@ namespace Migo.DownloadCore
                 if (disposed) {
                     return;
                 }
-                
+
                 tasks.Add (task);
             }
         }
-        
+
         public void QueueDownload (IEnumerable<HttpFileDownloadTask> tasks)
         {
             if (tasks == null) {
@@ -192,10 +192,10 @@ namespace Migo.DownloadCore
                 if (disposed) {
                     return;
                 }
-                
+
                 this.tasks.AddRange (tasks);
             }
-        }        
+        }
 
         public void RemoveDownload (HttpFileDownloadTask task)
         {
@@ -207,11 +207,11 @@ namespace Migo.DownloadCore
                 if (disposed) {
                     return;
                 }
-                
+
                 tasks.Remove (task);
-            }            
+            }
         }
-        
+
         public void RemoveDownload (IEnumerable<HttpFileDownloadTask> tasks)
         {
             if (tasks == null) {
@@ -222,38 +222,38 @@ namespace Migo.DownloadCore
                 if (disposed) {
                     return;
                 }
-                
+
                 this.tasks.Remove (tasks);
-            }            
-        } 
+            }
+        }
 
         private bool SetDisposed ()
         {
             bool ret = false;
-                
+
             lock (SyncRoot) {
                 if (!disposed) {
-                    ret = disposed = true;   
+                    ret = disposed = true;
                 }
             }
-                
+
             return ret;
-        }                
-        
-        private void TaskStoppedHandler (object sender, 
-                                         TaskEventArgs<HttpFileDownloadTask> e) 
+        }
+
+        private void TaskStoppedHandler (object sender,
+                                         TaskEventArgs<HttpFileDownloadTask> e)
         {
             lock (SyncRoot) {
                 if (e.Task.IsCompleted) {
                     tasks.Remove (e.Task);                	
                 }
-            }            
+            }
         }
-        
-        private void TaskAssociatedHandler (object sender, 
+
+        private void TaskAssociatedHandler (object sender,
                                             TaskEventArgs<HttpFileDownloadTask> e)
         {
             dg.Execute ();
         }
-    }   
+    }
 }
diff --git a/src/Libraries/Migo/Migo.DownloadCore/HttpDownloadTaskErrors.cs b/src/Libraries/Migo/Migo.DownloadCore/HttpDownloadTaskErrors.cs
index 16f5cc9..2eb4b70 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/HttpDownloadTaskErrors.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/HttpDownloadTaskErrors.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -30,9 +30,9 @@ namespace Migo.DownloadCore
 {
     public enum HttpFileDownloadErrors
     {
-        None = 0,   
+        None = 0,
         HttpError,
-        SharingViolation,   
+        SharingViolation,
         UnauthorizedFileAccess,
         Unknown
     }
diff --git a/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadGroup.cs b/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadGroup.cs
index 6abdc09..2bb7e8c 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadGroup.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadGroup.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Timers;  // migrate to System.Threading.Timer
 using System.Threading;
@@ -43,38 +43,38 @@ namespace Migo.DownloadCore
 	{
 	    DownloadGroupStatusManager dsm;
 
-        private DateTime lastTick;	        
+        private DateTime lastTick;	
 
         private bool disposed;
         private long transferRate;
-        private long transferRatePreviously;        
+        private long transferRatePreviously;
         private long bytesThisInterval = 0;
-        
+
         private System.Timers.Timer transferTimer;
-	 
+	
 	    private Dictionary<HttpFileDownloadTask,long> transferRateDict;
-	 
+	
         public HttpFileDownloadGroup (int maxDownloads, TaskCollection<HttpFileDownloadTask> tasks)
-            : base (maxDownloads, tasks, new DownloadGroupStatusManager ()) 
-        {   
+            : base (maxDownloads, tasks, new DownloadGroupStatusManager ())
+        {
             dsm = StatusManager as DownloadGroupStatusManager;
-            
-            transferRateDict = 
+
+            transferRateDict =
                 new Dictionary<HttpFileDownloadTask,long> (dsm.MaxRunningTasks);
-            
+
             InitTransferTimer ();
         }
-        
+
         public override void Dispose ()
         {
             Dispose (null);
         }
-        
+
         public override void Dispose (AutoResetEvent handle)
         {
-            if (SetDisposed ()) {                
+            if (SetDisposed ()) {
                 if (transferTimer != null) {
-                    transferTimer.Enabled = false;            
+                    transferTimer.Enabled = false;
                     transferTimer.Elapsed -= OnTransmissionTimerElapsedHandler;
                     transferTimer.Dispose ();
                     transferTimer = null;
@@ -83,11 +83,11 @@ namespace Migo.DownloadCore
                 base.Dispose (handle);
             }
         }
-        
+
         private bool SetDisposed ()
         {
             bool ret = false;
-            
+
             lock (SyncRoot) {
                 if (!disposed) {
                     ret = disposed = true;
@@ -95,48 +95,48 @@ namespace Migo.DownloadCore
             }
 
             return ret;
-        }        
-        
+        }
+
         protected override void OnStarted ()
         {
             lock (SyncRoot) {
                 transferTimer.Enabled = true;
                 base.OnStarted ();
             }
-        }       
-     
+        }
+
         protected override void OnStopped ()
         {
             lock (SyncRoot) {
-                transferTimer.Enabled = false;   
+                transferTimer.Enabled = false;
                 base.OnStopped ();
             }
-        }        
-        
+        }
+
         protected override void OnTaskStarted (HttpFileDownloadTask task)
         {
             lock (SyncRoot) {
                 transferRateDict.Add (task, task.BytesReceived);
                 base.OnTaskStarted (task);
             }
-        }       
-     
+        }
+
         protected override void OnTaskStopped (HttpFileDownloadTask task)
         {
             lock (SyncRoot) {
                 if (transferRateDict.ContainsKey (task)) {
                     long bytesLastCheck = transferRateDict[task];
                     if (task.BytesReceived > bytesLastCheck) {
-                        bytesThisInterval += (task.BytesReceived - bytesLastCheck);                        
+                        bytesThisInterval += (task.BytesReceived - bytesLastCheck);
                     }
-  
+
                     transferRateDict.Remove (task);                	
                 }
 
                 base.OnTaskStopped (task);
             }
-        }  
-     
+        }
+
         protected virtual void SetTransferRate (long bytesPerSecond)
         {
             lock (SyncRoot) {
@@ -147,31 +147,31 @@ namespace Migo.DownloadCore
         private void InitTransferTimer ()
         {
             transferTimer = new System.Timers.Timer ();
-                
+
             transferTimer.Elapsed += OnTransmissionTimerElapsedHandler;
             transferTimer.Interval = (1500 * 1); // 1.5 seconds
             transferTimer.Enabled = false;
-        }   
+        }
 
         private long CalculateTransferRate ()
         {
             long bytesPerSecond;
-            
+
             TimeSpan duration = (DateTime.Now - lastTick);
             double secondsElapsed = duration.TotalSeconds;
 
             if ((int)secondsElapsed == 0) {
                 return 0;
             }
-            
+
             long tmpCur;
             long tmpPrev;
-            
+
             foreach (HttpFileDownloadTask dt in CurrentTasks) {
                 tmpCur = dt.BytesReceived;
                 tmpPrev = transferRateDict[dt];
                 transferRateDict[dt] = tmpCur;
-                
+
                 bytesThisInterval += (tmpCur - tmpPrev);
             }
 
@@ -180,41 +180,41 @@ namespace Migo.DownloadCore
             );
 
 
-            lastTick = DateTime.Now;                        
-            bytesThisInterval = 0;                
-            
+            lastTick = DateTime.Now;
+            bytesThisInterval = 0;
+
             return bytesPerSecond;
-        }        
+        }
 
         protected override void Reset ()
         {
-            lastTick = DateTime.Now;	        
+            lastTick = DateTime.Now;	
 
             transferRate = -1;
-            transferRatePreviously = -1;        
-            
+            transferRatePreviously = -1;
+
             base.Reset ();
         }
 
-        protected virtual void OnTransmissionTimerElapsedHandler (object source, 
+        protected virtual void OnTransmissionTimerElapsedHandler (object source,
                                                                   ElapsedEventArgs e)
-        {           
+        {
             lock (SyncRoot) {
                 UpdateTransferRate ();
             }
         }
-        
+
         protected virtual void UpdateTransferRate ()
-        {            
+        {
             transferRate = CalculateTransferRate ();
-                        
+
             if (transferRatePreviously == 0) {
                 transferRatePreviously = transferRate;
             }
-            
+
             transferRate = ((transferRate + transferRatePreviously) / 2);
-            SetTransferRate (transferRate);       
-            transferRatePreviously = transferRate;            
+            SetTransferRate (transferRate);
+            transferRatePreviously = transferRate;
         }
 	}
 }
diff --git a/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadTask.cs b/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadTask.cs
index 236ae70..d84586c 100644
--- a/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadTask.cs
+++ b/src/Libraries/Migo/Migo.DownloadCore/HttpFileDownloadTask.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.IO;
 using System.Net;
@@ -41,164 +41,164 @@ namespace Migo.DownloadCore
 	public class HttpFileDownloadTask : Task, IDisposable
 	{
 	    // Roll these into a enum
-        private bool canceled; 
+        private bool canceled;
         private bool completed;
         private bool executing;
-        private bool paused;        
+        private bool paused;
         private bool stopped;
-        
+
 	    private bool disposed;
 
         private bool preexistingFile;
-        
-        private int modified;               
+
+        private int modified;
         private int rangeError;
-        
+
         private string mimeType;
 	    private Uri remoteUri;
 	    private string localPath;
-	    
+	
         private HttpStatusCode httpStatus;
-        private HttpFileDownloadErrors error;        
-        
-	    private AsyncWebClient wc;	    
-	    private FileStream localStream;	    
-	    
+        private HttpFileDownloadErrors error;
+
+	    private AsyncWebClient wc;	
+	    private FileStream localStream;	
+	
         private ManualResetEvent mre;
-	    
+	
 	    public virtual long BytesReceived {
 	        get {
 	            long ret = 0;
-	            
+	
 	            lock (SyncRoot) {
 	                if (wc != null) {
-                        ret =  wc.Status.BytesReceived;    
+                        ret =  wc.Status.BytesReceived;
 	                }
 	            }
-	            
+	
 	            return ret;
 	        }
 	    }
-        
+
         public HttpFileDownloadErrors Error
         {
             get { return error; }
         }
-        
-        public HttpStatusCode HttpStatusCode 
+
+        public HttpStatusCode HttpStatusCode
         {
             get { return httpStatus; }
         }
-        
-        public string LocalPath 
+
+        public string LocalPath
         {
-            get { return localPath; }   
+            get { return localPath; }
         }
-                
-        public string MimeType 
+
+        public string MimeType
         {
             get { return mimeType; }
         }
-        
+
         public Uri RemoteUri
         {
-            get { return remoteUri; }   
+            get { return remoteUri; }
         }
-        
-	    public override WaitHandle WaitHandle 
+
+	    public override WaitHandle WaitHandle
 	    {
 	        get {
 	            lock (SyncRoot) {
 	                if (mre == null) {
                         mre = new ManualResetEvent (false);
 	                }
-	                
+	
 	                return mre;
 	            }
 	        }
 	    }
-	    
-	    public HttpFileDownloadTask (string remoteUri, string localPath, object userState) 
+	
+	    public HttpFileDownloadTask (string remoteUri, string localPath, object userState)
             : base (String.Empty, userState)
 	    {
 	        this.remoteUri = new Uri (remoteUri);
-	        this.localPath = localPath;	   
+	        this.localPath = localPath;	
 	    }
-	    
-	    public HttpFileDownloadTask (string remoteUri, string localPath) 
-            : this (remoteUri, localPath, null) {}   
-        
+	
+	    public HttpFileDownloadTask (string remoteUri, string localPath)
+            : this (remoteUri, localPath, null) {}
+
         private bool SetStopped ()
         {
             bool ret = false;
-            
+
             lock (SyncRoot) {
                 if (!canceled && !stopped) {
                     ret = stopped = true;
                 }
             }
-            
+
             return ret;
-        }        
-        
+        }
+
         private bool SetCanceled ()
         {
             bool ret = false;
-            
+
             lock (SyncRoot) {
                 if (!canceled && !stopped) {
                     ret = canceled = true;
                 }
             }
-            
+
             return ret;
-        }                
-        
+        }
+
         private bool SetCompleted ()
         {
-            bool ret = false;            
-            
+            bool ret = false;
+
             lock (SyncRoot) {
                 if (!completed) {
                     ret = completed = true;
-                } 
+                }
             }
-            
+
             return ret;
         }
-        
+
         protected bool SetExecuting ()
         {
             bool ret = false;
-            
+
             lock (SyncRoot) {
                 // SRSLY?  WTF!  Use an enum!
                 if (!(canceled || executing || completed || paused || stopped)) {
                     ret = executing = true;
-                    
+
                     if (mre != null) {
                         mre.Reset ();
                     }
                 }
             }
-            
+
             return ret;
         }
-        
+
         public override void CancelAsync ()
-	    { 
-            //Console.WriteLine ("CancelAsync ():  {0} - {1}", remoteUri.ToString (), Status);                
+	    {
+            //Console.WriteLine ("CancelAsync ():  {0} - {1}", remoteUri.ToString (), Status);
+
+            bool cancelLive = false;
 
-            bool cancelLive = false;                
-            
             lock (SyncRoot) {
                 if (executing) {
                     cancelLive = true;
                 }
-                    
+
                 if (SetCanceled ()) {
                     if (cancelLive) {
-                        wc.CancelAsync ();  
+                        wc.CancelAsync ();
                     } else {
                         if (SetCompleted ()) {
                             CloseLocalStream (true);
@@ -206,39 +206,39 @@ namespace Migo.DownloadCore
                             OnTaskCompleted (null, true);
                         }
                     }
-                }                
+                }
             }
 	    }
-    
+
         public void Dispose ()
         {
             lock (SyncRoot) {
                 if (!disposed) {
                     if (mre != null) {
                         mre.Close ();
-                        mre = null;                    
-                    } 
-                    
+                        mre = null;
+                    }
+
                     disposed = true;
-                }   
+                }
             }
         }
 
 	    public override void ExecuteAsync ()
 	    {
-            if (SetExecuting ()) {                            	        
-                lock (SyncRoot) {                
+            if (SetExecuting ()) {                            	
+                lock (SyncRoot) {
                     SetStatus (TaskStatus.Running);
                     ExecuteImpl ();
                 }
             }
 	    }
-	    
+	
         private void ExecuteImpl ()
         {
-            Exception err = null;     
+            Exception err = null;
             bool fileOpenError = false;
-            
+
             try {
                 OpenLocalStream ();
             } catch (UnauthorizedAccessException e) {
@@ -249,13 +249,13 @@ namespace Migo.DownloadCore
                 error = HttpFileDownloadErrors.SharingViolation; // Probably
             } catch (Exception e) {
                 err = e;
-                error = HttpFileDownloadErrors.Unknown;                
-            }   
-            
+                error = HttpFileDownloadErrors.Unknown;
+            }
+
             if (error != HttpFileDownloadErrors.None) {
                 fileOpenError = true;   	
-            }            
-            
+            }
+
             if (err == null) {
                 try {
                     InitWebClient ();
@@ -264,66 +264,66 @@ namespace Migo.DownloadCore
                     err = e;
                 }
             }
-                
+
             if (err != null) {
-                //Console.WriteLine ("DT:  {0}", err.Message);                
-                
+                //Console.WriteLine ("DT:  {0}", err.Message);
+
                 if (!fileOpenError) {
                     CloseLocalStream (true);
                 }
-    
+
                 DestroyWebClient ();
-                
+
                 SetStatus (TaskStatus.Failed);
                 OnTaskCompleted (err, false);
             }
         }
-	    
+	
 	    public override void Pause ()
 	    {
             lock (SyncRoot) {	
-                //Console.WriteLine ("Pause ():  {0} - {1}", remoteUri.ToString (), Status);                                
+                //Console.WriteLine ("Pause ():  {0} - {1}", remoteUri.ToString (), Status);
                 if (!IsCompleted && !paused) {
                     paused = true;
-                    
+
                     if (Status == TaskStatus.Running) {
-                        wc.CancelAsync ();                
+                        wc.CancelAsync ();
                     } else {
                         SetStatus (TaskStatus.Paused);
                     }
                 }
             }
 	    }
-	    
+	
 	    public override void Resume ()
 	    {
             lock (SyncRoot) {
-                //Console.WriteLine ("Resume ():  {0} - {1}", remoteUri.ToString (), Status);                                
+                //Console.WriteLine ("Resume ():  {0} - {1}", remoteUri.ToString (), Status);
                 if (Status == TaskStatus.Paused) {
                     paused = false;
                     SetStatus (TaskStatus.Ready);
                 }
             }
-	    }	    
-	    
+	    }	
+	
         public override void Stop ()
         {
-            //Console.WriteLine ("Stop ():  {0} - {1}", remoteUri.ToString (), Status);                
-                
-            bool stopLive = false;                
+            //Console.WriteLine ("Stop ():  {0} - {1}", remoteUri.ToString (), Status);
+
+            bool stopLive = false;
             TaskStatus oldStatus = TaskStatus.Ready;
-            
-            lock (SyncRoot) {                
+
+            lock (SyncRoot) {
                 if (executing) {
                     stopLive = true;
                 } else {
                     oldStatus = Status;
                     SetStatus (TaskStatus.Stopped, false);
                 }
-                
-                if (SetStopped ()) {                
+
+                if (SetStopped ()) {
                     if (stopLive) {
-                        wc.CancelAsync ();                
+                        wc.CancelAsync ();
                     } else {
                         if (SetCompleted ()) {
                             CloseLocalStream (false);
@@ -331,53 +331,53 @@ namespace Migo.DownloadCore
                             OnTaskCompleted (null, false);
                         }
                     }
-                }                   
+                }
             }
         }
-        
+
 	    private void InitWebClient ()
 	    {
             wc = new AsyncWebClient ();
-            
+
             if (localStream.Length > 0) {
                 wc.Range = Convert.ToInt32 (localStream.Length);
                 //Console.WriteLine ("Adding Range:  {0}", wc.Range);
             }
-            
+
 	        wc.Timeout = (60 * 1000);
 	        wc.DownloadFileCompleted += OnDownloadFileCompletedHandler;
 	        wc.DownloadProgressChanged += OnDownloadProgressChangedHandler;
-	        wc.ResponseReceived += OnResponseReceivedHandler;	        
+	        wc.ResponseReceived += OnResponseReceivedHandler;	
 	    }
-	    
+	
 	    private void DestroyWebClient ()
 	    {
             if (wc != null) {
                 wc.DownloadFileCompleted -= OnDownloadFileCompletedHandler;
                 wc.DownloadProgressChanged -= OnDownloadProgressChangedHandler;
                 wc.ResponseReceived -= OnResponseReceivedHandler;
-                wc = null;        	        
-            }            	    
-	    }        
-        
-        private void OpenLocalStream () 
+                wc = null;        	
+            }            	
+	    }
+
+        private void OpenLocalStream ()
         {
             if (File.Exists (localPath)) {
                 localStream = File.Open (
-                    localPath, FileMode.Append, 
+                    localPath, FileMode.Append,
                     FileAccess.Write, FileShare.None
-                );               
-                
+                );
+
                 preexistingFile = true;
             } else {
                 preexistingFile = false;
-                
+
                 if (!Directory.Exists (Path.GetDirectoryName (localPath))) {
                     Directory.CreateDirectory (Path.GetDirectoryName (localPath));
                 }
-            
+
                 localStream = File.Open (
-                    localPath, FileMode.OpenOrCreate, 
+                    localPath, FileMode.OpenOrCreate,
                     FileAccess.Write, FileShare.None
                 );
             }
@@ -388,16 +388,16 @@ namespace Migo.DownloadCore
             try {
                 if (localStream != null) {
                     localStream.Close ();
-                    localStream = null;                    
+                    localStream = null;
                 }
             } catch {}
-            
+
             if (removeFile) {
                 RemoveFile ();
             }
         }
 
-        private void RemoveFile () 
+        private void RemoveFile ()
         {
             if (File.Exists (localPath)) {
                 try {
@@ -406,58 +406,58 @@ namespace Migo.DownloadCore
                     Directory.Delete (Path.GetDirectoryName (localPath));
                 } catch {}
             }
-        }        
+        }
 
-	    private void OnDownloadFileCompletedHandler (object sender, 
+	    private void OnDownloadFileCompletedHandler (object sender,
 	                                                 AsyncCompletedEventArgs e)
 	    {
             bool retry = false;
-            
+
             lock (SyncRoot) {
                 executing = false;
-                TaskStatus newStatus = Status;               	            
-	            
-                try {                        
+                TaskStatus newStatus = Status;               	
+	
+                try {
                     if (e.Error != null) {
                         Hyena.Log.WarningFormat ("HttpDownloadTask {0} Error: {1}", this.Name, e.Error);
                         WebException we = e.Error as WebException;
-                        
+
                         if (we != null) {
                             if(we.Status == WebExceptionStatus.ProtocolError) {
-                                HttpWebResponse resp = we.Response as HttpWebResponse;                                                          
-                                
+                                HttpWebResponse resp = we.Response as HttpWebResponse;
+
                                 if (resp != null) {
                                     httpStatus = resp.StatusCode;
 
                                     // This is going to get triggered if the file on disk is complete.
-                                    // Maybe request range-1 and see if a content length of 0 is returned.                                        
-                                    if (resp.StatusCode == 
-                                        HttpStatusCode.RequestedRangeNotSatisfiable) { 
-                                        
+                                    // Maybe request range-1 and see if a content length of 0 is returned.
+                                    if (resp.StatusCode ==
+                                        HttpStatusCode.RequestedRangeNotSatisfiable) {
+
                                         if (rangeError++ == 0) {
-                                            retry = true;                                               
+                                            retry = true;
                                         }
                                     }
                                 }
                             }
                         }
-                        
+
                         if (!retry) {
-                            error = HttpFileDownloadErrors.HttpError;                            
+                            error = HttpFileDownloadErrors.HttpError;
                             newStatus = TaskStatus.Failed;
                         }
                     } else if (modified > 0) {
                         if (modified == 1) {
-                            retry = true;                                
+                            retry = true;
                         } else {
-                            newStatus = TaskStatus.Failed;                                                            
+                            newStatus = TaskStatus.Failed;
                         }
                     } else if (canceled) {
                         newStatus = TaskStatus.Cancelled;
                     } else if (paused) {
                         newStatus = TaskStatus.Paused;
                     } else if (stopped) {
-                        newStatus = TaskStatus.Stopped;                            
+                        newStatus = TaskStatus.Stopped;
                     } else {
                         newStatus = TaskStatus.Succeeded;
                     }
@@ -467,59 +467,59 @@ namespace Migo.DownloadCore
                     if (retry) {
                         CloseLocalStream (true);
                         DestroyWebClient ();
-                        ExecuteImpl ();                    
+                        ExecuteImpl ();
                     } else if (SetCompleted ()) {
                         switch (newStatus) {
-                        case TaskStatus.Cancelled: goto case TaskStatus.Failed;    
+                        case TaskStatus.Cancelled: goto case TaskStatus.Failed;
                         case TaskStatus.Failed:
                             CloseLocalStream (true);
-                            break;                            
-                        case TaskStatus.Paused: 
-                            completed = false;                            
-                            goto case TaskStatus.Succeeded;  
+                            break;
+                        case TaskStatus.Paused:
+                            completed = false;
+                            goto case TaskStatus.Succeeded;
                         case TaskStatus.Stopped: goto case TaskStatus.Succeeded;
                         case TaskStatus.Succeeded:
                             CloseLocalStream (false);
                             break;
                         default:  goto case TaskStatus.Succeeded;
                         }
-                        
+
                         DestroyWebClient ();
-                        
+
                         SetStatus (newStatus);
                         OnTaskCompleted (e.Error, canceled);
 
                         if (mre != null) {
-                            mre.Set ();   
+                            mre.Set ();
                         }
-                    }                    
+                    }
                 }
 	        }
 	    }
 
-	    private void OnDownloadProgressChangedHandler (object sender, 
+	    private void OnDownloadProgressChangedHandler (object sender,
 	                                                   MN.DownloadProgressChangedEventArgs e)
 	    {
             lock (SyncRoot) {
                 if (e.ProgressPercentage != 0) {
-                    SetProgress (e.ProgressPercentage);                    
+                    SetProgress (e.ProgressPercentage);
                 }
 	        }
-	    }	    
-	    
+	    }	
+	
         private void OnResponseReceivedHandler (object sender, EventArgs e)
         {
             lock (SyncRoot) {
                 if (wc != null && wc.ResponseHeaders != null) {
                     mimeType = wc.ResponseHeaders.Get ("Content-Type");
-                    
-                    httpStatus = wc.Response.StatusCode;                        
 
-                    if (preexistingFile && 
+                    httpStatus = wc.Response.StatusCode;
+
+                    if (preexistingFile &&
                         wc.Response.LastModified.ToUniversalTime () >
                         File.GetLastWriteTimeUtc (localPath)) {
                         ++modified;
-                        
+
                         wc.CancelAsync ();
                     }
                 }
diff --git a/src/Libraries/Migo/Migo.Net/AsyncWebClient.cs b/src/Libraries/Migo/Migo.Net/AsyncWebClient.cs
index 66b2c81..686397e 100644
--- a/src/Libraries/Migo/Migo.Net/AsyncWebClient.cs
+++ b/src/Libraries/Migo/Migo.Net/AsyncWebClient.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  AsyncWebClient.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -39,61 +39,61 @@ namespace Migo.Net
     enum DownloadType
     {
         None = 0,
-        Data = 1,    
+        Data = 1,
         File = 2,
         String = 3
     };
 
     public sealed class AsyncWebClient
-    {            
+    {
         private int range = 0;
         private int timeout = (120 * 1000); // 2 minutes
         private DateTime ifModifiedSince = DateTime.MinValue;
-        private static Regex encoding_regexp = new Regex (@"encoding=[""']([^""']+)[""']", 
+        private static Regex encoding_regexp = new Regex (@"encoding=[""']([^""']+)[""']",
                                                     RegexOptions.Compiled | RegexOptions.IgnoreCase);
-        
+
         private string fileName;
 
         private Exception error;
-        
+
         private Uri uri;
         private object userState;
         private DownloadType type;
-        
+
         private IWebProxy proxy;
         private string user_agent;
-        private Encoding encoding;                        
+        private Encoding encoding;
         private ICredentials credentials;
 
         private HttpWebRequest request;
         private HttpWebResponse response;
-        
+
         private WebHeaderCollection headers;
         private WebHeaderCollection responseHeaders;
-        
+
         private byte[] result;
         private Stream localFile;
-        private MemoryStream memoryStream;        
-        
+        private MemoryStream memoryStream;
+
         private TransferStatusManager tsm;
-        
+
         private AutoResetEvent readTimeoutHandle;
         private RegisteredWaitHandle registeredTimeoutHandle;
-        
+
         private bool busy;
         private bool completed;
         private bool cancelled;
-       
+
         private readonly object cancelBusySync = new object ();
-        
-        public event EventHandler<EventArgs> ResponseReceived;        
+
+        public event EventHandler<EventArgs> ResponseReceived;
         public event EventHandler<DownloadProgressChangedEventArgs> DownloadProgressChanged;
         public event EventHandler<TransferRateUpdatedEventArgs> TransferRateUpdated;
-            
-        public event EventHandler<AsyncCompletedEventArgs> DownloadFileCompleted;        
+
+        public event EventHandler<AsyncCompletedEventArgs> DownloadFileCompleted;
         public event EventHandler<DownloadDataCompletedEventArgs> DownloadDataCompleted;
-        public event EventHandler<DownloadStringCompletedEventArgs> DownloadStringCompleted;               
-                
+        public event EventHandler<DownloadStringCompletedEventArgs> DownloadStringCompleted;
+
         public ICredentials Credentials {
             get { return credentials; }
             set { credentials = value; }
@@ -101,7 +101,7 @@ namespace Migo.Net
 
         public Encoding Encoding {
             get { return encoding; }
-            
+
             set {
                 if (value == null) {
                     throw new ArgumentNullException ("encoding");
@@ -113,7 +113,7 @@ namespace Migo.Net
 
         public WebHeaderCollection Headers {
             get { return headers; }
-            
+
             set {
                 if (value == null) {
                     headers = new WebHeaderCollection ();
@@ -126,7 +126,7 @@ namespace Migo.Net
         public DateTime IfModifiedSince {
             get { return ifModifiedSince; }
             set { ifModifiedSince = value; }
-        }   
+        }
 
         public bool IsBusy {
             get {
@@ -135,15 +135,15 @@ namespace Migo.Net
                 }
             }
         }
-        
+
         public IWebProxy Proxy {
             get { return proxy; }
             set { proxy = value; }
         }
-        
+
         public int Range {
             get { return range; }
-            set { 
+            set {
                 if (range > -1) {
                     range = value;
                 } else {
@@ -151,32 +151,32 @@ namespace Migo.Net
                 }
             }
         }
-        
+
         public HttpWebResponse Response {
             get { return response; }
         }
-        
+
         public WebHeaderCollection ResponseHeaders {
             get { return responseHeaders; }
         }
 
-        public AsyncWebClientStatus Status {            
+        public AsyncWebClientStatus Status {
             get {
                 if (type == DownloadType.String) {
                     throw new InvalidOperationException (
                         "Status cannot be reported for string downloads"
                     );
                 }
-                
+
                 lock (tsm.SyncRoot) {
                     return new AsyncWebClientStatus (
-                        tsm.Progress, tsm.BytesReceived, 
+                        tsm.Progress, tsm.BytesReceived,
                         tsm.TotalBytes, tsm.TotalBytesReceived
                     );
                 }
             }
         }
-        
+
         public int Timeout {
             get { return timeout; }
             set {
@@ -185,26 +185,26 @@ namespace Migo.Net
                         "Value must be greater than or equal to -1"
                     );
                 }
-                
+
                 timeout = value;
             }
         }
-        
+
         private static string default_user_agent;
         public static string DefaultUserAgent {
             get { return default_user_agent; }
             set { default_user_agent = value; }
         }
-        
+
         public string UserAgent {
             get { return user_agent ?? DefaultUserAgent; }
             set { user_agent = value; }
         }
-                
+
         private bool Cancelled {
             get {
                 lock (cancelBusySync) {
-                    return cancelled; 
+                    return cancelled;
                 }
             }
         }
@@ -215,89 +215,89 @@ namespace Migo.Net
             tsm = new TransferStatusManager ();
             tsm.ProgressChanged += OnDownloadProgressChangedHandler;
         }
-            
+
         public void DownloadDataAsync (Uri address)
         {
             DownloadDataAsync (address, null);
         }
-        
+
         public void DownloadDataAsync (Uri address, object userState)
-        {            
+        {
             if (address == null) {
                 throw new ArgumentNullException ("address");
-            }            
-            
+            }
+
             SetBusy ();
             DownloadAsync (address, DownloadType.Data, userState);
         }
-        
+
         public void DownloadFileAsync (Uri address, string fileName)
         {
             DownloadFileAsync (address, fileName, null, null);
         }
-        
+
         public void DownloadFileAsync (Uri address, Stream file)
         {
             DownloadFileAsync (address, null, file, null);
         }
-        
+
         public void DownloadFileAsync (Uri address, string file, object userState)
         {
             DownloadFileAsync (address, file, null, userState);
         }
-        
+
         public void DownloadFileAsync (Uri address, Stream file, object userState)
         {
             DownloadFileAsync (address, null, file, userState);
         }
-        
-        private void DownloadFileAsync (Uri address, 
-                                        string filePath, 
-                                        Stream fileStream, 
+
+        private void DownloadFileAsync (Uri address,
+                                        string filePath,
+                                        Stream fileStream,
                                         object userState)
         {
-            if (String.IsNullOrEmpty (filePath) && 
+            if (String.IsNullOrEmpty (filePath) &&
                 fileStream == null || fileStream == Stream.Null) {
                 throw new ArgumentNullException ("file");
             } else if (address == null) {
                 throw new ArgumentNullException ("address");
             } else if (fileStream != null) {
                 if (!fileStream.CanWrite) {
-                    throw new ArgumentException ("Cannot write to stream");   
+                    throw new ArgumentException ("Cannot write to stream");
                 } else {
                     localFile = fileStream;
                 }
             } else {
                 this.fileName = filePath;
             }
-            
+
             SetBusy ();
             DownloadAsync (address, DownloadType.File, userState);
         }
-        
+
         public void DownloadStringAsync (Uri address)
         {
             DownloadStringAsync (address, null);
         }
-         
+
         public void DownloadStringAsync (Uri address, object userState)
         {
             if (address == null) {
                 throw new ArgumentNullException ("address");
             }
-            
+
             SetBusy ();
             DownloadAsync (address, DownloadType.String, userState);
         }
-                
+
         public void CancelAsync ()
         {
             CancelAsync (true);
         }
-        
+
         public void CancelAsync (bool deleteFile)
         {
-            if (SetCancelled ()) {  
+            if (SetCancelled ()) {
                 AbortDownload ();
             }
         }
@@ -306,14 +306,14 @@ namespace Migo.Net
         {
             AbortDownload (null);
         }
-        
+
         private void AbortDownload (Exception e)
         {
             error = e;
-            
+
             try {
-                HttpWebRequest req = request;                
-                
+                HttpWebRequest req = request;
+
                 if (req != null) {
                     req.Abort();
                 }
@@ -326,19 +326,19 @@ namespace Migo.Net
         {
             Completed (null);
         }
-        
+
         private void Completed (Exception e)
         {
             Exception err = (SetCompleted ()) ? e : error;
-            
+
             object statePtr = userState;
             byte[] resultPtr = result;
             bool cancelledCpy = Cancelled;
 
             CleanUp ();
-                             
+
             DownloadCompleted (resultPtr, err, cancelledCpy, statePtr);
-            
+
             Reset ();
         }
 
@@ -348,40 +348,40 @@ namespace Migo.Net
                 localFile.Close ();
                 localFile = null;
             }
-            
+
             if (memoryStream != null) {
                 memoryStream.Close ();
                 memoryStream = null;
             }
-            
+
             if (response != null) {
                 response.Close ();
                 response = null;
             }
-            
+
             result = null;
             request = null;
-            
+
             CleanUpHandles ();
         }
-        
+
         private void CleanUpHandles ()
         {
             if (registeredTimeoutHandle != null) {
                 registeredTimeoutHandle.Unregister (readTimeoutHandle);
                 readTimeoutHandle = null;
             }
-            
+
             if (readTimeoutHandle != null) {
                 readTimeoutHandle.Close ();
                 readTimeoutHandle = null;
             }
         }
 
-        private bool SetBusy () 
+        private bool SetBusy ()
         {
             bool ret = false;
-            
+
             lock (cancelBusySync) {
                 if (busy) {
                     throw new InvalidOperationException (
@@ -391,46 +391,46 @@ namespace Migo.Net
                     ret = busy = true;
                 }
             }
-            
+
             return ret;
         }
 
         private bool SetCancelled ()
         {
             bool ret = false;
-            
+
             lock (cancelBusySync) {
                 if (busy && !completed && !cancelled) {
                     ret = cancelled = true;
                 }
             }
-            
+
             return ret;
         }
-        
+
         private bool SetCompleted ()
         {
             bool ret = false;
-            
+
             lock (cancelBusySync) {
                 if (busy && !completed && !cancelled) {
                     ret = completed = true;
                 }
             }
-            
+
             return ret;
         }
 
         private void DownloadAsync (Uri uri, DownloadType type, object state)
-        {            
+        {
             this.uri = uri;
-            this.type = type;                        
+            this.type = type;
             this.userState = state;
-            
+
             ImplDownloadAsync ();
         }
-        
-        private void ImplDownloadAsync () 
+
+        private void ImplDownloadAsync ()
         {
             try {
                 tsm.Reset ();
@@ -439,9 +439,9 @@ namespace Migo.Net
                 IAsyncResult ar = request.BeginGetResponse (
                     OnResponseCallback, null
                 );
-                       
+
                 ThreadPool.RegisterWaitForSingleObject (
-                    ar.AsyncWaitHandle, 
+                    ar.AsyncWaitHandle,
                     new WaitOrTimerCallback (OnTimeout),
                     request, timeout, true
                 );
@@ -449,15 +449,15 @@ namespace Migo.Net
                 Completed (e);
             }
         }
-            
+
         private HttpWebRequest PrepRequest (Uri address)
         {
-            responseHeaders = null;        
+            responseHeaders = null;
             HttpWebRequest req = HttpWebRequest.Create (address) as HttpWebRequest;
-            
+
             req.AllowAutoRedirect = true;
             req.Credentials = credentials;
-            
+
             if (proxy != null) {
                 req.Proxy = proxy;
             }
@@ -472,26 +472,26 @@ namespace Migo.Net
                 string referer = headers ["Referer"];
                 string rangeStr = headers ["Range"];
                 string ifModifiedSince = headers ["If-Modified-Since"];
-                
+
                 if (!String.IsNullOrEmpty (rangeStr)) {
                     Int32.TryParse (rangeStr, out rangeHdr);
                 }
-                
+
                 headers.Remove ("Expect");
                 headers.Remove ("Content-Type");
                 headers.Remove ("Accept");
                 headers.Remove ("Connection");
                 headers.Remove ("Referer");
                 headers.Remove ("User-Agent");
-                headers.Remove ("Range");                
-                headers.Remove ("If-Modified-Since");                
-                
+                headers.Remove ("Range");
+                headers.Remove ("If-Modified-Since");
+
                 req.Headers = headers;
 
                 if (!String.IsNullOrEmpty (expect)) {
                     req.Expect = expect;
                 }
-                
+
                 if (!String.IsNullOrEmpty (accept)) {
                     req.Accept = accept;
                 }
@@ -515,10 +515,10 @@ namespace Migo.Net
                 if (rangeHdr > 0) {
                     req.AddRange (range);
                 }
-                
+
                 if (!String.IsNullOrEmpty (ifModifiedSince)) {
                     DateTime modDate;
-                    
+
                     if (DateTime.TryParse (ifModifiedSince, out modDate)) {
                         req.IfModifiedSince = modDate;
                     }
@@ -536,17 +536,17 @@ namespace Migo.Net
                     req.IfModifiedSince = this.ifModifiedSince;
                 }
             }
-            
-            responseHeaders = null;                       
-            
+
+            responseHeaders = null;
+
             return req;
         }
-        
+
         private void OnResponseCallback (IAsyncResult ar)
-        {    
+        {
             Exception err = null;
             bool redirect_workaround = false;
-            
+
             try {
                 response = request.EndGetResponse (ar) as HttpWebResponse;
 
@@ -557,7 +557,7 @@ namespace Migo.Net
             } catch (WebException we) {
                 if (we.Status != WebExceptionStatus.RequestCanceled) {
                     err = we;
-                    
+
                     HttpWebResponse response = we.Response as HttpWebResponse;
                     if (response != null && response.StatusCode == HttpStatusCode.BadRequest && response.ResponseUri != request.RequestUri) {
                         Hyena.Log.DebugFormat ("Identified Content-Length: 0 redirection bug for {0}; trying to get {1} directly", request.RequestUri, response.ResponseUri);
@@ -584,30 +584,30 @@ namespace Migo.Net
             if (cLength == 0) {
                 return;
             }
-            
+
             int nread = -1;
             int offset = 0;
-            
-            int length = (cLength == -1 || cLength > 8192) ? 8192 : (int) cLength;            
-            
+
+            int length = (cLength == -1 || cLength > 8192) ? 8192 : (int) cLength;
+
             Stream dest = null;
             readTimeoutHandle = new AutoResetEvent (false);
-            
+
             byte[] buffer = null;
-            
+
             bool dataDownload = false;
             bool writeToStream = false;
-            
+
             if (type != DownloadType.String) {
                 tsm.TotalBytes = cLength;
                 tsm.BytesReceivedPreviously = range;
             }
-            
+
             switch (type) {
                 case DownloadType.String:
                 case DownloadType.Data:
                     dataDownload = true;
-                    
+
                     if (cLength != -1) {
                         length = (int) cLength;
                         buffer = new byte[cLength];
@@ -618,36 +618,36 @@ namespace Migo.Net
                     }
                     break;
                 case DownloadType.File:
-                    writeToStream = true;          
+                    writeToStream = true;
                     buffer = new byte [length];
                     if (localFile == null) {
                         dest = OpenLocalFile (fileName);
                     } else {
                         dest = localFile;
                     }
-                    
+
                     break;
             }
 
             registeredTimeoutHandle = ThreadPool.RegisterWaitForSingleObject (
                 readTimeoutHandle, new WaitOrTimerCallback (OnTimeout), null, timeout, false
             );
-            
+
             IAsyncResult ar;
 
             while (nread != 0) {
-                // <hack> 
-                // Yeah, Yeah, Yeah, I'll change this later, 
+                // <hack>
+                // Yeah, Yeah, Yeah, I'll change this later,
                 // it's here to get around abort issues.
-                
+
                 ar = st.BeginRead (buffer, offset, length, null, null);
                 nread = st.EndRead (ar);
-                
-                // need an auxiliary downloader class to replace this. 
+
+                // need an auxiliary downloader class to replace this.
                 // </hack>
-                
+
                 readTimeoutHandle.Set ();
-                
+
                 if (writeToStream) {
                     dest.Write (buffer, 0, nread);
                 } else {
@@ -659,15 +659,15 @@ namespace Migo.Net
                     tsm.AddBytes (nread);
                 }
             }
-            
+
             CleanUpHandles ();
-            
+
             if (type != DownloadType.String) {
                 if (tsm.TotalBytes == -1) {
                     tsm.TotalBytes = tsm.BytesReceived;
                 }
             }
-            
+
             if (dataDownload) {
                 if (writeToStream) {
                     result = memoryStream.ToArray ();
@@ -676,24 +676,24 @@ namespace Migo.Net
                 }
             }
         }
-    
+
         private Stream OpenLocalFile (string filePath)
         {
             return File.Open (
-                filePath, FileMode.OpenOrCreate, 
+                filePath, FileMode.OpenOrCreate,
                 FileAccess.Write, FileShare.None
             );
         }
-        
+
         private MemoryStream OpenMemoryStream ()
         {
             return memoryStream = new MemoryStream ();
         }
-        
+
         private void Reset ()
         {
             lock (cancelBusySync) {
-                busy = false;          
+                busy = false;
                 cancelled = false;
                 completed = false;
                 error = null;
@@ -705,10 +705,10 @@ namespace Migo.Net
                 userState = null;
             }
         }
-        
-        private void DownloadCompleted (byte[] resultPtr, 
-                                        Exception errPtr, 
-                                        bool cancelledCpy, 
+
+        private void DownloadCompleted (byte[] resultPtr,
+                                        Exception errPtr,
+                                        bool cancelledCpy,
                                         object userStatePtr)
         {
             switch (type) {
@@ -726,7 +726,7 @@ namespace Migo.Net
                     if (resultPtr != null) {
                         try {
                             s = Encoding.GetString (resultPtr).TrimStart ();
-        
+
                             // Workaround if the string is a XML to set the encoding from it
                             if (s.StartsWith("<?xml")) {
                                 Match match = encoding_regexp.Match (s);
@@ -745,7 +745,7 @@ namespace Migo.Net
                             s = String.Empty;
                         }
                     }
-                
+
                     OnDownloadStringCompleted (
                         s ?? "", errPtr, cancelledCpy, userStatePtr
                     );
@@ -753,13 +753,13 @@ namespace Migo.Net
             }
         }
 
-        private void OnTimeout (object state, bool timedOut) 
+        private void OnTimeout (object state, bool timedOut)
         {
             if (timedOut) {
                 if (SetCompleted ()) {
                     try {
                         AbortDownload (new WebException (
-                            "The operation timed out", null, 
+                            "The operation timed out", null,
                             WebExceptionStatus.Timeout, response
                         ));
                     } finally {
@@ -772,20 +772,20 @@ namespace Migo.Net
         private void OnResponseReceived ()
         {
             EventHandler<EventArgs> handler = ResponseReceived;
-            
+
             if (handler != null) {
                 handler (this, new EventArgs ());
             }
         }
-       
-        private void OnDownloadProgressChanged (long bytesReceived, 
+
+        private void OnDownloadProgressChanged (long bytesReceived,
                                                 long BytesToReceive,
-                                                int progressPercentage, 
+                                                int progressPercentage,
                                                 object userState)
         {
             OnDownloadProgressChanged (
                 new DownloadProgressChangedEventArgs (
-                    progressPercentage, userState, 
+                    progressPercentage, userState,
                     bytesReceived, BytesToReceive
                 )
             );
@@ -793,15 +793,15 @@ namespace Migo.Net
 
         private void OnDownloadProgressChanged (DownloadProgressChangedEventArgs args)
         {
-            EventHandler <DownloadProgressChangedEventArgs> 
+            EventHandler <DownloadProgressChangedEventArgs>
                 handler = DownloadProgressChanged;
-        
+
             if (handler != null) {
                 handler (this, args);
             }
         }
 
-        private void OnDownloadProgressChangedHandler (object sender, 
+        private void OnDownloadProgressChangedHandler (object sender,
                                                        DownloadProgressChangedEventArgs e)
         {
             OnDownloadProgressChanged (
@@ -826,14 +826,14 @@ namespace Migo.Net
 
         private void OnDownloadDataCompleted (DownloadDataCompletedEventArgs args)
         {
-            EventHandler <DownloadDataCompletedEventArgs> 
+            EventHandler <DownloadDataCompletedEventArgs>
                 handler = DownloadDataCompleted;
 
             if (handler != null) {
                 handler (this, args);
             }
         }
-        
+
         private void OnDownloadFileCompleted (Exception error,
                                               bool cancelled,
                                               object userState)
@@ -845,14 +845,14 @@ namespace Migo.Net
 
         private void OnDownloadFileCompleted (AsyncCompletedEventArgs args)
         {
-            EventHandler <AsyncCompletedEventArgs> 
+            EventHandler <AsyncCompletedEventArgs>
                 handler = DownloadFileCompleted;
-        
+
             if (handler != null) {
                 handler (this, args);
             }
         }
-        
+
         private void OnDownloadStringCompleted (string resultStr,
                                                 Exception error,
                                                 bool cancelled,
@@ -867,9 +867,9 @@ namespace Migo.Net
 
         private void OnDownloadStringCompleted (DownloadStringCompletedEventArgs args)
         {
-            EventHandler <DownloadStringCompletedEventArgs> 
+            EventHandler <DownloadStringCompletedEventArgs>
                 handler = DownloadStringCompleted;
-                         
+
             if (handler != null) {
                 handler (this, args);
             }
diff --git a/src/Libraries/Migo/Migo.Net/AsyncWebClientStatus.cs b/src/Libraries/Migo/Migo.Net/AsyncWebClientStatus.cs
index 18b8de7..7b2b821 100644
--- a/src/Libraries/Migo/Migo.Net/AsyncWebClientStatus.cs
+++ b/src/Libraries/Migo/Migo.Net/AsyncWebClientStatus.cs
@@ -1,45 +1,45 @@
-/*************************************************************************** 
+/***************************************************************************
  *  AsyncWebClientStatus.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 namespace Migo.Net
 {
     public struct AsyncWebClientStatus
-    {        
-        private readonly long bytesReceived;    
+    {
+        private readonly long bytesReceived;
         private readonly int progress;
-        private readonly long totalBytes;        
+        private readonly long totalBytes;
         private readonly long totalBytesReceived;
-        
+
         public long BytesReceived
         {
             get { return bytesReceived; }
         }
-        
+
         public int Progress
         {
             get { return progress; }
@@ -53,18 +53,18 @@ namespace Migo.Net
         public long TotalBytesReceived
         {
             get { return totalBytesReceived; }
-        }        
-        
+        }
+
         public AsyncWebClientStatus (int progress,
                                      long bytesReceived,
-                                     long totalBytes,                                     
+                                     long totalBytes,
                                      long totalBytesReceived)
         {
-            this.progress = progress;        
-            this.bytesReceived = bytesReceived;        
+            this.progress = progress;
+            this.bytesReceived = bytesReceived;
             this.totalBytes = totalBytes;
             this.totalBytesReceived = totalBytesReceived;
         }
     }
 }
- 
+
diff --git a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadDataCompletedEventArgs.cs b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadDataCompletedEventArgs.cs
index fc43343..18bc0be 100644
--- a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadDataCompletedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadDataCompletedEventArgs.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  DownloadDataCompletedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -36,15 +36,15 @@ namespace Migo.Net
         private readonly byte[] result;
 
         public byte[] Result {
-            get { 
+            get {
                 RaiseExceptionIfNecessary ();
                 return result;
             }
-        }        
-        
-        internal DownloadDataCompletedEventArgs (byte[] result, 
+        }
+
+        internal DownloadDataCompletedEventArgs (byte[] result,
                                                  Exception error,
-                                                 bool cancelled, 
+                                                 bool cancelled,
                                                  object userState
                                                  ): base (error, cancelled, userState)
         {
diff --git a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadProgressChangedEventArgs.cs b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadProgressChangedEventArgs.cs
index 615b249..38deed9 100644
--- a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadProgressChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadProgressChangedEventArgs.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  DownloadProgressChangedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -35,7 +35,7 @@ namespace Migo.Net
     {
         private readonly long totalBytes;
         private readonly long bytesReceived;
-        
+
         public long BytesReceived
         {
             get { return bytesReceived; }
@@ -45,15 +45,15 @@ namespace Migo.Net
         {
             get { return totalBytes; }
         }
-        
+
         public DownloadProgressChangedEventArgs (int progressPercentage,
-                                                 object userState, 
-                                                 long bytesReceived, 
+                                                 object userState,
+                                                 long bytesReceived,
                                                  long totalBytes
                                                  ) : base (progressPercentage, userState)
         {
             this.totalBytes = totalBytes;
-            this.bytesReceived = bytesReceived;            
+            this.bytesReceived = bytesReceived;
         }
     }
 }
diff --git a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadStringCompletedEventArgs.cs b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadStringCompletedEventArgs.cs
index dab3d9c..192580c 100644
--- a/src/Libraries/Migo/Migo.Net/EventArgs/DownloadStringCompletedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Net/EventArgs/DownloadStringCompletedEventArgs.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  DownloadStringCompletedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -37,15 +37,15 @@ namespace Migo.Net
         private readonly string result;
 
         public string Result {
-            get { 
+            get {
                 RaiseExceptionIfNecessary ();
-                return result; 
+                return result;
             }
         }
-        
-        internal DownloadStringCompletedEventArgs (string result, 
-                                                   Exception error, 
-                                                   bool cancelled, 
+
+        internal DownloadStringCompletedEventArgs (string result,
+                                                   Exception error,
+                                                   bool cancelled,
                                                    object userState)
                                                    : base (error, cancelled, userState)
         {
diff --git a/src/Libraries/Migo/Migo.Net/EventArgs/TransferRateUpdatedEventArgs.cs b/src/Libraries/Migo/Migo.Net/EventArgs/TransferRateUpdatedEventArgs.cs
index 6bd454d..73cc9b4 100644
--- a/src/Libraries/Migo/Migo.Net/EventArgs/TransferRateUpdatedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Net/EventArgs/TransferRateUpdatedEventArgs.cs
@@ -1,47 +1,47 @@
-/*************************************************************************** 
+/***************************************************************************
  *  TransferRateUpdatedEventArgs.cs
- *  
+ *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
- 
-namespace Migo.Net 
+
+namespace Migo.Net
 {
     public class TransferRateUpdatedEventArgs : EventArgs
     {
         // bytes per second
         private readonly int transferRate;
-        
+
         public int TransferRate {
             get { return transferRate; }
         }
-    
+
         public TransferRateUpdatedEventArgs (int transferRate)
         {
             this.transferRate = transferRate;
         }
-    }   
+    }
 }
diff --git a/src/Libraries/Migo/Migo.Net/Exceptions/RemoteFileModifiedException.cs b/src/Libraries/Migo/Migo.Net/Exceptions/RemoteFileModifiedException.cs
index 312ad21..bf62505 100644
--- a/src/Libraries/Migo/Migo.Net/Exceptions/RemoteFileModifiedException.cs
+++ b/src/Libraries/Migo/Migo.Net/Exceptions/RemoteFileModifiedException.cs
@@ -1,32 +1,32 @@
-/*************************************************************************** 
+/***************************************************************************
  *  RemoteFileModifiedException.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
-using System; 
+using System;
 
 namespace Migo.Net
 {
@@ -34,7 +34,7 @@ namespace Migo.Net
     {
         private readonly DateTime localFileMod;
         private readonly DateTime remoteFileMod;
-        
+
         public DateTime LocalFileModified {
             get { return remoteFileMod; }
         }
@@ -42,17 +42,17 @@ namespace Migo.Net
         public DateTime RemoteFileModified {
             get { return localFileMod; }
         }
-        
+
         public RemoteFileModifiedException (string message,
-                                            DateTime localFileMod, 
-                                            DateTime remoteFileMod) 
+                                            DateTime localFileMod,
+                                            DateTime remoteFileMod)
                                             : base (message)
         {
             this.localFileMod = localFileMod;
             this.remoteFileMod = remoteFileMod;
         }
-        
-        public RemoteFileModifiedException (string message) 
+
+        public RemoteFileModifiedException (string message)
             : this (message, DateTime.MinValue, DateTime.MinValue) {}
     }
 }
diff --git a/src/Libraries/Migo/Migo.Net/TransferStatusManager.cs b/src/Libraries/Migo/Migo.Net/TransferStatusManager.cs
index e898661..0def0cc 100644
--- a/src/Libraries/Migo/Migo.Net/TransferStatusManager.cs
+++ b/src/Libraries/Migo/Migo.Net/TransferStatusManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  TransferStatusManager.cs
- *  
+ *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -39,18 +39,18 @@ namespace Migo.Net
 
         private long bytesReceived;
         private long bytesReceivedPreviously;
-        
-        private long totalBytes = -1;        
-        
+
+        private long totalBytes = -1;
+
         private readonly object progressSync = new object ();
-        
+
         public event EventHandler<DownloadProgressChangedEventArgs> ProgressChanged;
-        
+
         public long BytesReceived {
             get { return bytesReceived; }
             set { SetBytesReceived (value); }
         }
-        
+
         public long BytesReceivedPreviously {
             get { return bytesReceivedPreviously; }
             set {
@@ -59,18 +59,18 @@ namespace Migo.Net
                         "BytesReceivedPreviously", "Must be > 0"
                     );
                 }
-                
-                bytesReceivedPreviously = value; 
+
+                bytesReceivedPreviously = value;
             }
         }
-        
+
         public int Progress {
             get { return progress; }
         }
 
         public object SyncRoot {
             get { return progressSync; }
-        }        
+        }
 
         public long TotalBytesReceived {
             get { return bytesReceived + bytesReceivedPreviously; }
@@ -78,16 +78,16 @@ namespace Migo.Net
 
         public long TotalBytes {
             get { return totalBytes; }
-            set { 
+            set {
                 SetTotalBytes (value);
             }
         }
-    
+
         public TransferStatusManager ()
         {
             Reset ();
         }
-        
+
         public void AddBytes (long bytes)
         {
             if (bytes < 0) {
@@ -95,28 +95,28 @@ namespace Migo.Net
                     "bytes cannot be less than 0"
                 );
             }
-            
+
             lock (progressSync) {
                 bytesReceived += bytes;
                 progressThisStep += bytes;
             }
-            
-            UpdateProgress ();            
+
+            UpdateProgress ();
         }
 
         public void Reset ()
         {
             lock (progressSync) {
                 progress = 0;
-                
+
                 progressStep = 0;
                 progressThisStep = 0;
 
-                totalBytes = -1;        
+                totalBytes = -1;
                 bytesReceived = 0;
-                bytesReceivedPreviously = 0;                
+                bytesReceivedPreviously = 0;
             }
-            
+
             UpdateProgress ();
         }
 
@@ -126,8 +126,8 @@ namespace Migo.Net
                 throw new ArgumentOutOfRangeException (
                     "bytesReceived cannot be less than 0"
                 );
-            } 
-            
+            }
+
             lock (progressSync) {
                 if (totalBytes > -1 &&
                     totalBytes < bytesReceived) {
@@ -135,38 +135,38 @@ namespace Migo.Net
                         "bytesReceived cannot be greater than TotalBytes"
                     );
                 }
-                
+
                 progressThisStep = 0;
                 this.bytesReceived = bytesReceived;
             }
-            
-            UpdateProgress ();                
+
+            UpdateProgress ();
         }
-        
+
         private void SetTotalBytes (long totalBytes)
         {
             bool update = false;
-        
+
             if (totalBytes < -1 || totalBytes == 0) {
                 throw new ArgumentOutOfRangeException (
                     "totalBytes cannot be less than -1 or equal to 0"
                 );
-            } 
-            
+            }
+
             lock (progressSync) {
                 if (totalBytes != -1 && totalBytes < bytesReceived) {
                     throw new ArgumentOutOfRangeException (
                         "totalBytes cannot be less than bytesReceived"
                     );
-                }             
-            
+                }
+
                 if (this.totalBytes != totalBytes) {
-                    this.totalBytes = totalBytes; 
+                    this.totalBytes = totalBytes;
                     progressStep = (totalBytes / 100);
                     update = true;
                 }
             }
-            
+
             if (update) {
                 UpdateProgress ();
             }
@@ -175,29 +175,29 @@ namespace Migo.Net
         private void UpdateProgress ()
         {
             DownloadProgressChangedEventArgs args = null;
-            
+
             lock (progressSync) {
                 long totalBytesReceived = TotalBytesReceived;
-            
-                if (progressThisStep >= progressStep || 
+
+                if (progressThisStep >= progressStep ||
                     totalBytesReceived == totalBytes &&
                     (totalBytes > 0 && progress != 100)) {
-                                          
+
                     progress = Convert.ToInt32 (
                         (totalBytesReceived * 100) / totalBytes
                     );
-                        
+
                     if (progress >= 0) {
                         args = new DownloadProgressChangedEventArgs (
-                            progress, null,                    
+                            progress, null,
                             totalBytesReceived, totalBytes
                         );
                     }
-                        
-                    progressThisStep = 0;                            
-                }        
+
+                    progressThisStep = 0;
+                }
             }
-            
+
             if (args != null) {
                 OnProgressChanged (args);
             }
@@ -205,15 +205,15 @@ namespace Migo.Net
 
         private void OnProgressChanged (DownloadProgressChangedEventArgs args)
         {
-            EventHandler <DownloadProgressChangedEventArgs> 
+            EventHandler <DownloadProgressChangedEventArgs>
                 handler = ProgressChanged;
-        
-            try 
+
+            try
             {
                 if (handler != null) {
                     handler (this, args);
                 }
             } catch {}
-        }         
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/EnclosureManager.cs b/src/Libraries/Migo/Migo.Syndication/EnclosureManager.cs
index e346084..0e44b1f 100644
--- a/src/Libraries/Migo/Migo.Syndication/EnclosureManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EnclosureManager.cs
@@ -50,26 +50,26 @@ namespace Migo.Syndication
         private bool disposed;
         private readonly object sync = new object ();
         private ManualResetEvent download_handle;
-        
-        public event EventHandler<TaskEventArgs<HttpFileDownloadTask>> EnclosureDownloadCompleted;   
-    
+
+        public event EventHandler<TaskEventArgs<HttpFileDownloadTask>> EnclosureDownloadCompleted;
+
         public EnclosureManager (DownloadManager downloadManager)
         {
             download_manager = downloadManager;
             download_manager.Tasks.TaskAdded += OnDownloadTaskAdded;
-            download_manager.Tasks.TaskRemoved += OnDownloadTaskRemoved;            
+            download_manager.Tasks.TaskRemoved += OnDownloadTaskRemoved;
             download_manager.Group.TaskStatusChanged += OnDownloadTaskStatusChangedHandler;
 
             queued_downloads = new Dictionary<FeedEnclosure, HttpFileDownloadTask> ();
-            
+
             download_handle = new ManualResetEvent (true);
         }
-        
+
         public void Dispose (AutoResetEvent disposeHandle)
         {
-            
+
             disposed = true;
-            
+
             List<HttpFileDownloadTask> tasks = null;
 
             lock (sync) {
@@ -85,124 +85,124 @@ namespace Migo.Syndication
 
                 download_handle.WaitOne ();
             }
-            
+
             if (download_handle != null) {
                 download_handle.Close ();
                 download_handle = null;
-            }                   
-            
+            }
+
             if (download_manager != null) {
                 download_manager.Tasks.TaskAdded -= OnDownloadTaskAdded;
-                download_manager.Tasks.TaskRemoved -= OnDownloadTaskRemoved; 
+                download_manager.Tasks.TaskRemoved -= OnDownloadTaskRemoved;
                 download_manager = null;
-            }  
+            }
         }
 
-        public HttpFileDownloadTask QueueDownload (FeedEnclosure enclosure) 
+        public HttpFileDownloadTask QueueDownload (FeedEnclosure enclosure)
         {
-            return QueueDownload (enclosure, true);         
+            return QueueDownload (enclosure, true);
         }
-           
+
         public HttpFileDownloadTask QueueDownload (FeedEnclosure enclosure, bool queue)
         {
             if (enclosure == null) {
                 throw new ArgumentNullException ("enc");
             }
-            
-            HttpFileDownloadTask task = null;       
-            
+
+            HttpFileDownloadTask task = null;
+
             lock (sync) {
                 if (disposed) {
                     return null;
                 }
-                
-                if (!queued_downloads.ContainsKey (enclosure)) {                    
-                    Feed parentFeed = enclosure.Item.Feed;                    
-                    
-                    if (parentFeed != null) {                        
+
+                if (!queued_downloads.ContainsKey (enclosure)) {
+                    Feed parentFeed = enclosure.Item.Feed;
+
+                    if (parentFeed != null) {
                         task = download_manager.CreateDownloadTask (enclosure.Url, enclosure);
                         //Console.WriteLine ("Task DL path:  {0}", task.LocalPath);
                         task.Name = String.Format ("{0} - {1}", parentFeed.Title, enclosure.Item.Title);
-                        
+
                         //task.StatusChanged
-                        task.Completed += OnDownloadTaskCompletedHandler;                    
-                        
+                        task.Completed += OnDownloadTaskCompletedHandler;
+
                         // Race condition...
-                        // Should only be added when the task is associated or 
+                        // Should only be added when the task is associated or
                         // it can be canceled before it is added to the progress manager.
-                        
-                        // Add a pre-association dict and move tasks to the 
+
+                        // Add a pre-association dict and move tasks to the
                         // queued dict once they've been offically added.
-                        
+
                         queued_downloads.Add (enclosure, task);
-                    }                    
+                    }
                 }
 
                 if (task != null && queue) {
                     download_manager.QueueDownload (task);
                 }
             }
-                       
-            return task;        
+
+            return task;
         }
-        
+
         public IEnumerable<HttpFileDownloadTask> QueueDownloads (IEnumerable<FeedEnclosure> encs)
         {
             if (encs == null) {
                 throw new ArgumentNullException ("encs");
             }
-            
+
             ICollection<HttpFileDownloadTask> encsCol = encs as ICollection<HttpFileDownloadTask>;
-            
+
             List<HttpFileDownloadTask> tasks = (encsCol == null) ?
-                new List<HttpFileDownloadTask> () : 
+                new List<HttpFileDownloadTask> () :
                 new List<HttpFileDownloadTask> (encsCol.Count);
-            
+
             HttpFileDownloadTask tmpTask = null;
-            
-            lock (sync) {   
+
+            lock (sync) {
                 if (disposed) {
                     return tasks;
                 }
-                
+
                 foreach (FeedEnclosure enc in encs) {
                     tmpTask = QueueDownload (enc, false);
                     if (tmpTask != null) {
                         tasks.Add (tmpTask);
-                    }    
+                    }
                 }
-                
+
                 if (tasks.Count > 0) {
                     download_manager.QueueDownload (tasks);
                 }
             }
-            
+
             return tasks;
         }
-       
+
         public void CancelDownload (FeedEnclosure enc)
         {
             lock (sync) {
-                HttpFileDownloadTask task = FindDownloadTask (enc);            
-                        
+                HttpFileDownloadTask task = FindDownloadTask (enc);
+
                 if (task != null) {
-                    // Look into multi-cancel later      
+                    // Look into multi-cancel later
                     task.CancelAsync ();
-                }            
+                }
             }
         }
-        
+
         public void StopDownload (FeedEnclosure enc)
-        {   
+        {
             lock (sync) {
-                HttpFileDownloadTask task = FindDownloadTask (enc);            
-                        
+                HttpFileDownloadTask task = FindDownloadTask (enc);
+
                 if (task != null) {
                     task.Stop ();
-                }   
+                }
             }
-        }  
-        
+        }
+
         /*private void OnFeedItemRemoved (Feed feed, FeedItem item)
         {
             if (feed == null) {
@@ -211,23 +211,23 @@ namespace Migo.Syndication
                 throw new ArgumentNullException ("item");
             }
 
-            EventHandler<FeedItemEventArgs> handler = FeedItemRemoved;            
-            
+            EventHandler<FeedItemEventArgs> handler = FeedItemRemoved;
+
             if (item.Enclosure != null) {
                 lock (sync) {
-                    HttpFileDownloadTask task;                
-                         
+                    HttpFileDownloadTask task;
+
                     if (queued_downloads.TryGetValue ((FeedEnclosure)item.Enclosure, out task)) {
                         task.CancelAsync ();
                     }
                 }
-            }            
-            
+            }
+
             if (handler != null) {
                 OnFeedItemEvent (handler, new FeedItemEventArgs (feed, item));
-            }                 
+            }
         }
-        
+
         private void OnFeedItemsRemoved (Feed feed, IEnumerable<FeedItem> items)
         {
             if (feed == null) {
@@ -235,94 +235,94 @@ namespace Migo.Syndication
             } else if (items == null) {
                 throw new ArgumentNullException ("items");
             }
-            
+
             EventHandler<FeedItemEventArgs> handler = FeedItemRemoved;
 
             lock (sync) {
-                HttpFileDownloadTask task;  
-                
-                foreach (FeedItem item in items) {                
-                    if (item.Enclosure != null) {                    
+                HttpFileDownloadTask task;
+
+                foreach (FeedItem item in items) {
+                    if (item.Enclosure != null) {
                         if (queued_downloads.TryGetValue ((FeedEnclosure)item.Enclosure, out task)) {
                             task.CancelAsync ();
                         }
                     }
                 }
             }
-            
+
             if (handler != null) {
                 OnFeedItemEvent (handler, new FeedItemEventArgs (feed, items));
-            }               
+            }
         } */
-        
+
         private HttpFileDownloadTask FindDownloadTask (FeedEnclosure enc)
         {
             if (enc == null) {
                 throw new ArgumentNullException ("enc");
             }
-            
+
             return FindDownloadTaskImpl ((FeedEnclosure)enc);
         }
-        
-        private HttpFileDownloadTask FindDownloadTaskImpl (FeedEnclosure enc) 
+
+        private HttpFileDownloadTask FindDownloadTaskImpl (FeedEnclosure enc)
         {
             HttpFileDownloadTask task = null;
-            Feed parentFeed = enc.Item.Feed as Feed;                               
-            
+            Feed parentFeed = enc.Item.Feed as Feed;
+
             if (parentFeed != null && queued_downloads.ContainsKey (enc)) {
                 task = queued_downloads[enc];
             }
-            
+
             return task;
-        }     
-        
+        }
+
         private void TaskAddedAction (HttpFileDownloadTask task)
         {
             Feed parentFeed = null;
             FeedEnclosure enc = task.UserState as FeedEnclosure;
-                    
+
             if (enc != null) {
-                lock (sync) { 
-                    parentFeed = enc.Item.Feed;                  
-                    
+                lock (sync) {
+                    parentFeed = enc.Item.Feed;
+
                     if (parentFeed != null && queued_downloads.ContainsKey (enc)) {
                         if (queued_downloads.Count == 0) {
                             download_handle.Reset ();
-                        }                        
+                        }
 
-                        enc.DownloadStatus = FeedDownloadStatus.Pending;                       
-                        //parentFeed.IncrementQueuedDownloadCount ();                    
+                        enc.DownloadStatus = FeedDownloadStatus.Pending;
+                        //parentFeed.IncrementQueuedDownloadCount ();
                     }
                 }
-            }        
+            }
         }
-        
+
         private void OnDownloadTaskAdded (object sender, TaskAddedEventArgs<HttpFileDownloadTask> e)
         {
             if (e.Task != null) {
                 TaskAddedAction (e.Task);
             } else if (e.Tasks != null) {
                 foreach (HttpFileDownloadTask task in e.Tasks) {
-                    TaskAddedAction (task);                                    
+                    TaskAddedAction (task);
                 }
             }
         }
-        
+
         private void OnDownloadTaskCompletedHandler (object sender, TaskCompletedEventArgs args)
         {
             HttpFileDownloadTask task = sender as HttpFileDownloadTask;
             FeedEnclosure enc = task.UserState as FeedEnclosure;
 
-            if (enc != null) {   
+            if (enc != null) {
                 if (args.Error != null || task.Status == TaskStatus.Failed) {
                     enc.DownloadStatus = FeedDownloadStatus.DownloadFailed;
                 } else if (!args.Cancelled) {
                     if (task.Status == TaskStatus.Succeeded) {
-                        try {                        
+                        try {
                             enc.SetFileImpl (
-                                task.RemoteUri.ToString (), 
-                                Path.GetDirectoryName (task.LocalPath), 
-                                task.MimeType, 
+                                task.RemoteUri.ToString (),
+                                Path.GetDirectoryName (task.LocalPath),
+                                task.MimeType,
                                 Path.GetFileName (task.LocalPath)
                             );
                         } catch (Exception e) {
@@ -334,35 +334,35 @@ namespace Migo.Syndication
                     }
                 }
             }
-            
-            OnEnclosureDownloadCompleted (task);            
+
+            OnEnclosureDownloadCompleted (task);
         }
-        
+
         private void OnEnclosureDownloadCompleted (HttpFileDownloadTask task)
         {
             /*EventHandler<TaskEventArgs<HttpFileDownloadTask>> handler = EnclosureDownloadCompleted;
-        
+
             if (handler != null) {
                 AsyncCommandQueue<ICommand> cmdQCpy = command_queue;
-                
+
                 if (cmdQCpy != null) {
                     cmdQCpy.Register (new EventWrapper<TaskEventArgs<HttpFileDownloadTask>> (
                 	    handler, this, new TaskEventArgs<HttpFileDownloadTask> (task))
                 	);
-                }        
-            }   */                      
-        }  
-        
+                }
+            }   */
+        }
+
         private void DownloadTaskRemoved (FeedEnclosure enc, HttpFileDownloadTask task, bool decQueuedCount)
         {
             if (queued_downloads.ContainsKey (enc)) {
-                queued_downloads.Remove (enc);    
-                task.Completed -= OnDownloadTaskCompletedHandler;                                            
-                
+                queued_downloads.Remove (enc);
+                task.Completed -= OnDownloadTaskCompletedHandler;
+
                 if (decQueuedCount) {
                     //enc.Item.Feed.DecrementQueuedDownloadCount ();
                 }
-                
+
                 if (queued_downloads.Count == 0) {
                 	if (download_handle != null) {
                 	    download_handle.Set ();
@@ -370,12 +370,12 @@ namespace Migo.Syndication
                 }
             }
         }
-        
+
         private void OnDownloadTaskRemoved (object sender, TaskRemovedEventArgs<HttpFileDownloadTask> e)
         {
             if (e.Task != null) {
                 FeedEnclosure enc = e.Task.UserState as FeedEnclosure;
-                    
+
                 if (enc != null) {
                     lock (sync) {
                         DownloadTaskRemoved (enc, e.Task, true);
@@ -385,48 +385,48 @@ namespace Migo.Syndication
                 Feed tmpParent = null;
                 FeedEnclosure tmpEnclosure = null;
                 List<FeedEnclosure> tmpList = null;
-                
+
                 Dictionary<Feed, List<FeedEnclosure>> feedDict =
                     new Dictionary<Feed,List<FeedEnclosure>> ();
-                
+
                 lock (sync) {
                     foreach (HttpFileDownloadTask t in e.Tasks) {
                         tmpEnclosure = t.UserState as FeedEnclosure;
-                        
+
                         if (tmpEnclosure != null) {
                             tmpParent = tmpEnclosure.Item.Feed;
-                            
+
                             if (!feedDict.TryGetValue (tmpParent, out tmpList)) {
                                 tmpList = new List<FeedEnclosure> ();
-                                feedDict.Add (tmpParent, tmpList);  
+                                feedDict.Add (tmpParent, tmpList);
                             }
-                            
+
                             tmpList.Add (tmpEnclosure);
                             DownloadTaskRemoved (tmpEnclosure, t, false);
                         }
                     }
-                    
+
                     //foreach (KeyValuePair<Feed,List<FeedEnclosure>> kvp in feedDict) {
                         //kvp.Key.DecrementQueuedDownloadCount (kvp.Value.Count);
                     //}
                 }
-            }                       
-        }        
+            }
+        }
 
         private void TaskStatusChanged (TaskStatusChangedInfo statusInfo)
         {
             HttpFileDownloadTask task = statusInfo.Task as HttpFileDownloadTask;
-            
+
             if (task == null) {
                 return;
             }
-            
+
             FeedEnclosure enc = task.UserState as FeedEnclosure;
-            
+
             if (enc == null) {
                 return;
             }
-               
+
             switch (statusInfo.NewStatus) {
             case TaskStatus.Stopped:
             case TaskStatus.Cancelled:
@@ -435,7 +435,7 @@ namespace Migo.Syndication
             case TaskStatus.Failed:
                 enc.DownloadStatus = FeedDownloadStatus.DownloadFailed;
                 break;
-            case TaskStatus.Paused: 
+            case TaskStatus.Paused:
                 enc.DownloadStatus = FeedDownloadStatus.Paused;
                 break;
             case TaskStatus.Ready:
@@ -443,16 +443,16 @@ namespace Migo.Syndication
                 break;
             case TaskStatus.Running:
                 enc.DownloadStatus = FeedDownloadStatus.Downloading;
-                //enc.Item.Feed.IncrementActiveDownloadCount ();                    
+                //enc.Item.Feed.IncrementActiveDownloadCount ();
                 break;
             case TaskStatus.Succeeded:
                 break;
             }
-            
+
             FeedsManager.Instance.FeedManager.OnItemChanged (enc.Item);
 
             if (statusInfo.OldStatus == TaskStatus.Running) {
-                //enc.Item.Feed.DecrementActiveDownloadCount ();                    
+                //enc.Item.Feed.DecrementActiveDownloadCount ();
             }
         }
 
@@ -465,9 +465,9 @@ namespace Migo.Syndication
             } else {
                 lock (sync) {
                     foreach (TaskStatusChangedInfo statusInfo in e.StatusesChanged) {
-                        TaskStatusChanged (statusInfo);                        
+                        TaskStatusChanged (statusInfo);
                     }
-                }                
+                }
             }
         }
     }
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS.cs
index 212da3b..3c84635 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_ITEM_COUNT_FLAGS.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_ITEM_COUNT_FLAGS.cs
index 7c9deec..612f409 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_ITEM_COUNT_FLAGS.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FEEDS_EVENTS_ITEM_COUNT_FLAGS.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_EVENTS_ITEM_COUNT_FLAGS.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncAction.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncAction.cs
index f4dda46..769285a 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncAction.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncAction.cs
@@ -1,32 +1,32 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_BACKGROUNDSYNC_ACTION.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
- namespace Migo.Syndication 
+
+ namespace Migo.Syndication
  {
     public enum FeedBackgroundSyncAction : int
     {
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncStatus.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncStatus.cs
index a1b1592..6c2a6cd 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncStatus.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedBackgroundSyncStatus.cs
@@ -1,34 +1,34 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_BACKGROUNDSYNC_STATUS.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
- namespace Migo.Syndication 
+ namespace Migo.Syndication
  {
-    public enum FeedBackgroundSyncStatus : int 
+    public enum FeedBackgroundSyncStatus : int
     {
         Disabled = 0,
         Enabled = 1
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadError.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadError.cs
index 4ade23f..50a516d 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadError.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadError.cs
@@ -1,32 +1,32 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_DOWNLOAD_ERROR.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
- namespace Migo.Syndication 
+
+ namespace Migo.Syndication
  {
     public enum FeedDownloadError : int
     {
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadStatus.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadStatus.cs
index bc9740b..706f01a 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadStatus.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedDownloadStatus.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_DOWNLOAD_STATUS.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedSyncSetting.cs b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedSyncSetting.cs
index c5b43d6..b3e6c1d 100644
--- a/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedSyncSetting.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Enumerations/FeedSyncSetting.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FEEDS_SYNC_SETTING.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -32,6 +32,6 @@ namespace Migo.Syndication
     {
         Default = 0,
         Interval = 1,
-        Manual = 2      
+        Manual = 2
     };
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCompletedEventArgs.cs b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCompletedEventArgs.cs
index 318c5f4..1d5d7c7 100644
--- a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCompletedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCompletedEventArgs.cs
@@ -1,52 +1,52 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedDownloadCompletedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 
 namespace Migo.Syndication
-{    
+{
     public class FeedDownloadCompletedEventArgs : FeedEventArgs
     {
         private readonly FeedDownloadError error;
-        
+
         public FeedDownloadError Error
         {
-            get { return error; }   
+            get { return error; }
         }
-        
-        public FeedDownloadCompletedEventArgs (Feed feed, 
-                                               FeedDownloadError error) : base (feed) 
+
+        public FeedDownloadCompletedEventArgs (Feed feed,
+                                               FeedDownloadError error) : base (feed)
         {
             if (error < FeedDownloadError.None ||
                 error > FeedDownloadError.DownloadSizeLimitExceeded) {
             	throw new ArgumentException ("error:  Value out of range");            	
             }
-            
+
             this.error = error;
         }
     }
diff --git a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCountChangedEventArgs.cs b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCountChangedEventArgs.cs
index cee7422..6f84058 100644
--- a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCountChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedDownloadCountChangedEventArgs.cs
@@ -1,44 +1,44 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedDownloadCountChangedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 namespace Migo.Syndication
-{    
+{
     public class FeedDownloadCountChangedEventArgs : FeedEventArgs
     {
         private readonly FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS flags;
-        
+
         public FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS Flags
         {
-            get { return flags; }   
+            get { return flags; }
         }
-        
-        public FeedDownloadCountChangedEventArgs (Feed feed, 
-                                                  FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS flags) : base (feed) 
+
+        public FeedDownloadCountChangedEventArgs (Feed feed,
+                                                  FEEDS_EVENTS_DOWNLOAD_COUNT_FLAGS flags) : base (feed)
         {
             this.flags = flags;
         }
diff --git a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedEventArgs.cs b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedEventArgs.cs
index f9feeec..7dd477e 100644
--- a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedEventArgs.cs
@@ -1,48 +1,48 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedAddedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 
 namespace Migo.Syndication
-{    
+{
     public class FeedEventArgs : EventArgs
     {
         private readonly Feed feed;
         public Feed Feed {
-            get { return feed; }   
+            get { return feed; }
         }
-        
-        public FeedEventArgs (Feed feed) 
+
+        public FeedEventArgs (Feed feed)
         {
             if (feed == null) {
             	throw new ArgumentNullException ("feed");
             }
-            
+
             this.feed = feed;
         }
     }
diff --git a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemCountChangedEventArgs.cs b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemCountChangedEventArgs.cs
index 4694c20..d47dde6 100644
--- a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemCountChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemCountChangedEventArgs.cs
@@ -1,46 +1,46 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedItemCountChangedEventArgs.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 
 namespace Migo.Syndication
-{    
+{
     public class FeedItemCountChangedEventArgs : FeedEventArgs
     {
         private readonly FEEDS_EVENTS_ITEM_COUNT_FLAGS flags;
-        
+
         public FEEDS_EVENTS_ITEM_COUNT_FLAGS Flags
         {
-            get { return flags; }   
+            get { return flags; }
         }
-        
-        public FeedItemCountChangedEventArgs (Feed feed, 
-                                              FEEDS_EVENTS_ITEM_COUNT_FLAGS flags) : base (feed) 
+
+        public FeedItemCountChangedEventArgs (Feed feed,
+                                              FEEDS_EVENTS_ITEM_COUNT_FLAGS flags) : base (feed)
         {
             this.flags = flags;
         }
diff --git a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemEventArgs.cs b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemEventArgs.cs
index e85364d..7f37cfa 100644
--- a/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemEventArgs.cs
+++ b/src/Libraries/Migo/Migo.Syndication/EventArgs/FeedItemEventArgs.cs
@@ -5,40 +5,40 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections.Generic;
 
 namespace Migo.Syndication
-{    
+{
     public class FeedItemEventArgs
     {
         private readonly IEnumerable<FeedItem> items;
 
         public IEnumerable<FeedItem> Items {
-            get { return items; }   
+            get { return items; }
         }
-        
+
         public FeedItemEventArgs (Feed feed, IEnumerable<FeedItem> items)
         {
             this.items = items;
diff --git a/src/Libraries/Migo/Migo.Syndication/Feed.cs b/src/Libraries/Migo/Migo.Syndication/Feed.cs
index 9da25e5..9b93636 100644
--- a/src/Libraries/Migo/Migo.Syndication/Feed.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Feed.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  Feed.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -46,7 +46,7 @@ using Migo.DownloadCore;
 
 namespace Migo.Syndication
 {
-    public enum FeedAutoDownload : int 
+    public enum FeedAutoDownload : int
     {
         All = 0,
         One = 1,
@@ -56,26 +56,26 @@ namespace Migo.Syndication
     // TODO remove this, way too redundant with DownloadStatus
     public enum PodcastFeedActivity : int {
         Updating = 0,
-        UpdatePending = 1,        
+        UpdatePending = 1,
         UpdateFailed = 2,
-        ItemsDownloading = 4,        
-        ItemsQueued = 5,        
-        None = 6        
+        ItemsDownloading = 4,
+        ItemsQueued = 5,
+        None = 6
     }
-    
+
     public class FeedProvider : MigoModelProvider<Feed>
     {
         public FeedProvider (HyenaSqliteConnection connection) : base (connection, "PodcastSyndications")
         {
         }
-        
+
         protected override void CreateTable ()
         {
             base.CreateTable ();
-            
+
             CreateIndex ("PodcastSyndicationsIndex", "IsSubscribed, Title");
         }
-        
+
         protected override int ModelVersion {
             get { return 3; }
         }
@@ -87,7 +87,7 @@ namespace Migo.Syndication
             if (old_version < 2) {
                 Connection.Execute (String.Format ("UPDATE {0} SET IsSubscribed=1", TableName));
             }
-            
+
             if (old_version < 3) {
                 CreateIndex ("PodcastSyndicationsIndex", "IsSubscribed, Title");
             }
@@ -100,7 +100,7 @@ namespace Migo.Syndication
         public static FeedProvider Provider {
             get { return provider; }
         }
-        
+
         public static void Init () {
             provider = new FeedProvider (FeedsManager.Instance.Connection);
         }
@@ -111,13 +111,13 @@ namespace Migo.Syndication
         }
 
         //private bool canceled;
-        //private bool deleted; 
+        //private bool deleted;
         //private bool updating;
-        
+
         //private ManualResetEvent updatingHandle = new ManualResetEvent (true);
-        
+
         private readonly object sync = new object ();
-        
+
         private string copyright;
         private string description;
         private string image_url;
@@ -135,23 +135,23 @@ namespace Migo.Syndication
         private string title;
         private string url;
         private string keywords, category;
-        
+
 #region Database-bound Properties
 
         [DatabaseColumn ("FeedID", Constraints = DatabaseColumnConstraints.PrimaryKey)]
-        public override long DbId { 
+        public override long DbId {
             get { return dbid; }
             protected set { dbid = value; }
         }
-        
+
         [DatabaseColumn]
         public string Title {
             get { return title ?? Catalog.GetString ("Unknown Podcast"); }
             set { title = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Description { 
+        public string Description {
             get { return description; }
             set { description = value; }
         }
@@ -161,25 +161,25 @@ namespace Migo.Syndication
             get { return url; }
             set { url = value; }
         }
-        
+
         [DatabaseColumn]
         public string Keywords {
             get { return keywords; }
             set { keywords = value; }
         }
-        
+
         [DatabaseColumn]
         public string Category {
             get { return category; }
             set { category = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Copyright { 
+        public string Copyright {
             get { return copyright; }
             set { copyright = value; }
         }
-        
+
         [DatabaseColumn]
         public string ImageUrl {
             get { return image_url; }
@@ -187,35 +187,35 @@ namespace Migo.Syndication
         }
 
         [DatabaseColumn]
-        public int UpdatePeriodMinutes { 
+        public int UpdatePeriodMinutes {
             get { return update_period_minutes; }
-            set { update_period_minutes = value; } 
+            set { update_period_minutes = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Language { 
+        public string Language {
             get { return language; }
             set { language = value; }
         }
 
         [DatabaseColumn]
-        public FeedDownloadError LastDownloadError { 
+        public FeedDownloadError LastDownloadError {
             get { return lastDownloadError; }
             set { lastDownloadError = value; }
         }
-        
+
         [DatabaseColumn]
-        public DateTime LastDownloadTime { 
+        public DateTime LastDownloadTime {
             get { return last_download_time; }
             set { last_download_time = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Link { 
+        public string Link {
             get { return link; }
             set { link = value; }
         }
-        
+
         //[DatabaseColumn]
         public string LocalEnclosurePath {
             get {
@@ -230,32 +230,32 @@ namespace Migo.Syndication
             get { return maxItemCount; }
             set { maxItemCount = value; }
         }
-        
+
         [DatabaseColumn]
         public DateTime PubDate {
             get { return pubDate; }
             set { pubDate = value; }
         }
-        
+
         [DatabaseColumn]
         public DateTime LastBuildDate {
             get { return last_build_date; }
             set { last_build_date = value; }
         }
-        
+
         /*private DateTime last_downloaded;
         [DatabaseColumn]
         public DateTime LastDownloaded {
             get { return last_downloaded; }
             set { last_downloaded = value; }
         }*/
-        
+
         [DatabaseColumn]
 		public FeedSyncSetting SyncSetting {
             get { return syncSetting; }
             set { syncSetting = value; }
         }
-        
+
         [DatabaseColumn]
         protected DateTime last_auto_download = DateTime.MinValue;
         public DateTime LastAutoDownload {
@@ -275,47 +275,47 @@ namespace Migo.Syndication
                 CheckForItemsToDownload ();
             }
         }
-        
+
         [DatabaseColumn("DownloadStatus")]
         private FeedDownloadStatus download_status;
-        public FeedDownloadStatus DownloadStatus { 
+        public FeedDownloadStatus DownloadStatus {
             get { return download_status; }
             set { download_status = value; }
         }
-        
+
         [DatabaseColumn("IsSubscribed")]
         private bool is_subscribed;
         public bool IsSubscribed {
             get { return is_subscribed; }
             set { is_subscribed = value; }
         }
-        
+
 #endregion
 
-#region Other Properties  
+#region Other Properties
 
         // TODO remove this, way too redundant with DownloadStatus
         /*public PodcastFeedActivity Activity {
             get { return activity; }
-            
+
                 PodcastFeedActivity ret = PodcastFeedActivity.None;
-                
+
                 if (this == All) {
                     return ret;
                 }
-                
+
                 switch (DownloadStatus) {
-                case FeedDownloadStatus.Pending: 
+                case FeedDownloadStatus.Pending:
                     ret = PodcastFeedActivity.UpdatePending;
                     break;
-                case FeedDownloadStatus.Downloading: 
+                case FeedDownloadStatus.Downloading:
                     ret = PodcastFeedActivity.Updating;
-                    break;    
-                case FeedDownloadStatus.DownloadFailed: 
+                    break;
+                case FeedDownloadStatus.DownloadFailed:
                     ret = PodcastFeedActivity.UpdateFailed;
-                    break;                         
+                    break;
                 }
-                
+
                 if (ret != PodcastFeedActivity.Updating) {
                     if (ActiveDownloadCount > 0) {
                         ret = PodcastFeedActivity.ItemsDownloading;
@@ -327,11 +327,11 @@ namespace Migo.Syndication
                 return ret;
             }
         }*/
-        
+
         public IEnumerable<FeedItem> Items {
             get {
                 if (DbId > 0) {
-                    foreach (FeedItem item in 
+                    foreach (FeedItem item in
                         FeedItem.Provider.FetchAllMatching (String.Format ("{0}.FeedID = {1} ORDER BY {0}.PubDate DESC", FeedItem.Provider.TableName, DbId)))
                     {
                         yield return item;
@@ -339,7 +339,7 @@ namespace Migo.Syndication
                 }
             }
         }
-        
+
 #endregion
 
         private static FeedManager Manager {
@@ -357,50 +357,50 @@ namespace Migo.Syndication
         public Feed ()
         {
         }
-        
+
 #endregion
 
 #region Internal Methods
-       
+
         // Removing a FeedItem means removing the downloaded file.
         /*public void Remove (FeedItem item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
-           
+
+
                 if (items.Remove (item)) {
                     inactive_items.Add (item);
                     OnFeedItemRemoved (item);
                 }
             }
         }*/
-        
+
         /*public void Remove (IEnumerable<FeedItem> itms)
         {
                 if (removedItems.Count > 0) {
                     OnItemsChanged ();
-                }     
+                }
             }
         }*/
-        
+
 #endregion
 
 #region Private Methods
-        
+
         public void SetItems (IEnumerable<FeedItem> items)
         {
             bool added_any = false;
             foreach (FeedItem item in items) {
                 added_any |= AddItem (item);
             }
-            
+
             if (added_any) {
                CheckForItemsToDownload ();
             }
         }
-        
+
         private bool AddItem (FeedItem item)
         {
             try {
@@ -414,21 +414,21 @@ namespace Migo.Syndication
             }
             return false;
         }
-        
+
         /*private void UpdateItems (IEnumerable<FeedItem> new_items)
         {
-            ICollection<FeedItem> tmpNew = null;         
+            ICollection<FeedItem> tmpNew = null;
             List<FeedItem> zombies = new List<FeedItem> ();
-         
+
             if (items.Count == 0 && inactive_items.Count == 0) {
                 tmpNew = new List<FeedItem> (new_items);
             } else {
                 // Get remote items that aren't in the items list
                 tmpNew = Diff (items, new_items);
-                
+
                 // Of those, remove the ones that are in our inactive list
                 tmpNew = Diff (inactive_items, tmpNew);
-                
+
                 // Get a list of inactive items that aren't in the remote list any longer
                 ICollection<FeedItem> doubleKilledZombies = Diff (
                     new_items, inactive_items
@@ -437,47 +437,47 @@ namespace Migo.Syndication
                 foreach (FeedItem zombie in doubleKilledZombies) {
                     inactive_items.Remove (zombie);
                 }
-                
-                zombies.AddRange (doubleKilledZombies);                    
-                
+
+                zombies.AddRange (doubleKilledZombies);
+
                 foreach (FeedItem fi in Diff (new_items, items)) {
                     if (fi.Enclosure != null &&
                         !String.IsNullOrEmpty (fi.Enclosure.LocalPath)) {
-                        // A hack for the podcast plugin, keeps downloaded items 
+                        // A hack for the podcast plugin, keeps downloaded items
                         // from being deleted when they are no longer in the feed.
                         continue;
                     }
-                    
+
                     zombies.Add (fi);
                 }
             }
-            
+
             if (tmpNew.Count > 0) {
-                Add (tmpNew);                
+                Add (tmpNew);
             }
-            
+
             // TODO merge...should we really be deleting these items?
             if (zombies.Count > 0) {
                 foreach (FeedItem item in zombies) {
                     if (item.Active) {
-                        zombie.Delete ();                        
-                    } 
+                        zombie.Delete ();
+                    }
                 }
-                
+
                 // TODO merge
                 //ItemsTableManager.Delete (zombies);
             }
-        }    
+        }
 
         // Written before LINQ, will update.
-        private ICollection<FeedItem> Diff (IEnumerable<FeedItem> baseSet, 
+        private ICollection<FeedItem> Diff (IEnumerable<FeedItem> baseSet,
                                             IEnumerable<FeedItem> overlay) {
             bool found;
             List<FeedItem> diff = new List<FeedItem> ();
-            
+
             foreach (FeedItem opi in overlay) {
                 found = false;
-                
+
                 foreach (FeedItem bpi in baseSet) {
                     if (opi.Title == bpi.Title &&
                         opi.Description == bpi.Description) {
@@ -486,14 +486,14 @@ namespace Migo.Syndication
                     }
                 }
 
-                if (!found) {  
+                if (!found) {
                     diff.Add (opi);
                 }
             }
 
             return diff;
         }*/
-        
+
 #endregion
 
 #region Public Methods
@@ -507,17 +507,17 @@ namespace Migo.Syndication
         public void Delete ()
         {
             Delete (true);
-            Manager.OnFeedsChanged ();                    
+            Manager.OnFeedsChanged ();
         }
-            
+
         public void Delete (bool deleteEnclosures)
         {
             lock (sync) {
                 //if (deleted)
                 //    return;
-                
+
                 //if (updating) {
-                //    Manager.CancelUpdate (this);                 
+                //    Manager.CancelUpdate (this);
                 //}
 
                 foreach (FeedItem item in Items) {
@@ -526,7 +526,7 @@ namespace Migo.Syndication
 
                 Provider.Delete (this);
             }
-            
+
             //updatingHandle.WaitOne ();
             Manager.OnFeedsChanged ();
         }
@@ -542,7 +542,7 @@ namespace Migo.Syndication
 
         public override string ToString ()
         {
-            return String.Format ("Title:  {0} - Url:  {1}", Title, Url);   
+            return String.Format ("Title:  {0} - Url:  {1}", Title, Url);
         }
 
         public void Save ()
@@ -553,7 +553,7 @@ namespace Migo.Syndication
         public void Save (bool notify)
         {
             Provider.Save (this);
-            
+
             if (LastBuildDate > LastAutoDownload) {
                 CheckForItemsToDownload ();
             }
@@ -562,17 +562,17 @@ namespace Migo.Syndication
                 Manager.OnFeedsChanged ();
             }
         }
-        
+
         private void CheckForItemsToDownload ()
         {
             if (LastDownloadError != FeedDownloadError.None || AutoDownload == FeedAutoDownload.None)
                 return;
-                
+
             bool only_first = (AutoDownload == FeedAutoDownload.One);
-            
+
             bool any = false;
             foreach (FeedItem item in Items) {
-                if (item.Enclosure != null && item.Active && 
+                if (item.Enclosure != null && item.Active &&
                     item.Enclosure.DownloadStatus != FeedDownloadStatus.Downloaded && item.PubDate > LastAutoDownload)
                 {
                     item.Enclosure.AsyncDownload ();
@@ -581,7 +581,7 @@ namespace Migo.Syndication
                         break;
                 }
             }
-            
+
             if (any) {
                 LastAutoDownload = DateTime.Now;
                 Save ();
@@ -591,15 +591,15 @@ namespace Migo.Syndication
         /*private bool SetCanceled ()
         {
             bool ret = false;
-            
+
             if (!canceled && updating) {
                 ret = canceled = true;
             }
-            
+
             return ret;
         }*/
-        
-#endregion  
+
+#endregion
 
     }
-}    
+}
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedEnclosure.cs b/src/Libraries/Migo/Migo.Syndication/FeedEnclosure.cs
index ca99a32..9fa2130 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedEnclosure.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedEnclosure.cs
@@ -42,36 +42,36 @@ namespace Migo.Syndication
         public static SqliteModelProvider<FeedEnclosure> Provider {
             get { return provider; }
         }
-        
+
         public static void Init () {
             provider = new MigoModelProvider<FeedEnclosure> (FeedsManager.Instance.Connection, "PodcastEnclosures");
         }
-        
+
         private string mimetype;
-        private FeedDownloadStatus download_status;        
+        private FeedDownloadStatus download_status;
         private FeedDownloadError last_download_error;
         private long file_size;
         private TimeSpan duration;
         private string keywords;
-        
+
         private string local_path;
         private FeedItem item;
         private string url;
-        
+
         private readonly object sync = new object ();
-        
+
 #region Constructors
 
         public FeedEnclosure ()
         {
         }
-        
+
 #endregion
 
 #region Public Properties
 
-        public FeedItem Item { 
-            get { return item ?? (item = FeedItem.Provider.FetchSingle (item_id)); } 
+        public FeedItem Item {
+            get { return item ?? (item = FeedItem.Provider.FetchSingle (item_id)); }
             internal set {
                 item = value;
                 if (item != null && item.DbId > 0) {
@@ -92,21 +92,21 @@ namespace Migo.Syndication
         }
 
 #region Public Methods
-        
+
         public void Save (bool save_item)
         {
             Provider.Save (this);
-            
+
             if (save_item) {
                 Item.Save ();
             }
         }
-        
+
         public void Save ()
         {
             Save (true);
         }
-        
+
         public void Delete (bool and_delete_file)
         {
             if (and_delete_file) {
@@ -114,13 +114,14 @@ namespace Migo.Syndication
             }
             Provider.Delete (this);
         }
-        
+
         public void AsyncDownload ()
         {
-            if (DownloadedAt == DateTime.MinValue)
+            if (DownloadedAt == DateTime.MinValue && DownloadStatus == FeedDownloadStatus.None) {
                 Manager.QueueDownload (this);
+            }
         }
-        
+
         public void CancelAsyncDownload ()
         {
             Manager.CancelDownload (this);
@@ -130,7 +131,7 @@ namespace Migo.Syndication
         {
             Manager.StopDownload (this);
         }
-        
+
         // Deletes file associated with enclosure.
         // Does not cancel an active download like the WRP.
         public void DeleteFile ()
@@ -143,7 +144,7 @@ namespace Migo.Syndication
                         Directory.Delete (Path.GetDirectoryName (local_path));
                     } catch {}
                 }
-                
+
                 LocalPath = null;
                 DownloadStatus = FeedDownloadStatus.None;
                 LastDownloadError = FeedDownloadError.None;
@@ -160,17 +161,17 @@ namespace Migo.Syndication
             string tmpLocalPath;
             string fullPath = path;
             string localEnclosurePath = Item.Feed.LocalEnclosurePath;
-            
+
             if (!localEnclosurePath.EndsWith (Path.DirectorySeparatorChar.ToString ())) {
                 localEnclosurePath += Path.DirectorySeparatorChar;
             }
-            
+
             if (!fullPath.EndsWith (Path.DirectorySeparatorChar.ToString ())) {
                 fullPath += Path.DirectorySeparatorChar;
-            }           
-            
+            }
+
             fullPath += filename;
-            tmpLocalPath = localEnclosurePath+filename;            
+            tmpLocalPath = localEnclosurePath+filename;
 
             try {
                 if (!Directory.Exists (path)) {
@@ -187,24 +188,24 @@ namespace Migo.Syndication
 
                 if (File.Exists (tmpLocalPath)) {
                     int lastDot = tmpLocalPath.LastIndexOf (".");
-                    
+
                     if (lastDot == -1) {
                         lastDot = tmpLocalPath.Length-1;
                     }
-                    
+
                     string rep = String.Format (
-                        "-{0}", 
+                        "-{0}",
                         Guid.NewGuid ().ToString ()
                                        .Replace ("-", String.Empty)
                                        .ToLower ()
                     );
-                    
+
                     tmpLocalPath = tmpLocalPath.Insert (lastDot, rep);
                 }
-            
+
                 File.Move (fullPath, tmpLocalPath);
                 File.SetAttributes (tmpLocalPath, FileAttributes.ReadOnly);
-                
+
                 try {
                     Directory.Delete (path);
                 } catch {}
@@ -218,59 +219,59 @@ namespace Migo.Syndication
             LocalPath = tmpLocalPath;
             Url = url;
             MimeType = mimeType;
-                            
+
             DownloadStatus = FeedDownloadStatus.Downloaded;
             LastDownloadError = FeedDownloadError.None;
             Save ();
         }
-        
+
 #endregion
 
 #region Database Columns
-        
+
         private long dbid;
         [DatabaseColumn ("EnclosureID", Constraints = DatabaseColumnConstraints.PrimaryKey)]
-        public override long DbId { 
+        public override long DbId {
             get { return dbid; }
             protected set { dbid = value; }
         }
-        
+
         [DatabaseColumn ("ItemID", Index = "PodcastEnclosuresItemIDIndex")]
         protected long item_id;
         public long ItemId {
             get { return Item.DbId; }
         }
-        
+
         [DatabaseColumn]
-        public string LocalPath { 
+        public string LocalPath {
             get { return local_path; }
             set { local_path = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Url { 
-            get { return url; } 
+        public string Url {
+            get { return url; }
             set { url = value; }
         }
-        
+
         [DatabaseColumn]
-        public string Keywords { 
-            get { return keywords; } 
+        public string Keywords {
+            get { return keywords; }
             set { keywords = value; }
         }
-        
+
         [DatabaseColumn]
-        public TimeSpan Duration { 
-            get { return duration; } 
+        public TimeSpan Duration {
+            get { return duration; }
             set { duration = value; }
         }
-        
+
         [DatabaseColumn]
-        public long FileSize { 
-            get { return file_size; } 
+        public long FileSize {
+            get { return file_size; }
             set { file_size = value; }
         }
-        
+
         [DatabaseColumn]
         public string MimeType {
             get { return mimetype; }
@@ -281,23 +282,23 @@ namespace Migo.Syndication
                 }
             }
         }
-        
+
         private DateTime downloaded_at;
         [DatabaseColumn]
         public DateTime DownloadedAt {
             get { return downloaded_at; }
             internal set { downloaded_at = value; }
         }
-        
+
         [DatabaseColumn]
-        public FeedDownloadStatus DownloadStatus { 
+        public FeedDownloadStatus DownloadStatus {
             get {
                 lock (sync) {
                     return download_status;
                 }
             }
-            
-            internal set { 
+
+            internal set {
                 lock (sync) {
                     download_status = value;
                 }
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedItem.cs b/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
index 7c68446..0f479ee 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
@@ -49,7 +49,7 @@ namespace Migo.Syndication
         public static SqliteModelProvider<FeedItem> Provider {
             get { return provider; }
         }
-        
+
         public static bool Exists (long feed_id, string guid)
         {
             return Provider.Connection.Query<int> (
@@ -57,7 +57,7 @@ namespace Migo.Syndication
                 feed_id, guid
             ) != 0;
         }
-        
+
         public static void Init () {
             provider = new FeedItemProvider (FeedsManager.Instance.Connection);
         }
@@ -72,11 +72,11 @@ namespace Migo.Syndication
         private bool isRead;
         private string link;
         private long dbid;
-        private DateTime modified;     
+        private DateTime modified;
         private Feed feed;
-        private DateTime pubDate;       
-        private string title;        
-        
+        private DateTime pubDate;
+        private string title;
+
         public event Action<FeedItem> ItemAdded;
         public event Action<FeedItem> ItemChanged;
         public event Action<FeedItem> ItemRemoved;
@@ -98,25 +98,25 @@ namespace Migo.Syndication
         [DatabaseColumn]
         internal bool Active {
             get { return active;}
-            set {          
+            set {
                 if (value != active) {
                     active = value;
                 }
             }
         }
-        
+
         [DatabaseColumn]
         public string Author {
             get { return author; }
             set { author = value; }
         }
-        
+
         [DatabaseColumn]
         public string Comments {
-            get { return comments; } 
+            get { return comments; }
             set { comments = value; }
         }
-        
+
         [DatabaseColumn]
         public string Description {
             get { return description; }
@@ -130,7 +130,7 @@ namespace Migo.Syndication
             get { return stripped_description; }
             set { stripped_description = value; }
         }
-        
+
         [DatabaseColumn("Guid", Index = "PodcastItemsGuidIndex")]
         public string Guid {
             get {
@@ -149,31 +149,31 @@ namespace Migo.Syndication
             get { return isRead; }
             set { isRead = value; }
         }
-        
+
         [DatabaseColumn]
         public string Link {
             get { return link; }
             set { link = value; }
         }
-        
+
         [DatabaseColumn]
-        public DateTime Modified { 
-            get { return modified; } 
+        public DateTime Modified {
+            get { return modified; }
             set { modified = value; }
-        }      
-        
+        }
+
         [DatabaseColumn]
         public DateTime PubDate {
-            get { return pubDate; } 
+            get { return pubDate; }
             set { pubDate = value; }
-        }       
-        
+        }
+
         [DatabaseColumn]
         public string Title {
-            get { return title; } 
+            get { return title; }
             set { title = value; }
         }
-        
+
         [DatabaseColumn("LicenseUri")]
         protected string license_uri;
         public string LicenseUri {
@@ -209,15 +209,15 @@ namespace Migo.Syndication
                     enclosure.Item = this;
             }
         }
-        
+
 #endregion
 
 #region Constructor
- 
+
         public FeedItem ()
         {
         }
-        
+
 #endregion
 
         private static FeedManager Manager {
@@ -248,7 +248,7 @@ namespace Migo.Syndication
             else
                 Manager.OnItemChanged (this);
         }
-        
+
         public void Delete (bool delete_file)
         {
             if (enclosure != null) {
@@ -258,7 +258,7 @@ namespace Migo.Syndication
             Provider.Delete (this);
             Manager.OnItemRemoved (this);
         }
-        
+
 #endregion
 
         private bool enclosure_loaded;
@@ -268,12 +268,12 @@ namespace Migo.Syndication
                 FeedEnclosure enclosure = FeedEnclosure.Provider.FetchFirstMatching (String.Format (
                     "{0}.ItemID = {1}", FeedEnclosure.Provider.TableName, DbId
                 ));
-                
+
                 if (enclosure != null) {
                     enclosure.Item = this;
                     this.enclosure = enclosure;
                 }
-                enclosure_loaded = true; 
+                enclosure_loaded = true;
             }
         }
     }
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedManager.cs b/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
index e480872..047042a 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedManager.cs
@@ -41,7 +41,7 @@ namespace Migo.Syndication
         private Dictionary<Feed, FeedUpdateTask> update_feed_map;
         private TaskList<FeedUpdateTask> update_task_list;
         private TaskGroup<FeedUpdateTask> update_task_group;
-        
+
 #region Public Properties and Events
 
         public event Action<FeedItem> ItemAdded;
@@ -50,33 +50,33 @@ namespace Migo.Syndication
         public event EventHandler FeedsChanged;
 
 #endregion
-        
+
 #region Constructor
-        
+
         public FeedManager ()
         {
             update_feed_map = new Dictionary<Feed, FeedUpdateTask> ();
             update_task_list = new TaskList<FeedUpdateTask> ();
-            
+
             // Limit to 4 feeds downloading at a time
             update_task_group = new TaskGroup<FeedUpdateTask> (2, update_task_list);
-            
+
             update_task_group.TaskStopped += OnUpdateTaskStopped;
             update_task_group.TaskAssociated += OnUpdateTaskAdded;
-            
+
             // TODO
             // Start timeout to refresh feeds every so often
         }
 
 #endregion
-        
+
 #region Public Methods
 
         public bool IsUpdating (Feed feed)
         {
             return update_feed_map.ContainsKey (feed);
         }
-        
+
         public Feed CreateFeed (string url, FeedAutoDownload autoDownload)
         {
             return CreateFeed (url, autoDownload, true);
@@ -93,7 +93,7 @@ namespace Migo.Syndication
                 feed.Save ();
                 feed.Update ();
             }
-            
+
             return feed;
         }
 
@@ -103,17 +103,17 @@ namespace Migo.Syndication
                 if (disposed) {
                     return;
                 }
-                
+
                 if (!update_feed_map.ContainsKey (feed)) {
                     FeedUpdateTask task = new FeedUpdateTask (feed);
                     update_feed_map[feed] = task;
-                    lock (update_task_list.SyncRoot) { 
+                    lock (update_task_list.SyncRoot) {
                         update_task_list.Add (task);
                     }
                 }
-            }        
+            }
         }
-        
+
         public void CancelUpdate (Feed feed)
         {
             lock (update_task_group.SyncRoot) {
@@ -122,7 +122,7 @@ namespace Migo.Syndication
                 }
             }
         }
-        
+
         public void Dispose (System.Threading.AutoResetEvent disposeHandle)
         {
             lock (update_task_group.SyncRoot) {
@@ -131,17 +131,17 @@ namespace Migo.Syndication
                     //update_task_group.Handle.WaitOne ();
                     update_task_group.Dispose ();
                     //disposeHandle.WaitOne ();
-                    
+
                     update_task_group.TaskStopped -= OnUpdateTaskStopped;
                     update_task_group.TaskAssociated -= OnUpdateTaskAdded;
                     update_task_group = null;
                 }
-               
+
                 update_task_list = null;
                 disposed = true;
             }
-        }        
-                
+        }
+
 #endregion
 
 #region Internal Methods
@@ -153,7 +153,7 @@ namespace Migo.Syndication
                 handler (this, EventArgs.Empty);
             }
         }
-        
+
         internal void OnItemAdded (FeedItem item)
         {
             Action<FeedItem> handler = ItemAdded;
@@ -161,7 +161,7 @@ namespace Migo.Syndication
                 handler (item);
             }
         }
-        
+
         internal void OnItemChanged (FeedItem item)
         {
             Action<FeedItem> handler = ItemChanged;
@@ -169,7 +169,7 @@ namespace Migo.Syndication
                 handler (item);
             }
         }
-        
+
         internal void OnItemRemoved (FeedItem item)
         {
             Action<FeedItem> handler = ItemRemoved;
@@ -183,7 +183,7 @@ namespace Migo.Syndication
 #region Private Methods
 
         private void OnUpdateTaskAdded (object sender, TaskEventArgs<FeedUpdateTask> e)
-        {   
+        {
             lock (update_task_group.SyncRoot) {
                 update_task_group.Execute ();
             }
@@ -194,13 +194,13 @@ namespace Migo.Syndication
             lock (update_task_group.SyncRoot) {
                 FeedUpdateTask fut = e.Task as FeedUpdateTask;
                 update_feed_map.Remove (fut.Feed);
-                
+
                 lock (update_task_list.SyncRoot) {
                     update_task_list.Remove (e.Task);
                 }
             }
         }
-        
+
 #endregion
 
     }
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedUpdateTask.cs b/src/Libraries/Migo/Migo.Syndication/FeedUpdateTask.cs
index 7d3064d..4097c2c 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedUpdateTask.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedUpdateTask.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Threading;
 using System.ComponentModel;
@@ -71,7 +71,7 @@ namespace Migo.Syndication
 
             this.feed = feed;
             this.Name = feed.Link;
-            
+
             feed.DownloadStatus = FeedDownloadStatus.Pending;
         }
 
@@ -80,11 +80,11 @@ namespace Migo.Syndication
 #region Public Methods
 
         public override void CancelAsync ()
-        { 
+        {
             lock (SyncRoot) {
                 if (!completed) {
                     cancelled = true;
-    
+
                     if (wc != null) {
                         wc.CancelAsync ();
                     }
@@ -93,18 +93,18 @@ namespace Migo.Syndication
                 }
             }
         }
-    
+
         public void Dispose ()
         {
             lock (SyncRoot) {
                 if (!disposed) {
                     if (mre != null) {
                         mre.Close ();
-                        mre = null;                    
+                        mre = null;
                     }
-                    
+
                     disposed = true;
-                }   
+                }
             }
         }
 
@@ -112,35 +112,35 @@ namespace Migo.Syndication
         {
             lock (SyncRoot) {
                 SetStatus (TaskStatus.Running);
-                
+
                 if (mre != null) {
-                    mre.Reset ();                    
-                }          
+                    mre.Reset ();
+                }
             }
-            
-            try {                                                                       
-                wc = new AsyncWebClient ();                  
-                wc.Timeout = (30 * 1000); // 30 Seconds  
+
+            try {
+                wc = new AsyncWebClient ();
+                wc.Timeout = (30 * 1000); // 30 Seconds
                 if (feed.LastDownloadTime != DateTime.MinValue) {
                     wc.IfModifiedSince = feed.LastDownloadTime.ToUniversalTime ();
                 }
                 wc.DownloadStringCompleted += OnDownloadDataReceived;
-                
+
                 feed.DownloadStatus = FeedDownloadStatus.Downloading;
                 wc.DownloadStringAsync (new Uri (feed.Url));
             } catch (Exception e) {
                 if (wc != null) {
                     wc.DownloadStringCompleted -= OnDownloadDataReceived;
                 }
-                
+
                 EmitCompletionEvents (FeedDownloadError.DownloadFailed);
                 Log.Exception (e);
             }
         }
-        
+
 #endregion
 
-        private void OnDownloadDataReceived (object sender, Migo.Net.DownloadStringCompletedEventArgs args) 
+        private void OnDownloadDataReceived (object sender, Migo.Net.DownloadStringCompletedEventArgs args)
         {
             bool notify_on_save = true;
             lock (SyncRoot) {
@@ -149,7 +149,7 @@ namespace Migo.Syndication
 
                 wc.DownloadStringCompleted -= OnDownloadDataReceived;
                 FeedDownloadError error;
-                
+
                 WebException we = args.Error as WebException;
                 if (we == null) {
                      try {
@@ -171,36 +171,36 @@ namespace Migo.Syndication
                         case HttpStatusCode.NotFound:
                         case HttpStatusCode.Gone:
                             error = FeedDownloadError.DoesNotExist;
-                            break;                                
+                            break;
                         case HttpStatusCode.NotModified:
                             notify_on_save = false;
                             error = FeedDownloadError.None;
                             break;
                         case HttpStatusCode.Unauthorized:
                             error = FeedDownloadError.UnsupportedAuth;
-                            break;                                
+                            break;
                         default:
                             error = FeedDownloadError.DownloadFailed;
                             break;
                         }
                     }
                 }
-                
+
                 feed.LastDownloadError = error;
                 if (error == FeedDownloadError.None) {
                     feed.LastDownloadTime = DateTime.Now;
                 }
-                    
+
                 feed.Save (notify_on_save);
-                
+
                 EmitCompletionEvents (error);
                 completed = true;
             }
         }
-        
+
         private void EmitCompletionEvents (FeedDownloadError err)
         {
-            switch (err) {                
+            switch (err) {
                 case FeedDownloadError.None:
                     SetStatus (TaskStatus.Succeeded);
                     feed.DownloadStatus = FeedDownloadStatus.Downloaded;
@@ -218,8 +218,8 @@ namespace Migo.Syndication
             OnTaskCompleted (null, (Status == TaskStatus.Cancelled));
 
             if (mre != null) {
-                mre.Set ();   
-            }                 
+                mre.Set ();
+            }
         }
 	}
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/FeedsManager.cs b/src/Libraries/Migo/Migo.Syndication/FeedsManager.cs
index 78c0942..185773e 100644
--- a/src/Libraries/Migo/Migo.Syndication/FeedsManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/FeedsManager.cs
@@ -1,37 +1,37 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedsManager.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 /*
     This needs to be completed and fixed.
-    
-    When I was writing this I was interrupted and wasn't able to get back to it 
-    for six months.  There are numerous issues with race conditions.  I'm 
-    resisting the urge to put in a bunch of hacks to patch the problem in favor 
+
+    When I was writing this I was interrupted and wasn't able to get back to it
+    for six months.  There are numerous issues with race conditions.  I'm
+    resisting the urge to put in a bunch of hacks to patch the problem in favor
     of going over it line by line and actually fixing it.
 */
 
@@ -52,31 +52,31 @@ using Migo.TaskCore.Collections;
 namespace Migo.Syndication
 {
     public class FeedsManager : IDisposable
-    {        
+    {
         private bool disposed;
 
         private AsyncCommandQueue command_queue;
-        
+
         private FeedManager feed_manager;
         private EnclosureManager enclosure_manager;
-        
-        private readonly object sync = new object (); 
-        
+
+        private readonly object sync = new object ();
+
         /*public event EventHandler<FeedEventArgs> FeedAdded;
         public event EventHandler<FeedEventArgs> FeedDeleted;
         public event EventHandler<FeedItemCountChangedEventArgs> FeedItemCountChanged;
         public event EventHandler<FeedEventArgs> FeedRenamed;
-        public event EventHandler<FeedEventArgs> FeedUrlChanged;        
-        
+        public event EventHandler<FeedEventArgs> FeedUrlChanged;
+
         public event EventHandler<FeedItemEventArgs> FeedItemAdded;
         public event EventHandler<FeedItemEventArgs> FeedItemRemoved;*/
-        
+
         public static FeedsManager Instance;
-        
+
         internal AsyncCommandQueue CommandQueue {
             get { return command_queue; }
         }
-        
+
 #region Public Properties
 
         public FeedBackgroundSyncStatus BackgroundSyncStatus {
@@ -85,35 +85,35 @@ namespace Migo.Syndication
                     return FeedBackgroundSyncStatus.Disabled;
                 }
             }
-        }        
-        
+        }
+
         // TODO interval for what, and in what unit?
         public long DefaultInterval {
             get { lock (sync) { return 15; } }
         }
-        
+
         /*private ReadOnlyCollection<Feed> ro_feeds;
-        public ReadOnlyCollection<Feed> Feeds {             
-            get { 
+        public ReadOnlyCollection<Feed> Feeds {
+            get {
                 lock (sync) {
                     return ro_feeds ?? ro_feeds = new ReadOnlyCollection<Feed> (feeds);
                 }
             }
         }*/
-        
+
         public FeedManager FeedManager {
             get { return feed_manager; }
         }
-        
+
         public EnclosureManager EnclosureManager {
             get { return enclosure_manager; }
         }
-        
+
         private HyenaSqliteConnection connection;
         public HyenaSqliteConnection Connection {
             get { return connection; }
         }
-        
+
         private string podcast_base_dir;
         public string PodcastStorageDirectory {
             get { return podcast_base_dir; }
@@ -123,9 +123,9 @@ namespace Migo.Syndication
 #endregion
 
 #region Constructor
-        
+
         public FeedsManager (HyenaSqliteConnection connection, DownloadManager downloadManager, string podcast_base_dir)
-        {            
+        {
             // Hack to work around Feeds being needy and having to call all our internal methods, instead
             // of us just listening for their events.
             Instance = this;
@@ -134,21 +134,21 @@ namespace Migo.Syndication
 
             feed_manager = new FeedManager ();
             enclosure_manager = new EnclosureManager (downloadManager);
-            
+
             Feed.Init ();
             FeedItem.Init ();
             FeedEnclosure.Init ();
-            
+
             command_queue = new AsyncCommandQueue ();
         }
-        
+
 #endregion
 
 #region Public Methods
 
-        public void Dispose () 
+        public void Dispose ()
         {
-            if (SetDisposed ()) {               
+            if (SetDisposed ()) {
                 AutoResetEvent disposeHandle = new AutoResetEvent (false);
 
                 feed_manager.Dispose (disposeHandle);
@@ -158,7 +158,7 @@ namespace Migo.Syndication
                     command_queue.Dispose ();
                     command_queue = null;
                 }
-                
+
                 disposeHandle.Close ();
             }
         }
@@ -166,10 +166,10 @@ namespace Migo.Syndication
 #endregion
 
 #region Private Methods
-        
 
 
-        /*private void OnFeedItemEvent (EventHandler<FeedItemEventArgs> handler, 
+
+        /*private void OnFeedItemEvent (EventHandler<FeedItemEventArgs> handler,
                                       FeedItemEventArgs e)
         {
             if (handler == null) {
@@ -177,22 +177,22 @@ namespace Migo.Syndication
             } else if (e == null) {
                 throw new ArgumentNullException ("e");
             }
-            
+
             command_queue.Register (
                 new EventWrapper<FeedItemEventArgs> (handler, this, e)
-            );            
-            
-            //handler (this, e);           
-        }        
-        
+            );
+
+            //handler (this, e);
+        }
+
         private void OnFeedEventRaised (Feed feed, EventHandler<FeedEventArgs> handler)
         {
             if (feed == null) {
                 throw new ArgumentNullException ("feed");	
             }
-            
+
             EventHandler<FeedEventArgs> handlerCpy = handler;
-            
+
             if (handlerCpy != null) {
                 command_queue.Register (
                     new EventWrapper<FeedEventArgs> (
@@ -202,41 +202,41 @@ namespace Migo.Syndication
             	//handler (this, new FeedEventArgs (feed));
             }
         }  */
-        
+
         private bool SetDisposed ()
         {
             bool ret = false;
-                
+
             lock (sync) {
                 if (!disposed) {
-                    ret = disposed = true;   
+                    ret = disposed = true;
                 }
             }
-                
+
             return ret;
-        }   
+        }
 
         /*private IEnumerable<HttpFileDownloadTask> FindDownloadTasks (IEnumerable<FeedEnclosure> enclosures)
-        {            
-            ICollection<HttpFileDownloadTask> encsCol = 
+        {
+            ICollection<HttpFileDownloadTask> encsCol =
                 enclosures as ICollection<HttpFileDownloadTask>;
-            
+
             List<HttpFileDownloadTask> ret = (encsCol == null) ?
-                new List<HttpFileDownloadTask> () : 
+                new List<HttpFileDownloadTask> () :
                 new List<HttpFileDownloadTask> (encsCol.Count);
-            
+
             HttpFileDownloadTask tmpTask = null;
-            
+
             lock (sync) {
                 foreach (FeedEnclosure enc in enclosures) {
                     tmpTask = FindDownloadTaskImpl ((FeedEnclosure)enc);
-                    
+
                     if (tmpTask != null) {
                         ret.Add (tmpTask);
                     }
                 }
             }
-            
+
             return ret;
         }*/
 
@@ -248,28 +248,28 @@ namespace Migo.Syndication
 /*        internal void RegisterCommand (ICommand command)
         {
              AsyncCommandQueue<ICommand> cmdQCpy = command_queue;
-            
+
             if (cmdQCpy != null && command != null) {
             	cmdQCpy.Register (command);
             }
         }
-        
+
         private void OnFeedAdded (Feed feed)
         {
             AsyncCommandQueue<ICommand> cmdQCpy = command_queue;
-            
-            if (cmdQCpy != null) {            
+
+            if (cmdQCpy != null) {
                 cmdQCpy.Register (new CommandWrapper (delegate {
                     OnFeedEventRaised (feed, FeedAdded);
                 }));
             }
         }
-        
+
         internal void OnFeedDeleted (Feed feed)
         {
             OnFeedEventRaised (feed, FeedDeleted);
         }
-        
+
         internal void OnFeedItemAdded (Feed feed, FeedItem item)
         {
             if (feed == null) {
@@ -278,26 +278,26 @@ namespace Migo.Syndication
                 throw new ArgumentNullException ("item");
             }
 
-            EventHandler<FeedItemEventArgs> handler = FeedItemAdded;            
-            
+            EventHandler<FeedItemEventArgs> handler = FeedItemAdded;
+
             if (handler != null) {
                 OnFeedItemEvent (handler, new FeedItemEventArgs (feed, item));
-            }                           
+            }
         }
-        
+
         internal void OnFeedItemsAdded (Feed feed, IEnumerable<FeedItem> items)
         {
             if (feed == null) {
                 throw new ArgumentNullException ("feed");
             } else if (items == null) {
                 throw new ArgumentNullException ("items");
-            } 
+            }
+
+            EventHandler<FeedItemEventArgs> handler = FeedItemAdded;
 
-            EventHandler<FeedItemEventArgs> handler = FeedItemAdded;            
-            
             if (handler != null) {
                 OnFeedItemEvent (handler, new FeedItemEventArgs (feed, items));
-            }               
+            }
         }
 
         internal void OnFeedItemCountChanged (Feed feed, FEEDS_EVENTS_ITEM_COUNT_FLAGS flags)
@@ -307,29 +307,29 @@ namespace Migo.Syndication
                     throw new ArgumentNullException ("feed");	
                 }
 
-                EventHandler<FeedItemCountChangedEventArgs> handler = FeedItemCountChanged;                
-                
+                EventHandler<FeedItemCountChangedEventArgs> handler = FeedItemCountChanged;
+
                 if (handler != null) {
                     command_queue.Register (
                         new EventWrapper<FeedItemCountChangedEventArgs> (
-                            handler, this, 
+                            handler, this,
                             new FeedItemCountChangedEventArgs (feed, flags)
                         )
-                    );       
+                    );
                 }
-            }    
-        }                
-                
+            }
+        }
+
         internal void OnFeedRenamed (Feed feed)
         {
             OnFeedEventRaised (feed, FeedRenamed);
         }
-        
+
         internal void OnFeedUrlChanged (Feed feed)
         {
             OnFeedEventRaised (feed, FeedUrlChanged);
         }*/
-        
-#endregion 
-    }   
-}    
+
+#endregion
+    }
+}
diff --git a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/EnclosuresTableManager.cs b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/EnclosuresTableManager.cs
index aafb3f9..aedc431 100644
--- a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/EnclosuresTableManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/EnclosuresTableManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  EnclosuresTableManager.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -32,14 +32,14 @@ using System.Collections;
 using System.Collections.Generic;
 
 namespace Migo.Syndication.Data
-{    
+{
     /*static class EnclosuresTableManager
-    {        
+    {
         private const string initQuery = @"
             CREATE TABLE IF NOT EXISTS enclosures (
-            	'local_id' INTEGER  PRIMARY KEY, 
+            	'local_id' INTEGER  PRIMARY KEY,
             	'parent_id' INTEGER NOT NULL DEFAULT '-1',	
-            	'active' INTEGER NOT NULL DEFAULT '0', 
+            	'active' INTEGER NOT NULL DEFAULT '0',
             	'download_mime_type' TEXT NOT NULL DEFAULT '',
                 'download_url' TEXT NOT NULL DEFAULT '',
                 'last_download_error' INTEGER NOT NULL DEFAULT '0',
@@ -48,20 +48,20 @@ namespace Migo.Syndication.Data
             	'type' TEXT NOT NULL DEFAULT '',
             	'url' TEXT NOT NULL DEFAULT ''
             );
-            
+
             CREATE INDEX IF NOT EXISTS enclosures_local_id_index ON enclosures(local_id);
-            CREATE INDEX IF NOT EXISTS enclosures_parent_id_index ON enclosures(parent_id);            
+            CREATE INDEX IF NOT EXISTS enclosures_parent_id_index ON enclosures(parent_id);
         ";
-        
-        private static readonly string insertIntoEnclosuresQuery =             
-            String.Format ( 
+
+        private static readonly string insertIntoEnclosuresQuery =
+            String.Format (
                 @"INSERT INTO enclosures VALUES (
                     NULL, {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}
                 ); {9}",
-                DbDefines.EnclosuresTableColumns.ParentIDParameter, 
+                DbDefines.EnclosuresTableColumns.ParentIDParameter,
                 DbDefines.EnclosuresTableColumns.ActiveParameter,
-                DbDefines.EnclosuresTableColumns.DownloadMimeTypeParameter, 
-                DbDefines.EnclosuresTableColumns.DownloadUrlParameter, 
+                DbDefines.EnclosuresTableColumns.DownloadMimeTypeParameter,
+                DbDefines.EnclosuresTableColumns.DownloadUrlParameter,
                 DbDefines.EnclosuresTableColumns.LastDownloadErrorParameter,
                 DbDefines.EnclosuresTableColumns.LengthParameter,
                 DbDefines.EnclosuresTableColumns.LocalPathParameter,
@@ -70,195 +70,195 @@ namespace Migo.Syndication.Data
                 DbDefines.LastInsertIDQuery
             );
 
-        private static readonly string updateEnclosuresQuery = 
+        private static readonly string updateEnclosuresQuery =
             String.Format (
-                @"UPDATE enclosures SET 
-                    {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11}, 
+                @"UPDATE enclosures SET
+                    {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11},
                     {12}={13}, {14}={15}, {16}={17}, {18}={19}
                   WHERE {0}={1}",
-                    DbDefines.EnclosuresTableColumns.LocalID, 
+                    DbDefines.EnclosuresTableColumns.LocalID,
                     DbDefines.EnclosuresTableColumns.LocalIDParameter,
                     DbDefines.EnclosuresTableColumns.ParentID,
-                    DbDefines.EnclosuresTableColumns.ParentIDParameter,   
+                    DbDefines.EnclosuresTableColumns.ParentIDParameter,
                     DbDefines.EnclosuresTableColumns.Active,
-                    DbDefines.EnclosuresTableColumns.ActiveParameter,                       
-                    DbDefines.EnclosuresTableColumns.DownloadMimeType, 
-                    DbDefines.EnclosuresTableColumns.DownloadMimeTypeParameter,                           
-                    DbDefines.EnclosuresTableColumns.DownloadUrl, 
-                    DbDefines.EnclosuresTableColumns.DownloadUrlParameter, 
-                    DbDefines.EnclosuresTableColumns.LastDownloadError, 
-                    DbDefines.EnclosuresTableColumns.LastDownloadErrorParameter,                            
-                    DbDefines.EnclosuresTableColumns.Length, 
-                    DbDefines.EnclosuresTableColumns.LengthParameter,                            
-                    DbDefines.EnclosuresTableColumns.LocalPath, 
-                    DbDefines.EnclosuresTableColumns.LocalPathParameter,                            
+                    DbDefines.EnclosuresTableColumns.ActiveParameter,
+                    DbDefines.EnclosuresTableColumns.DownloadMimeType,
+                    DbDefines.EnclosuresTableColumns.DownloadMimeTypeParameter,
+                    DbDefines.EnclosuresTableColumns.DownloadUrl,
+                    DbDefines.EnclosuresTableColumns.DownloadUrlParameter,
+                    DbDefines.EnclosuresTableColumns.LastDownloadError,
+                    DbDefines.EnclosuresTableColumns.LastDownloadErrorParameter,
+                    DbDefines.EnclosuresTableColumns.Length,
+                    DbDefines.EnclosuresTableColumns.LengthParameter,
+                    DbDefines.EnclosuresTableColumns.LocalPath,
+                    DbDefines.EnclosuresTableColumns.LocalPathParameter,
                     DbDefines.EnclosuresTableColumns.Type,
-                    DbDefines.EnclosuresTableColumns.TypeParameter,                            
-                    DbDefines.EnclosuresTableColumns.Url,  
-                    DbDefines.EnclosuresTableColumns.UrlParameter                          
+                    DbDefines.EnclosuresTableColumns.TypeParameter,
+                    DbDefines.EnclosuresTableColumns.Url,
+                    DbDefines.EnclosuresTableColumns.UrlParameter
             );
-        
+
         public static void Init ()
         {
-            DatabaseManager.ExecuteNonQuery (initQuery); 
+            DatabaseManager.ExecuteNonQuery (initQuery);
         }
-        
+
         public static bool Commit (IEnumerable<FeedEnclosure> enclosures)
         {
             if (enclosures == null) {
                 throw new ArgumentNullException ("enclosures");
-            }    
-            
+            }
+
             bool ret = false;
-        
-            try {            
-                ICollection<FeedEnclosure> enclosureCol = 
+
+            try {
+                ICollection<FeedEnclosure> enclosureCol =
                     enclosures as ICollection<FeedEnclosure>;
-            
-                Dictionary<QueuedDbCommand,FeedEnclosure> enclosureCommandPairs = 
-                    (enclosureCol == null) ? new Dictionary<QueuedDbCommand,FeedEnclosure> () : 
+
+                Dictionary<QueuedDbCommand,FeedEnclosure> enclosureCommandPairs =
+                    (enclosureCol == null) ? new Dictionary<QueuedDbCommand,FeedEnclosure> () :
                     new Dictionary<QueuedDbCommand,FeedEnclosure> (enclosureCol.Count);
-                
+
                 foreach (FeedEnclosure enc in enclosures) {
                     enclosureCommandPairs.Add (
                         QueuedDbCommand.CreateScalar (
                             EnclosuresTableManager.CreateInsertCommand (enc)
                         ), enc
-                    );          
+                    );
                 }
-                
+
                 DatabaseManager.Enqueue (enclosureCommandPairs.Keys);
-                
+
                 foreach (KeyValuePair<QueuedDbCommand,FeedEnclosure> kvp in enclosureCommandPairs) {
                     kvp.Value.DbId = Convert.ToInt64 (kvp.Key.ScalarResult);
-                }  
+                }
             } catch {}
-        
+
             return ret;
-        }        
-        
+        }
+
         public static IDbCommand CreateInsertCommand (FeedEnclosure enclosure)
         {
             if (enclosure == null) {
                 throw new ArgumentNullException ("enclosure");
             }
-            
+
             return CreateInsertCommandImpl (enclosure);
         }
-        
+
         private static IDbCommand CreateInsertCommandImpl (FeedEnclosure enclosure)
         {
             return DatabaseManager.CreateCommand (
                 insertIntoEnclosuresQuery,
-                DbDefines.EnclosuresTableColumns.ParentID, 
+                DbDefines.EnclosuresTableColumns.ParentID,
                 enclosure.Parent.LocalID.ToString (),
                 DbDefines.EnclosuresTableColumns.Active,
-                (enclosure.Active) ? "1" : "0",                                               
-                DbDefines.EnclosuresTableColumns.DownloadMimeType, 
+                (enclosure.Active) ? "1" : "0",
+                DbDefines.EnclosuresTableColumns.DownloadMimeType,
                 enclosure.MimeType,
-                DbDefines.EnclosuresTableColumns.DownloadUrl, 
+                DbDefines.EnclosuresTableColumns.DownloadUrl,
                 enclosure.DownloadUrl,
                 DbDefines.EnclosuresTableColumns.LastDownloadError,
                 ((int)enclosure.LastDownloadError).ToString (),
-                DbDefines.EnclosuresTableColumns.Length, 
+                DbDefines.EnclosuresTableColumns.Length,
                 enclosure.Length.ToString (),
-                DbDefines.EnclosuresTableColumns.LocalPath, 
+                DbDefines.EnclosuresTableColumns.LocalPath,
                 enclosure.LocalPath,
-                DbDefines.EnclosuresTableColumns.Type, 
+                DbDefines.EnclosuresTableColumns.Type,
                 enclosure.Type,
-                DbDefines.EnclosuresTableColumns.Url, 
-                enclosure.Url 
+                DbDefines.EnclosuresTableColumns.Url,
+                enclosure.Url
             );
         }
-        
+
         public static long Insert (FeedEnclosure enclosure)
         {
             if (enclosure == null) {
                 throw new ArgumentNullException ("enclosure");
             }
-            
+
             long ret = -1;
-            
+
             if (enclosure.Parent == null) {
                 return ret;
-            }            
-            
+            }
+
             ret = Convert.ToInt64 (
                 DatabaseManager.ExecuteScalar (
                     CreateInsertCommandImpl (enclosure)
                 )
-            );             
-            
+            );
+
             return ret;
         }
-        
+
         public static bool Insert (IEnumerable<FeedEnclosure> enclosures)
         {
             if (enclosures == null) {
                 throw new ArgumentNullException ("enclosures");
-            }    
-            
+            }
+
             bool ret = false;
-        
+
             try {
-                foreach (FeedEnclosure e in enclosures) {                
+                foreach (FeedEnclosure e in enclosures) {
                     Insert (e);
                 }
-                
+
                 ret = true;
-            } catch {}     
-            
+            } catch {}
+
             return ret;
-        }           
+        }
 
         public static void Update (FeedEnclosure enclosure)
         {
             if (enclosure == null) {
-                throw new ArgumentNullException ("enclosure");       
-            }   
+                throw new ArgumentNullException ("enclosure");
+            }
 
             DatabaseManager.ExecuteNonQuery (
-                updateEnclosuresQuery, 
-                DbDefines.EnclosuresTableColumns.LocalID, 
+                updateEnclosuresQuery,
+                DbDefines.EnclosuresTableColumns.LocalID,
                 enclosure.DbId.ToString (),
-                DbDefines.EnclosuresTableColumns.ParentID, 
+                DbDefines.EnclosuresTableColumns.ParentID,
                 (enclosure.Parent != null) ? enclosure.Parent.LocalID.ToString () : "-1",
                 DbDefines.EnclosuresTableColumns.Active,
-                (enclosure.Active) ? "1" : "0",                                                                                            
-                DbDefines.EnclosuresTableColumns.DownloadMimeType, 
+                (enclosure.Active) ? "1" : "0",
+                DbDefines.EnclosuresTableColumns.DownloadMimeType,
                 enclosure.MimeType,
-                DbDefines.EnclosuresTableColumns.DownloadUrl, 
+                DbDefines.EnclosuresTableColumns.DownloadUrl,
                 enclosure.DownloadUrl,
                 DbDefines.EnclosuresTableColumns.LastDownloadError,
                 ((int)enclosure.LastDownloadError).ToString (),
-                DbDefines.EnclosuresTableColumns.Length, 
+                DbDefines.EnclosuresTableColumns.Length,
                 enclosure.Length.ToString (),
-                DbDefines.EnclosuresTableColumns.LocalPath, 
+                DbDefines.EnclosuresTableColumns.LocalPath,
                 enclosure.LocalPath,
-                DbDefines.EnclosuresTableColumns.Type, 
+                DbDefines.EnclosuresTableColumns.Type,
                 enclosure.Type,
-                DbDefines.EnclosuresTableColumns.Url, 
+                DbDefines.EnclosuresTableColumns.Url,
                 enclosure.Url
             );
-        }    
-        
+        }
+
         public static bool Update (IEnumerable<FeedEnclosure> enclosures)
         {
             if (enclosures == null) {
                 throw new ArgumentNullException ("enclosures");
-            }    
-            
+            }
+
             bool ret = false;
-        
+
             try {
-                foreach (FeedEnclosure e in enclosures) {                
+                foreach (FeedEnclosure e in enclosures) {
                     Update (e);
                 }
-                
+
                 ret = true;
-            } catch {}   
-            
+            } catch {}
+
             return ret;
-        }           
+        }
     }*/
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/FeedsTableManager.cs b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/FeedsTableManager.cs
index 315894b..6a28a3e 100644
--- a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/FeedsTableManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/FeedsTableManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  FeedsTableManager.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -34,35 +34,35 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
 namespace Migo.Syndication.Data
-{    
+{
     /*class FeedsTableManager
-    {     
-        public static readonly string initQuery = @" 
+    {
+        public static readonly string initQuery = @"
             CREATE TABLE IF NOT EXISTS feeds (
-            	'local_id' INTEGER  PRIMARY KEY, 
-            	'copyright' TEXT NOT NULL DEFAULT '', 
-            	'description' TEXT NOT NULL DEFAULT '', 
-            	'download_enclosures_automatically' INTEGER NOT NULL DEFAULT '0', 
-            	'download_url' TEXT NOT NULL DEFAULT '', 
-            	'image' TEXT NOT NULL DEFAULT '', 
-            	'interval' INTEGER NOT NULL DEFAULT '1440', 
-            	'is_list' INTEGER NOT NULL DEFAULT '0', 
-            	'language' TEXT NOT NULL DEFAULT '', 
-            	'last_build_date' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
-            	'last_download_error' INTEGER NOT NULL DEFAULT '0', 
-            	'last_download_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
-            	'last_write_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
-            	'link' TEXT NOT NULL DEFAULT '', 
-            	'local_enclosure_path' TEXT NOT NULL DEFAULT '', 
-            	'max_item_count' INTEGER NOT NULL DEFAULT '200', 
-            	'name' TEXT NOT NULL DEFAULT '', 
-            	'pubdate' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
-            	'sync_setting' INTEGER NOT NULL DEFAULT '0', 
-            	'title' TEXT NOT NULL DEFAULT '', 
-            	'ttl' INTEGER NOT NULL DEFAULT '0', 
+            	'local_id' INTEGER  PRIMARY KEY,
+            	'copyright' TEXT NOT NULL DEFAULT '',
+            	'description' TEXT NOT NULL DEFAULT '',
+            	'download_enclosures_automatically' INTEGER NOT NULL DEFAULT '0',
+            	'download_url' TEXT NOT NULL DEFAULT '',
+            	'image' TEXT NOT NULL DEFAULT '',
+            	'interval' INTEGER NOT NULL DEFAULT '1440',
+            	'is_list' INTEGER NOT NULL DEFAULT '0',
+            	'language' TEXT NOT NULL DEFAULT '',
+            	'last_build_date' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
+            	'last_download_error' INTEGER NOT NULL DEFAULT '0',
+            	'last_download_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
+            	'last_write_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
+            	'link' TEXT NOT NULL DEFAULT '',
+            	'local_enclosure_path' TEXT NOT NULL DEFAULT '',
+            	'max_item_count' INTEGER NOT NULL DEFAULT '200',
+            	'name' TEXT NOT NULL DEFAULT '',
+            	'pubdate' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
+            	'sync_setting' INTEGER NOT NULL DEFAULT '0',
+            	'title' TEXT NOT NULL DEFAULT '',
+            	'ttl' INTEGER NOT NULL DEFAULT '0',
             	'url' TEXT NOT NULL DEFAULT ''
             );
-            
+
             CREATE TRIGGER IF NOT EXISTS feed_deleted_trigger
                AFTER DELETE ON feeds
             BEGIN
@@ -71,14 +71,14 @@ namespace Migo.Syndication.Data
 
             CREATE INDEX IF NOT EXISTS feeds_local_id_index ON feeds(local_id);";
 
-        private static readonly string deleteFromFeedsBaseQuery = "DELETE FROM feeds WHERE";        
-        private static readonly string insertIntoFeedsQuery = 
-            String.Format ( 
+        private static readonly string deleteFromFeedsBaseQuery = "DELETE FROM feeds WHERE";
+        private static readonly string insertIntoFeedsQuery =
+            String.Format (
                 @"INSERT INTO feeds VALUES (
-                    NULL, {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, 
+                    NULL, {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10},
                     {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}
                 ); {21}",
-                DbDefines.FeedsTableColumns.CopyrightParameter, DbDefines.FeedsTableColumns.DescriptionParameter, 
+                DbDefines.FeedsTableColumns.CopyrightParameter, DbDefines.FeedsTableColumns.DescriptionParameter,
                 DbDefines.FeedsTableColumns.DownloadEnclosuresAutomaticallyParameter,
                 DbDefines.FeedsTableColumns.DownloadUrlParameter, DbDefines.FeedsTableColumns.ImageParameter,
                 DbDefines.FeedsTableColumns.IntervalParameter, DbDefines.FeedsTableColumns.IsListParameter,
@@ -88,88 +88,88 @@ namespace Migo.Syndication.Data
                 DbDefines.FeedsTableColumns.LocalEnclosurePathParameter, DbDefines.FeedsTableColumns.MaxItemCountParameter,
                 DbDefines.FeedsTableColumns.NameParameter, DbDefines.FeedsTableColumns.PubDateParameter,
                 DbDefines.FeedsTableColumns.SyncSettingParameter, DbDefines.FeedsTableColumns.TitleParameter,
-                DbDefines.FeedsTableColumns.TtlParameter, DbDefines.FeedsTableColumns.UrlParameter, 
+                DbDefines.FeedsTableColumns.TtlParameter, DbDefines.FeedsTableColumns.UrlParameter,
                 DbDefines.LastInsertIDQuery
             );
-                           
+
         private static readonly string selectAllFeedsQuery = "SELECT * FROM feeds;";
-        private static readonly string selectAllFeedItemsQuery = "SELECT * FROM items;";      
-        private static readonly string selectAllFeedEnclosuresQuery = "SELECT * FROM enclosures;";                
-             
-        private static readonly string updateFeedQuery = 
+        private static readonly string selectAllFeedItemsQuery = "SELECT * FROM items;";
+        private static readonly string selectAllFeedEnclosuresQuery = "SELECT * FROM enclosures;";
+
+        private static readonly string updateFeedQuery =
             String.Format (
-                @"UPDATE feeds SET 
+                @"UPDATE feeds SET
                     {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11}, {12}={13}, {14}={15}, {16}={17},
                     {18}={19}, {20}={21}, {22}={23}, {24}={25}, {26}={27}, {28}={29}, {30}={31},
-                    {32}={33}, {34}={35}, {36}={37}, {38}={39}, {40}={41}, {42}={43} 
+                    {32}={33}, {34}={35}, {36}={37}, {38}={39}, {40}={41}, {42}={43}
                     WHERE {0}={1};",
-                    DbDefines.FeedsTableColumns.LocalID, DbDefines.FeedsTableColumns.LocalIDParameter,                                                     
-                    DbDefines.FeedsTableColumns.Copyright, DbDefines.FeedsTableColumns.CopyrightParameter, 
-                    DbDefines.FeedsTableColumns.Description, DbDefines.FeedsTableColumns.DescriptionParameter, 
-                    DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically,                    
+                    DbDefines.FeedsTableColumns.LocalID, DbDefines.FeedsTableColumns.LocalIDParameter,
+                    DbDefines.FeedsTableColumns.Copyright, DbDefines.FeedsTableColumns.CopyrightParameter,
+                    DbDefines.FeedsTableColumns.Description, DbDefines.FeedsTableColumns.DescriptionParameter,
+                    DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically,
                     DbDefines.FeedsTableColumns.DownloadEnclosuresAutomaticallyParameter,
-                    DbDefines.FeedsTableColumns.DownloadUrl, DbDefines.FeedsTableColumns.DownloadUrlParameter, 
+                    DbDefines.FeedsTableColumns.DownloadUrl, DbDefines.FeedsTableColumns.DownloadUrlParameter,
                     DbDefines.FeedsTableColumns.Image, DbDefines.FeedsTableColumns.ImageParameter,
-                    DbDefines.FeedsTableColumns.Interval, DbDefines.FeedsTableColumns.IntervalParameter, 
+                    DbDefines.FeedsTableColumns.Interval, DbDefines.FeedsTableColumns.IntervalParameter,
                     DbDefines.FeedsTableColumns.IsList, DbDefines.FeedsTableColumns.IsListParameter,
-                    DbDefines.FeedsTableColumns.Language, DbDefines.FeedsTableColumns.LanguageParameter, 
+                    DbDefines.FeedsTableColumns.Language, DbDefines.FeedsTableColumns.LanguageParameter,
                     DbDefines.FeedsTableColumns.LastBuildDate, DbDefines.FeedsTableColumns.LastBuildDateParameter,
-                    DbDefines.FeedsTableColumns.LastDownloadError, DbDefines.FeedsTableColumns.LastDownloadErrorParameter, 
+                    DbDefines.FeedsTableColumns.LastDownloadError, DbDefines.FeedsTableColumns.LastDownloadErrorParameter,
                     DbDefines.FeedsTableColumns.LastDownloadTime, DbDefines.FeedsTableColumns.LastDownloadTimeParameter,
-                    DbDefines.FeedsTableColumns.LastWriteTime, DbDefines.FeedsTableColumns.LastWriteTimeParameter, 
+                    DbDefines.FeedsTableColumns.LastWriteTime, DbDefines.FeedsTableColumns.LastWriteTimeParameter,
                     DbDefines.FeedsTableColumns.Link, DbDefines.FeedsTableColumns.LinkParameter,
-                    DbDefines.FeedsTableColumns.LocalEnclosurePath, DbDefines.FeedsTableColumns.LocalEnclosurePathParameter, 
+                    DbDefines.FeedsTableColumns.LocalEnclosurePath, DbDefines.FeedsTableColumns.LocalEnclosurePathParameter,
                     DbDefines.FeedsTableColumns.MaxItemCount, DbDefines.FeedsTableColumns.MaxItemCountParameter,
-                    DbDefines.FeedsTableColumns.Name, DbDefines.FeedsTableColumns.NameParameter, 
+                    DbDefines.FeedsTableColumns.Name, DbDefines.FeedsTableColumns.NameParameter,
                     DbDefines.FeedsTableColumns.PubDate, DbDefines.FeedsTableColumns.PubDateParameter,
-                    DbDefines.FeedsTableColumns.SyncSetting, DbDefines.FeedsTableColumns.SyncSettingParameter, 
+                    DbDefines.FeedsTableColumns.SyncSetting, DbDefines.FeedsTableColumns.SyncSettingParameter,
                     DbDefines.FeedsTableColumns.Title, DbDefines.FeedsTableColumns.TitleParameter,
-                    DbDefines.FeedsTableColumns.Ttl, DbDefines.FeedsTableColumns.TtlParameter, 
+                    DbDefines.FeedsTableColumns.Ttl, DbDefines.FeedsTableColumns.TtlParameter,
                     DbDefines.FeedsTableColumns.Url, DbDefines.FeedsTableColumns.UrlParameter
             );
-      
-        
+
+
         public static bool Commit (IEnumerable<Feed> feeds)
         {
             if (feeds == null) {
                 throw new ArgumentNullException ("feeds");
-            }    
-            
+            }
+
             bool ret = false;
-            
+
             try {
-                foreach (Feed f in feeds) {                
+                foreach (Feed f in feeds) {
                     f.Commit ();
                 }
-                
+
                 ret = true;
-            } catch {} 
-            
+            } catch {}
+
             return ret;
-        }          
-        
+        }
+
         public static List<Feed> GetAllFeeds (FeedsManager manager)
         {
             if (manager == null) {
                 throw new ArgumentNullException ("manager");
             }
-            
+
             DateTime start = DateTime.Now;
             Console.WriteLine (start);
-            
-            List<Feed> feeds;       
+
+            List<Feed> feeds;
             Dictionary<long,ICollection<FeedItem>> feedItems;
-            Dictionary<long,FeedEnclosure> feedEnclosures;               
-                        
-            feedEnclosures = BuildEnclosuresDict ();            
+            Dictionary<long,FeedEnclosure> feedEnclosures;
+
+            feedEnclosures = BuildEnclosuresDict ();
             feedItems = BuildItemsDict (feedEnclosures);
             feeds = BuildFeedsList (manager, feedItems);
-                        
+
             feedItems.Clear ();
             feedEnclosures.Clear ();
-            
+
             Console.WriteLine (DateTime.Now - start);
-            return feeds;    
+            return feeds;
         }
 
         public static void Delete (Feed feed)
@@ -181,61 +181,61 @@ namespace Migo.Syndication.Data
             DatabaseManager.ExecuteNonQuery (
                 String.Format (
                     "{0} {1}={2};",
-                    deleteFromFeedsBaseQuery, 
-                    DbDefines.FeedsTableColumns.LocalID, 
+                    deleteFromFeedsBaseQuery,
+                    DbDefines.FeedsTableColumns.LocalID,
                     DbDefines.FeedsTableColumns.LocalIDParameter
-                ), 
-                DbDefines.FeedsTableColumns.LocalID, 
+                ),
+                DbDefines.FeedsTableColumns.LocalID,
                 feed.LocalID.ToString ()
             );
         }
-        
+
         public static void Delete (IEnumerable<Feed> feeds)
         {
             if (feeds == null) {
             	throw new ArgumentNullException ("feeds");
             }
-            
+
             List<long> ids = new List<long> ();
-            
+
             foreach (Feed f in feeds) {
                 if (f != null) {
                     ids.Add (f.LocalID);
                 }
             }
-            
+
             if (ids.Count > 0) {
                 string query = DataUtility.MultipleOnIDQuery (
                     deleteFromFeedsBaseQuery, DbDefines.FeedsTableColumns.LocalID, ids.ToArray ()
                 );
-                
+
                 DatabaseManager.ExecuteNonQuery (query);
             }
-        }        
-        
+        }
+
         public static void Init ()
         {
-            DatabaseManager.ExecuteNonQuery (initQuery);               
+            DatabaseManager.ExecuteNonQuery (initQuery);
         }
-        
+
         public static long Insert (Feed feed)
         {
             if (feed == null) {
                 throw new ArgumentNullException ("feed");
             } else if (feed.LocalID > 0) {
                 return feed.LocalID;
-            }   
-            
+            }
+
             long ret = -1;
-                        
-            try {            
+
+            try {
                 ret = Convert.ToInt64 (
-                    DatabaseManager.ExecuteScalar (                
+                    DatabaseManager.ExecuteScalar (
                         insertIntoFeedsQuery,
                         DbDefines.FeedsTableColumns.Copyright, feed.Copyright == null ? String.Empty : feed.Copyright,
                         DbDefines.FeedsTableColumns.Description, feed.Description == null ? String.Empty : feed.Description,
-                        DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically.ToString (), 
-                        feed.DownloadEnclosuresAutomatically.ToString (),  
+                        DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically.ToString (),
+                        feed.DownloadEnclosuresAutomatically.ToString (),
                         DbDefines.FeedsTableColumns.DownloadUrl, feed.DownloadUrl == null ? String.Empty : feed.DownloadUrl,
                         DbDefines.FeedsTableColumns.Image, feed.Image == null ? String.Empty : feed.Image,
                         DbDefines.FeedsTableColumns.Interval, feed.Interval.ToString (),
@@ -246,10 +246,10 @@ namespace Migo.Syndication.Data
                         DbDefines.FeedsTableColumns.LastDownloadTime, feed.LastDownloadTime.ToUniversalTime ().ToString ("u"),
                         DbDefines.FeedsTableColumns.LastWriteTime, feed.LastWriteTime.ToUniversalTime ().ToString ("u"),
                         DbDefines.FeedsTableColumns.Link, feed.Link == null ? String.Empty : feed.Link,
-                        DbDefines.FeedsTableColumns.LocalEnclosurePath, feed.LocalEnclosurePath == null ? String.Empty : feed.LocalEnclosurePath,  
+                        DbDefines.FeedsTableColumns.LocalEnclosurePath, feed.LocalEnclosurePath == null ? String.Empty : feed.LocalEnclosurePath,
                         DbDefines.FeedsTableColumns.MaxItemCount, feed.MaxItemCount.ToString (),
                         DbDefines.FeedsTableColumns.Name, feed.Name == null ? String.Empty : feed.Name,
-                        DbDefines.FeedsTableColumns.PubDate, feed.PubDate.ToUniversalTime ().ToString ("u"), 
+                        DbDefines.FeedsTableColumns.PubDate, feed.PubDate.ToUniversalTime ().ToString ("u"),
                         DbDefines.FeedsTableColumns.SyncSetting, ((int)feed.SyncSetting).ToString (),
                         DbDefines.FeedsTableColumns.Title, feed.Title == null ? String.Empty : feed.Title,
                         DbDefines.FeedsTableColumns.Ttl, feed.Ttl.ToString (),
@@ -257,44 +257,44 @@ namespace Migo.Syndication.Data
                     )
                 );
             } catch {}
-            
+
             Console.WriteLine ("feed.LocalID:  {0}", ret);
-            
+
             return ret;
         }
-        
+
         public static bool Insert (IEnumerable<Feed> feeds)
         {
             if (feeds == null) {
                 throw new ArgumentNullException ("feeds");
-            }    
-            
+            }
+
             bool ret = false;
-            
+
             try {
-                foreach (Feed f in feeds) {                
+                foreach (Feed f in feeds) {
                     Insert (f);
                 }
-                
+
                 ret = true;
             } catch {}
-        
+
             return ret;
-        }          
-        
+        }
+
         public static void Update (Feed feed)
         {
             if (feed == null) {
-                throw new ArgumentNullException ("feed");       
-            }   
+                throw new ArgumentNullException ("feed");
+            }
 
             DatabaseManager.ExecuteNonQuery (
                 updateFeedQuery,
-                DbDefines.FeedsTableColumns.LocalID, feed.LocalID.ToString (),                                             
+                DbDefines.FeedsTableColumns.LocalID, feed.LocalID.ToString (),
                 DbDefines.FeedsTableColumns.Copyright, feed.Copyright == null ? String.Empty : feed.Copyright,
                 DbDefines.FeedsTableColumns.Description, feed.Description == null ? String.Empty : feed.Description,
-                DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically.ToString (), 
-                feed.DownloadEnclosuresAutomatically.ToString (),  
+                DbDefines.FeedsTableColumns.DownloadEnclosuresAutomatically.ToString (),
+                feed.DownloadEnclosuresAutomatically.ToString (),
                 DbDefines.FeedsTableColumns.DownloadUrl, feed.DownloadUrl == null ? String.Empty : feed.DownloadUrl,
                 DbDefines.FeedsTableColumns.Image, feed.Image == null ? String.Empty : feed.Image,
                 DbDefines.FeedsTableColumns.Interval, feed.Interval.ToString (),
@@ -305,128 +305,128 @@ namespace Migo.Syndication.Data
                 DbDefines.FeedsTableColumns.LastDownloadTime, feed.LastDownloadTime.ToUniversalTime ().ToString ("u"),
                 DbDefines.FeedsTableColumns.LastWriteTime, feed.LastWriteTime.ToUniversalTime ().ToString ("u"),
                 DbDefines.FeedsTableColumns.Link, feed.Link == null ? String.Empty : feed.Link,
-                DbDefines.FeedsTableColumns.LocalEnclosurePath, feed.LocalEnclosurePath == null ? String.Empty : feed.LocalEnclosurePath,  
+                DbDefines.FeedsTableColumns.LocalEnclosurePath, feed.LocalEnclosurePath == null ? String.Empty : feed.LocalEnclosurePath,
                 DbDefines.FeedsTableColumns.MaxItemCount, feed.MaxItemCount.ToString (),
                 DbDefines.FeedsTableColumns.Name, feed.Name == null ? String.Empty : feed.Name,
-                DbDefines.FeedsTableColumns.PubDate, feed.PubDate.ToUniversalTime ().ToString ("u"), 
+                DbDefines.FeedsTableColumns.PubDate, feed.PubDate.ToUniversalTime ().ToString ("u"),
                 DbDefines.FeedsTableColumns.SyncSetting, ((int)feed.SyncSetting).ToString (),
                 DbDefines.FeedsTableColumns.Title, feed.Title == null ? String.Empty : feed.Title,
                 DbDefines.FeedsTableColumns.Ttl, feed.Ttl.ToString (),
                 DbDefines.FeedsTableColumns.Url, feed.Url == null ? String.Empty : feed.Url
             );
         }
-        
+
         public static bool Update (IEnumerable<Feed> feeds)
         {
             if (feeds == null) {
                 throw new ArgumentNullException ("feeds");
-            }    
-            
+            }
+
             bool ret = false;
-            
+
             try {
-                foreach (Feed f in feeds) {                
+                foreach (Feed f in feeds) {
                     Update (f);
                     ret = true;
                 }
             } catch {}
-           
+
             return ret;
-        }           
-        
+        }
+
         private static Dictionary<long,FeedEnclosure> BuildEnclosuresDict ()
         {
-            IDataReader reader = null;            
-            Dictionary<long,FeedEnclosure> ret = 
-                new Dictionary<long,FeedEnclosure> ();            
-            
+            IDataReader reader = null;
+            Dictionary<long,FeedEnclosure> ret =
+                new Dictionary<long,FeedEnclosure> ();
+
             try {
                 FeedEnclosure tmpFE;
                 reader = DatabaseManager.ExecuteReader (selectAllFeedEnclosuresQuery);
                 FeedEnclosureDataWrapper fedw = new FeedEnclosureDataWrapper (reader);
-                        
+
                 while (fedw.Read ()) {
                     tmpFE = new FeedEnclosure (fedw);
                     ret.Add (fedw.ParentID, tmpFE);
                 }
-            } finally {                
+            } finally {
                 if (reader != null) {
                     reader.Dispose ();
-                    reader = null;                    
+                    reader = null;
                 }
             }
-            
+
             return ret;
         }
-        
-        private static Dictionary<long,ICollection<FeedItem>> 
+
+        private static Dictionary<long,ICollection<FeedItem>>
             BuildItemsDict (Dictionary<long,FeedEnclosure> feedEnclosures)
         {
-            IDataReader reader = null;            
+            IDataReader reader = null;
             Dictionary<long,ICollection<FeedItem>> ret =
                 new Dictionary<long,ICollection<FeedItem>> ();
-            
+
             try {
-                FeedItem tmpItem;            
-                
+                FeedItem tmpItem;
+
                 DateTime start = DateTime.Now;
                 reader = DatabaseManager.ExecuteReader (selectAllFeedItemsQuery);
                 Console.WriteLine ("Time to select all feed items:  {0}", DateTime.Now-start);
 
                 FeedItemDataWrapper fidw = new FeedItemDataWrapper (reader);
-                        
+
                 while (fidw.Read ()) {
                     tmpItem = new FeedItem (fidw);
-                            
+
                     if (!ret.ContainsKey (fidw.ParentID)) {
                         ret.Add (fidw.ParentID, new List<FeedItem> ());
                     }
-                        
+
                     ret[fidw.ParentID].Add (tmpItem);
-                    
+
                     if (feedEnclosures.ContainsKey (tmpItem.LocalID)) {
                         tmpItem.Enclosure = feedEnclosures[tmpItem.LocalID];
-                    }                       
-                } 
-            } finally {                
+                    }
+                }
+            } finally {
                 if (reader != null) {
                     reader.Dispose ();
-                    reader = null;                    
+                    reader = null;
                 }
-            } 
-  
+            }
+
             return ret;
         }
-        
+
         private static List<Feed> BuildFeedsList (FeedsManager manager, Dictionary<long,ICollection<FeedItem>> feedItems)
         {
-            IDataReader reader = null;            
+            IDataReader reader = null;
             List<Feed> ret = new List<Feed> ();
-            
+
             try {
                 Feed tmpFeed;
                 ICollection<FeedItem> tmpCollection;
-                
-                reader = DatabaseManager.ExecuteReader (selectAllFeedsQuery);                       
+
+                reader = DatabaseManager.ExecuteReader (selectAllFeedsQuery);
                 FeedDataWrapper fdw = new FeedDataWrapper (reader);
-                      
+
                 while (fdw.Read ()) {
                     tmpFeed = new Feed (manager, fdw);
 
                     if (feedItems.TryGetValue (tmpFeed.LocalID, out tmpCollection)) {
-                        tmpFeed.SetItems (tmpCollection);                        
+                        tmpFeed.SetItems (tmpCollection);
                     }
 
-                    ret.Add (tmpFeed);                        
-                }   
-            } finally {                
+                    ret.Add (tmpFeed);
+                }
+            } finally {
                 if (reader != null) {
                     reader.Dispose ();
-                    reader = null;                    
+                    reader = null;
                 }
-            }       
-            
+            }
+
             return ret;
-        }    
+        }
     }*/
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/ItemsTableManager.cs b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/ItemsTableManager.cs
index c4c34e5..31dd51e 100644
--- a/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/ItemsTableManager.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Migo.Syndication.Data/TablesManagers/ItemsTableManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  ItemsTableManager.cs
  *
  *  Copyright (C) 2007 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
- 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -32,22 +32,22 @@ using System.Collections;
 using System.Collections.Generic;
 
 namespace Migo.Syndication.Data
-{    
+{
     /*static class ItemsTableManager
-    {        
-        public static readonly string initQuery = @" 
+    {
+        public static readonly string initQuery = @"
             CREATE TABLE IF NOT EXISTS items (
-            	'local_id' INTEGER  PRIMARY KEY, 
+            	'local_id' INTEGER  PRIMARY KEY,
             	'parent_id' INTEGER NOT NULL DEFAULT '-1',
-            	'active' INTEGER NOT NULL DEFAULT '0', 
-            	'author' TEXT NOT NULL DEFAULT '', 
-            	'comments' TEXT NOT NULL DEFAULT '', 
-            	'description' TEXT NOT NULL DEFAULT '', 
-            	'guid' TEXT NOT NULL DEFAULT '', 
+            	'active' INTEGER NOT NULL DEFAULT '0',
+            	'author' TEXT NOT NULL DEFAULT '',
+            	'comments' TEXT NOT NULL DEFAULT '',
+            	'description' TEXT NOT NULL DEFAULT '',
+            	'guid' TEXT NOT NULL DEFAULT '',
             	'is_read' INTEGER NOT NULL DEFAULT '0',
-            	'last_download_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
-            	'link' TEXT NOT NULL DEFAULT '', 
-            	'modified' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 
+            	'last_download_time' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
+            	'link' TEXT NOT NULL DEFAULT '',
+            	'modified' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
             	'pubdate' DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', 	
             	'title' TEXT NOT NULL DEFAULT ''	
             );
@@ -57,219 +57,219 @@ namespace Migo.Syndication.Data
             BEGIN
                 DELETE FROM enclosures WHERE parent_id=old.local_id;
             END;
-            
+
             CREATE INDEX IF NOT EXISTS items_local_id_index ON items(local_id);
-            CREATE INDEX IF NOT EXISTS items_parent_id_index ON items(parent_id);                                                       
+            CREATE INDEX IF NOT EXISTS items_parent_id_index ON items(parent_id);
         ";
-        
-        private const string deactivateItemsBaseQuery = "UPDATE items SET active='0' WHERE";        
-        private static readonly string deleteFromItemsBaseQuery = "DELETE FROM items WHERE";        
-        private static readonly string insertIntoItemsQuery = 
-            String.Format ( 
+
+        private const string deactivateItemsBaseQuery = "UPDATE items SET active='0' WHERE";
+        private static readonly string deleteFromItemsBaseQuery = "DELETE FROM items WHERE";
+        private static readonly string insertIntoItemsQuery =
+            String.Format (
                 @"INSERT INTO items VALUES (
                     NULL, {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}
                 ); {12}",
-                DbDefines.ItemsTableColumns.ParentIDParameter, 
-                DbDefines.ItemsTableColumns.ActiveParameter, DbDefines.ItemsTableColumns.AuthorParameter,                
-                DbDefines.ItemsTableColumns.CommentsParameter, DbDefines.ItemsTableColumns.DescriptionParameter, 
-                DbDefines.ItemsTableColumns.GuidParameter, DbDefines.ItemsTableColumns.IsReadParameter, 
-                DbDefines.ItemsTableColumns.LastDownloadTimeParameter, DbDefines.ItemsTableColumns.LinkParameter, 
-                DbDefines.ItemsTableColumns.ModifiedParameter, DbDefines.ItemsTableColumns.PubDateParameter, 
+                DbDefines.ItemsTableColumns.ParentIDParameter,
+                DbDefines.ItemsTableColumns.ActiveParameter, DbDefines.ItemsTableColumns.AuthorParameter,
+                DbDefines.ItemsTableColumns.CommentsParameter, DbDefines.ItemsTableColumns.DescriptionParameter,
+                DbDefines.ItemsTableColumns.GuidParameter, DbDefines.ItemsTableColumns.IsReadParameter,
+                DbDefines.ItemsTableColumns.LastDownloadTimeParameter, DbDefines.ItemsTableColumns.LinkParameter,
+                DbDefines.ItemsTableColumns.ModifiedParameter, DbDefines.ItemsTableColumns.PubDateParameter,
                 DbDefines.ItemsTableColumns.TitleParameter, DbDefines.LastInsertIDQuery
             );
 
-        private static readonly string updateItemsQuery = 
+        private static readonly string updateItemsQuery =
             String.Format (
-                @"UPDATE items SET 
-                    {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11}, {12}={13}, 
+                @"UPDATE items SET
+                    {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11}, {12}={13},
                     {14}={15}, {16}={17}, {18}={19}, {20}={21}, {22}={23}, {24}={25}
                 WHERE {0}={1};",
-                DbDefines.ItemsTableColumns.LocalID, DbDefines.ItemsTableColumns.LocalIDParameter,                           
-                DbDefines.ItemsTableColumns.ParentID, DbDefines.ItemsTableColumns.ParentIDParameter, 
-                DbDefines.ItemsTableColumns.Active, DbDefines.ItemsTableColumns.ActiveParameter, 
-                DbDefines.ItemsTableColumns.Author, DbDefines.ItemsTableColumns.AuthorParameter, 
-                DbDefines.ItemsTableColumns.Comments, DbDefines.ItemsTableColumns.CommentsParameter, 
-                DbDefines.ItemsTableColumns.Description, DbDefines.ItemsTableColumns.DescriptionParameter, 
-                DbDefines.ItemsTableColumns.Guid, DbDefines.ItemsTableColumns.GuidParameter, 
-                DbDefines.ItemsTableColumns.IsRead, DbDefines.ItemsTableColumns.IsReadParameter, 
-                DbDefines.ItemsTableColumns.LastDownloadTime, DbDefines.ItemsTableColumns.LastDownloadTimeParameter, 
-                DbDefines.ItemsTableColumns.Link, DbDefines.ItemsTableColumns.LinkParameter, 
+                DbDefines.ItemsTableColumns.LocalID, DbDefines.ItemsTableColumns.LocalIDParameter,
+                DbDefines.ItemsTableColumns.ParentID, DbDefines.ItemsTableColumns.ParentIDParameter,
+                DbDefines.ItemsTableColumns.Active, DbDefines.ItemsTableColumns.ActiveParameter,
+                DbDefines.ItemsTableColumns.Author, DbDefines.ItemsTableColumns.AuthorParameter,
+                DbDefines.ItemsTableColumns.Comments, DbDefines.ItemsTableColumns.CommentsParameter,
+                DbDefines.ItemsTableColumns.Description, DbDefines.ItemsTableColumns.DescriptionParameter,
+                DbDefines.ItemsTableColumns.Guid, DbDefines.ItemsTableColumns.GuidParameter,
+                DbDefines.ItemsTableColumns.IsRead, DbDefines.ItemsTableColumns.IsReadParameter,
+                DbDefines.ItemsTableColumns.LastDownloadTime, DbDefines.ItemsTableColumns.LastDownloadTimeParameter,
+                DbDefines.ItemsTableColumns.Link, DbDefines.ItemsTableColumns.LinkParameter,
                 DbDefines.ItemsTableColumns.Modified, DbDefines.ItemsTableColumns.ModifiedParameter,
-                DbDefines.ItemsTableColumns.PubDate, DbDefines.ItemsTableColumns.PubDateParameter, 
+                DbDefines.ItemsTableColumns.PubDate, DbDefines.ItemsTableColumns.PubDateParameter,
                 DbDefines.ItemsTableColumns.Title, DbDefines.ItemsTableColumns.TitleParameter
             );
-        
+
         public static void Commit (IEnumerable<FeedItem> items)
         {
             if (items == null) {
                 throw new ArgumentNullException ("items");
-            }    
+            }
 
             FeedEnclosure tmpEnc;
             ICollection<FeedItem> itemCol = items as ICollection<FeedItem>;
-            
+
             Dictionary<QueuedDbCommand,FeedItem> itemCommandPairs = (itemCol == null) ?
-                new Dictionary<QueuedDbCommand,FeedItem> () : 
+                new Dictionary<QueuedDbCommand,FeedItem> () :
                 new Dictionary<QueuedDbCommand,FeedItem> (itemCol.Count);
-            
-            List<FeedEnclosure> enclosures = 
+
+            List<FeedEnclosure> enclosures =
                 new List<FeedEnclosure> (itemCommandPairs.Count);
-            
+
             foreach (FeedItem i in items) {
                 itemCommandPairs.Add (QueuedDbCommand.CreateScalar (
                     CreateInsertCommandImpl (i)), i
                 );
             }
-            
-            foreach (FeedItem i in items) {                
+
+            foreach (FeedItem i in items) {
                 if (i.Enclosure != null) {
                     tmpEnc = i.Enclosure as FeedEnclosure;
                     if (tmpEnc != null) {
                         enclosures.Add (tmpEnc);
                     }
-                }            
-            }            
-            
+                }
+            }
+
             DatabaseManager.Enqueue (itemCommandPairs.Keys);
-            
+
             foreach (KeyValuePair<QueuedDbCommand,FeedItem> kvp in itemCommandPairs) {
                 kvp.Value.LocalID = Convert.ToInt64 (kvp.Key.ScalarResult);
             }
-                            
+
             if (enclosures.Count > 0) {
                 EnclosuresTableManager.Commit (enclosures);
             }
         }
-        
+
         public static IDbCommand CreateInsertCommand (FeedItem item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-            
+
             return CreateInsertCommandImpl (item);
         }
-        
+
         private static IDbCommand CreateInsertCommandImpl (FeedItem item)
         {
             return DatabaseManager.CreateCommand (
                 insertIntoItemsQuery,
                 DbDefines.ItemsTableColumns.ParentID, item.Parent.LocalID.ToString (),
-                DbDefines.ItemsTableColumns.Active, (item.Active) ? "1" : "0",                                              
-                DbDefines.ItemsTableColumns.Author, item.Author, 
-                DbDefines.ItemsTableColumns.Comments, item.Comments, 
-                DbDefines.ItemsTableColumns.Description, item.Description, 
-                DbDefines.ItemsTableColumns.Guid, item.Guid.ToString (), 
-                DbDefines.ItemsTableColumns.IsRead, item.IsRead.ToString (), 
-                DbDefines.ItemsTableColumns.LastDownloadTime, item.LastDownloadTime.ToUniversalTime ().ToString ("u"), 
-                DbDefines.ItemsTableColumns.Link, item.Link, 
+                DbDefines.ItemsTableColumns.Active, (item.Active) ? "1" : "0",
+                DbDefines.ItemsTableColumns.Author, item.Author,
+                DbDefines.ItemsTableColumns.Comments, item.Comments,
+                DbDefines.ItemsTableColumns.Description, item.Description,
+                DbDefines.ItemsTableColumns.Guid, item.Guid.ToString (),
+                DbDefines.ItemsTableColumns.IsRead, item.IsRead.ToString (),
+                DbDefines.ItemsTableColumns.LastDownloadTime, item.LastDownloadTime.ToUniversalTime ().ToString ("u"),
+                DbDefines.ItemsTableColumns.Link, item.Link,
                 DbDefines.ItemsTableColumns.Modified, item.Modified.ToUniversalTime ().ToString ("u"),
-                DbDefines.ItemsTableColumns.PubDate, item.PubDate.ToUniversalTime ().ToString ("u"), 
-                DbDefines.ItemsTableColumns.Title, item.Title            
+                DbDefines.ItemsTableColumns.PubDate, item.PubDate.ToUniversalTime ().ToString ("u"),
+                DbDefines.ItemsTableColumns.Title, item.Title
             );
-        }        
-        
+        }
+
         public static void Deactivate (FeedItem item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
-            }    
-            
+            }
+
              DatabaseManager.ExecuteNonQuery (
                 String.Format (
                     "{0} {1}={2};",
-                    deactivateItemsBaseQuery, 
-                    DbDefines.ItemsTableColumns.LocalID, 
+                    deactivateItemsBaseQuery,
+                    DbDefines.ItemsTableColumns.LocalID,
                     DbDefines.ItemsTableColumns.LocalIDParameter
                 )
-            );                 
+            );
         }
-        
+
         public static void Deactivate (IEnumerable<FeedItem> items)
         {
             if (items == null) {
                 throw new ArgumentNullException ("items");
-            }        
+            }
 
             List<long> ids = new List<long> ();
-            
+
             foreach (FeedItem i in items) {
                 if (i != null) {
                     ids.Add (i.LocalID);
                 }
             }
-            
+
             if (ids.Count > 0) {
                 string query = DataUtility.MultipleOnIDQuery (
-                    deactivateItemsBaseQuery, 
-                    DbDefines.ItemsTableColumns.LocalID, 
+                    deactivateItemsBaseQuery,
+                    DbDefines.ItemsTableColumns.LocalID,
                     ids.ToArray ()
                 );
-                
+
                 DatabaseManager.ExecuteNonQuery (query);
-            }      
-        }        
-        
+            }
+        }
+
         public static void Delete (FeedItem item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             }
-                        
+
             DatabaseManager.ExecuteNonQuery (
                 String.Format (
                     "{0} {1}={2};",
-                    deleteFromItemsBaseQuery, 
-                    DbDefines.ItemsTableColumns.LocalID, 
+                    deleteFromItemsBaseQuery,
+                    DbDefines.ItemsTableColumns.LocalID,
                     DbDefines.ItemsTableColumns.LocalIDParameter
                 )
             );
         }
-        
+
         public static void Delete (IEnumerable<FeedItem> items)
         {
             if (items == null) {
             	throw new ArgumentNullException ("items");
             }
-            
+
             List<long> ids = new List<long> ();
-            
+
             foreach (FeedItem i in items) {
                 if (i != null) {
                     ids.Add (i.LocalID);
                 }
             }
-            
+
             if (ids.Count > 0) {
                 string query = DataUtility.MultipleOnIDQuery (
                     deleteFromItemsBaseQuery, DbDefines.ItemsTableColumns.LocalID, ids.ToArray ()
                 );
-                
+
                 DatabaseManager.ExecuteNonQuery (query);
             }
-        }           
-     
+        }
+
         public static void Init ()
         {
-            DatabaseManager.ExecuteNonQuery (initQuery);               
-        }        
-        
+            DatabaseManager.ExecuteNonQuery (initQuery);
+        }
+
         public static long Insert (FeedItem item)
         {
             if (item == null) {
                 throw new ArgumentNullException ("item");
             } else if (item.LocalID > 0) {
                 return item.LocalID;
-            }   
+            }
 
             long ret = -1;
-            
+
             if (item.Parent == null) {
                 return ret;
             }
-            
+
             ret = Convert.ToInt64 (CreateInsertCommandImpl (item));
-                        
+
             return ret;
         }
 
@@ -277,62 +277,62 @@ namespace Migo.Syndication.Data
         {
             if (items == null) {
                 throw new ArgumentNullException ("items");
-            }    
-            
+            }
+
             bool ret = false;
-        
+
             try {
-                foreach (FeedItem i in items) {                
+                foreach (FeedItem i in items) {
                     Insert (i);
                 }
-                
+
                 ret = true;
-            } catch {}   
-        
+            } catch {}
+
             return ret;
         }
 
         public static void Update (FeedItem item)
         {
             if (item == null) {
-                throw new ArgumentNullException ("item");       
-            }   
-            
+                throw new ArgumentNullException ("item");
+            }
+
             DatabaseManager.ExecuteNonQuery (
                 updateItemsQuery,
-                DbDefines.ItemsTableColumns.LocalID, item.LocalID.ToString (),                
-                DbDefines.ItemsTableColumns.ParentID, item.Parent.LocalID.ToString (), 
-                DbDefines.ItemsTableColumns.Active, (item.Active) ? "1" : "0",                 
-                DbDefines.ItemsTableColumns.Author, item.Author, 
-                DbDefines.ItemsTableColumns.Comments, item.Comments, 
-                DbDefines.ItemsTableColumns.Description, item.Description, 
-                DbDefines.ItemsTableColumns.Guid, item.Guid.ToString (), 
-                DbDefines.ItemsTableColumns.IsRead, item.IsRead.ToString (), 
-                DbDefines.ItemsTableColumns.LastDownloadTime, item.LastDownloadTime.ToUniversalTime ().ToString ("u"), 
-                DbDefines.ItemsTableColumns.Link, item.Link, 
+                DbDefines.ItemsTableColumns.LocalID, item.LocalID.ToString (),
+                DbDefines.ItemsTableColumns.ParentID, item.Parent.LocalID.ToString (),
+                DbDefines.ItemsTableColumns.Active, (item.Active) ? "1" : "0",
+                DbDefines.ItemsTableColumns.Author, item.Author,
+                DbDefines.ItemsTableColumns.Comments, item.Comments,
+                DbDefines.ItemsTableColumns.Description, item.Description,
+                DbDefines.ItemsTableColumns.Guid, item.Guid.ToString (),
+                DbDefines.ItemsTableColumns.IsRead, item.IsRead.ToString (),
+                DbDefines.ItemsTableColumns.LastDownloadTime, item.LastDownloadTime.ToUniversalTime ().ToString ("u"),
+                DbDefines.ItemsTableColumns.Link, item.Link,
                 DbDefines.ItemsTableColumns.Modified, item.Modified.ToUniversalTime ().ToString ("u"),
-                DbDefines.ItemsTableColumns.PubDate, item.PubDate.ToUniversalTime ().ToString ("u"), 
+                DbDefines.ItemsTableColumns.PubDate, item.PubDate.ToUniversalTime ().ToString ("u"),
                 DbDefines.ItemsTableColumns.Title, item.Title
             );
         }
-        
+
         public static bool Update (IEnumerable<FeedItem> items)
         {
             if (items == null) {
                 throw new ArgumentNullException ("items");
-            }    
-            
+            }
+
             bool ret = false;
-            
+
             try {
-                foreach (FeedItem i in items) {                
+                foreach (FeedItem i in items) {
                     Update (i);
                 }
-                
+
                 ret = true;
-            } catch {}     
-            
+            } catch {}
+
             return ret;
-        }        
+        }
     }*/
 }
diff --git a/src/Libraries/Migo/Migo.Syndication/MigoItem.cs b/src/Libraries/Migo/Migo.Syndication/MigoItem.cs
index 4b14e06..90e6040 100644
--- a/src/Libraries/Migo/Migo.Syndication/MigoItem.cs
+++ b/src/Libraries/Migo/Migo.Syndication/MigoItem.cs
@@ -48,7 +48,7 @@ namespace Migo.Syndication
             get { return cache_model_id; }
             set { cache_model_id = value; }
         }
-        
+
         public abstract long DbId { get; protected set;}
     }
 }
\ No newline at end of file
diff --git a/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs b/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs
index 665c6cf..f0689a8 100644
--- a/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs
+++ b/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs
@@ -40,18 +40,18 @@ namespace Migo.Syndication
     public class MigoModelProvider<T> : SqliteModelProvider<T> where T : MigoItem<T>, ICacheableItem, new()
     {
         private Dictionary<long, T> full_cache = new Dictionary<long, T> ();
-        
+
         public MigoModelProvider (HyenaSqliteConnection connection, string table_name) : base (connection, table_name)
         {
         }
 
 #region Overrides
-                
+
         public override T FetchSingle (long id)
         {
             return GetCached (id) ?? CacheResult (base.FetchSingle (id));
         }
-        
+
         public override void Save (T target)
         {
             base.Save (target);
@@ -64,23 +64,23 @@ namespace Migo.Syndication
         {
             return GetCached (PrimaryKeyFor (reader)) ?? CacheResult (base.Load (reader));
         }
-        
+
         public override void Delete (long id)
         {
             full_cache.Remove (id);
             base.Delete (id);
         }
-        
+
         public override void Delete (IEnumerable<T> items)
         {
             foreach (T item in items) {
                 if (item != null)
                     full_cache.Remove (PrimaryKeyFor (item));
             }
-                
+
             base.Delete (items);
         }
-        
+
 #endregion
 
 #region Utility Methods
@@ -93,7 +93,7 @@ namespace Migo.Syndication
                 return null;
             }
         }
-        
+
         private T CacheResult (T item)
         {
             full_cache[item.DbId] = item;
@@ -101,6 +101,6 @@ namespace Migo.Syndication
         }
 
 #endregion
-        
+
     }
 }
\ No newline at end of file
diff --git a/src/Libraries/Migo/Migo.Syndication/Rfc822DateTime.cs b/src/Libraries/Migo/Migo.Syndication/Rfc822DateTime.cs
index 7099398..c28a1d7 100644
--- a/src/Libraries/Migo/Migo.Syndication/Rfc822DateTime.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Rfc822DateTime.cs
@@ -8,21 +8,21 @@
 /*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -33,15 +33,15 @@ namespace Migo.Syndication
 {
     public static class Rfc822DateTime
     {
-        private const string monthsStr = 
+        private const string monthsStr =
             "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|" +
             "January|February|March|April|May|June|July|August|" +
             "September|October|November|December";
-        
-        private const string daysOfWeek = 
+
+        private const string daysOfWeek =
             "Mon|Tue|Wed|Thu|Fri|Sat|Sun|" +
             "Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday";
-        
+
         private const string rfc822DTExp =
             @"^(?<dayofweek>(" + daysOfWeek + "), )?" +
             @"(?<day>\d\d?) " +
@@ -56,7 +56,7 @@ namespace Migo.Syndication
         static Rfc822DateTime()
         {
             months = monthsStr.Split ('|');
-            rfc822DTRegex = new Regex (rfc822DTExp, 
+            rfc822DTRegex = new Regex (rfc822DTExp,
                 RegexOptions.Compiled | RegexOptions.IgnoreCase);
         }
 
@@ -92,7 +92,7 @@ namespace Migo.Syndication
                 }
 				
 				ret = new DateTime (year, month, day, hours, minutes, seconds);
-                                
+
                 if (timeZone != String.Empty) {
                     ret -= ParseGmtOffset (timeZone);
                 }
@@ -107,15 +107,15 @@ namespace Migo.Syndication
         {
             bool ret = false;
             result = DateTime.MinValue;
-            
+
             try {
                 result = Parse (dateTime);
                 ret = true;
             } catch {}
-                
+
             return ret;
         }
-        
+
         private static int MonthToInt32 (string month)
         {
             int i = 1;
@@ -124,7 +124,7 @@ namespace Migo.Syndication
                 if (month == s) {
                     break;
                 }
-                
+
                 if (++i % 13 == 0) {
                     i = 1;
                 }
@@ -167,12 +167,12 @@ namespace Migo.Syndication
                     case "G": offsetHours = -7; break;
                     case "H": offsetHours = -8; break;
                     case "I": offsetHours = -9; break;
-                    
+
                     // Q.  Why was 'J' left out of Z-Time?
-                    // A.  http://www.maybeck.com/ztime/  
-                    
+                    // A.  http://www.maybeck.com/ztime/
+
                     // That's what I like about this job, you learn stuff.
-                    
+
                     case "K": offsetHours = -10; break;
                     case "L": offsetHours = -11; break;
                     case "M": offsetHours = -12; break;				
@@ -188,7 +188,7 @@ namespace Migo.Syndication
                     case "W": offsetHours = 10; break;
                     case "X": offsetHours = 11; break;
                     case "Y": offsetHours = 12; break;
-                }   
+                }
             }
 
             return TimeSpan.FromTicks (
diff --git a/src/Libraries/Migo/Migo.Syndication/RssParser.cs b/src/Libraries/Migo/Migo.Syndication/RssParser.cs
index d5d4cfe..bd2112f 100644
--- a/src/Libraries/Migo/Migo.Syndication/RssParser.cs
+++ b/src/Libraries/Migo/Migo.Syndication/RssParser.cs
@@ -41,7 +41,7 @@ namespace Migo.Syndication
     {
         private XmlDocument doc;
         private XmlNamespaceManager mgr;
-        
+
         public RssParser (string url, string xml)
         {
             xml = xml.TrimStart ();
@@ -71,23 +71,23 @@ namespace Migo.Syndication
 
                 if (!loaded) {
                     Hyena.Log.Exception (e);
-                    throw new FormatException ("Invalid XML document.");                                  
+                    throw new FormatException ("Invalid XML document.");
                 }
             }
             CheckRss ();
         }
-        
+
         public RssParser (string url, XmlDocument doc)
         {
             this.doc = doc;
             CheckRss ();
         }
-    
+
         public Feed CreateFeed ()
         {
             return UpdateFeed (new Feed ());
         }
-        
+
         public Feed UpdateFeed (Feed feed)
         {
             try {
@@ -100,19 +100,19 @@ namespace Migo.Syndication
                 }
                 feed.Language         = GetXmlNodeText (doc, "/rss/channel/language");
                 feed.LastBuildDate    = GetRfc822DateTime (doc, "/rss/channel/lastBuildDate");
-                feed.Link             = GetXmlNodeText (doc, "/rss/channel/link"); 
+                feed.Link             = GetXmlNodeText (doc, "/rss/channel/link");
                 feed.PubDate          = GetRfc822DateTime (doc, "/rss/channel/pubDate");
                 feed.Keywords         = GetXmlNodeText (doc, "/rss/channel/itunes:keywords");
                 feed.Category         = GetXmlNodeText (doc, "/rss/channel/itunes:category/@text");
-                
+
                 return feed;
             } catch (Exception e) {
                  Hyena.Log.Exception ("Caught error parsing RSS channel", e);
             }
-             
+
             return null;
         }
-        
+
         public IEnumerable<FeedItem> GetFeedItems (Feed feed)
         {
             XmlNodeList nodes = null;
@@ -121,11 +121,11 @@ namespace Migo.Syndication
             } catch (Exception e) {
                 Hyena.Log.Exception ("Unable to get any RSS items", e);
             }
-            
+
             if (nodes != null) {
                 foreach (XmlNode node in nodes) {
                     FeedItem item = null;
-                    
+
                     try {
                         item = ParseItem (node);
                         if (item != null) {
@@ -134,14 +134,14 @@ namespace Migo.Syndication
                     } catch (Exception e) {
                         Hyena.Log.Exception (e);
                     }
-                    
+
                     if (item != null) {
                         yield return item;
                     }
                 }
             }
         }
-        
+
         private FeedItem ParseItem (XmlNode node)
         {
             try {
@@ -149,11 +149,11 @@ namespace Migo.Syndication
                 item.Description = StringUtil.RemoveNewlines (GetXmlNodeText (node, "description"));
                 item.UpdateStrippedDescription ();
                 item.Title = StringUtil.RemoveNewlines (GetXmlNodeText (node, "title"));
-            
+
                 if (String.IsNullOrEmpty (item.Description) && String.IsNullOrEmpty (item.Title)) {
                     throw new FormatException ("node:  Either 'title' or 'description' node must exist.");
                 }
-                
+
                 item.Author            = GetXmlNodeText (node, "author");
                 item.Comments          = GetXmlNodeText (node, "comments");
                 // Removed, since we form our own Guid, since feeds don't seem to be consistent
@@ -166,15 +166,15 @@ namespace Migo.Syndication
 
                 // TODO prefer <media:content> nodes over <enclosure>?
                 item.Enclosure = ParseEnclosure (node) ?? ParseMediaContent (node);
-                
+
                 return item;
              } catch (Exception e) {
                  Hyena.Log.Exception ("Caught error parsing RSS item", e);
              }
-             
+
              return null;
         }
-        
+
         private FeedEnclosure ParseEnclosure (XmlNode node)
         {
             try {
@@ -183,7 +183,7 @@ namespace Migo.Syndication
                 enclosure.Url = GetXmlNodeText (node, "enclosure/@url");
                 if (enclosure.Url == null)
                     return null;
-                
+
                 enclosure.FileSize = Math.Max (0, GetInt64 (node, "enclosure/@length"));
                 enclosure.MimeType = GetXmlNodeText (node, "enclosure/@type");
                 enclosure.Duration = GetITunesDuration (node);
@@ -192,17 +192,17 @@ namespace Migo.Syndication
              } catch (Exception e) {
                  Hyena.Log.Exception ("Caught error parsing RSS enclosure", e);
              }
-             
+
              return null;
         }
-        
+
         // Parse one Media RSS media:content node
         // http://search.yahoo.com/mrss/
         private FeedEnclosure ParseMediaContent (XmlNode item_node)
         {
             try {
                 XmlNode node = null;
-                
+
                 // Get the highest bitrate "full" content item
                 // TODO allow a user-preference for a feed to decide what quality to get, if there
                 // are options?
@@ -211,61 +211,61 @@ namespace Migo.Syndication
                     string expr = GetXmlNodeText (test_node, "@expression");
                     if (!(String.IsNullOrEmpty (expr) || expr == "full"))
                         continue;
-                    
+
                     int bitrate = GetInt32 (test_node, "@bitrate");
                     if (node == null || bitrate > max_bitrate) {
                         node = test_node;
                         max_bitrate = bitrate;
                     }
                 }
-                
+
                 if (node == null)
                     return null;
-                    
+
                 FeedEnclosure enclosure = new FeedEnclosure ();
                 enclosure.Url = GetXmlNodeText (node, "@url");
                 if (enclosure.Url == null)
                     return null;
-                
+
                 enclosure.FileSize = Math.Max (0, GetInt64 (node, "@fileSize"));
                 enclosure.MimeType = GetXmlNodeText (node, "@type");
                 enclosure.Duration = TimeSpan.FromSeconds (GetInt64 (node, "@duration"));
                 enclosure.Keywords = GetXmlNodeText (item_node, "itunes:keywords");
-                
+
                 // TODO get the thumbnail URL
-                
+
                 return enclosure;
              } catch (Exception e) {
                  Hyena.Log.Exception ("Caught error parsing RSS media:content", e);
              }
-             
+
              return null;
         }
-        
+
         private void CheckRss ()
-        {            
+        {
             if (doc.SelectSingleNode ("/rss") == null) {
                 throw new FormatException ("Invalid RSS document.");
             }
-            
+
             if (GetXmlNodeText (doc, "/rss/channel/title") == String.Empty) {
                 throw new FormatException (
                     "node: 'title', 'description', and 'link' nodes must exist."
-                );                
+                );
             }
-            
+
             mgr = new XmlNamespaceManager (doc.NameTable);
             mgr.AddNamespace ("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd");
             mgr.AddNamespace ("creativeCommons", "http://backend.userland.com/creativeCommonsRssModule");
             mgr.AddNamespace ("media", "http://search.yahoo.com/mrss/");
             mgr.AddNamespace ("dcterms", "http://purl.org/dc/terms/");
         }
-        
+
         public TimeSpan GetITunesDuration (XmlNode node)
         {
             return GetITunesDuration (GetXmlNodeText (node, "itunes:duration"));
         }
-        
+
         public static TimeSpan GetITunesDuration (string duration)
         {
             if (String.IsNullOrEmpty (duration)) {
@@ -274,27 +274,27 @@ namespace Migo.Syndication
 
             int hours = 0, minutes = 0, seconds = 0;
             string [] parts = duration.Split (':');
-            
+
             if (parts.Length > 0)
                 seconds = Int32.Parse (parts[parts.Length - 1]);
-                
+
             if (parts.Length > 1)
                 minutes = Int32.Parse (parts[parts.Length - 2]);
-                
+
             if (parts.Length > 2)
                 hours = Int32.Parse (parts[parts.Length - 3]);
-            
+
             return TimeSpan.FromSeconds (hours * 3600 + minutes * 60 + seconds);
         }
 
 #region Xml Convienience Methods
-    
+
         public string GetXmlNodeText (XmlNode node, string tag)
         {
             XmlNode n = node.SelectSingleNode (tag, mgr);
             return (n == null) ? null : n.InnerText.Trim ();
         }
-        
+
         public DateTime GetRfc822DateTime (XmlNode node, string tag)
         {
             DateTime ret = DateTime.MinValue;
@@ -309,10 +309,10 @@ namespace Migo.Syndication
                     return ret;
                 }
             }
-                    
-            return ret;              
+
+            return ret;
         }
-        
+
         public long GetInt64 (XmlNode node, string tag)
         {
             long ret = 0;
@@ -321,8 +321,8 @@ namespace Migo.Syndication
             if (!String.IsNullOrEmpty (result)) {
                 Int64.TryParse (result, out ret);
             }
-                    
-            return ret;              
+
+            return ret;
         }
 
         public int GetInt32 (XmlNode node, string tag)
@@ -333,8 +333,8 @@ namespace Migo.Syndication
             if (!String.IsNullOrEmpty (result)) {
                 Int32.TryParse (result, out ret);
             }
-                    
-            return ret;              
+
+            return ret;
         }
 
 #endregion
diff --git a/src/Libraries/Migo/Migo.Syndication/Tests/XmlTests.cs b/src/Libraries/Migo/Migo.Syndication/Tests/XmlTests.cs
index 62b9db3..e89d670 100644
--- a/src/Libraries/Migo/Migo.Syndication/Tests/XmlTests.cs
+++ b/src/Libraries/Migo/Migo.Syndication/Tests/XmlTests.cs
@@ -57,12 +57,12 @@ namespace Migo.Syndication.Tests
                 "Sat, 17 May 2008 20:47:57 +0000",      DateTime.Parse ("17/05/2008 15.47.57"),
                 "Sat, 17 May 2008 19:33:42 +0000",      DateTime.Parse ("17/05/2008 14.33.42")
             );
-    
+
             AssertForEach (pairs, delegate (TransformPair<string, DateTime> pair) {
                 Assert.AreEqual (pair.To, Rfc822DateTime.Parse (pair.From));
             });
         }
-    
+
         [Test]
         public void TestParseITunesDuration ()
         {
@@ -78,7 +78,7 @@ namespace Migo.Syndication.Tests
                 "1:02:22", new TimeSpan (1, 2, 22),
                 "9:0:0",   new TimeSpan (9, 0, 0)
             );
-    
+
             AssertForEach (pairs, delegate (TransformPair<string, TimeSpan> pair) {
                 Assert.AreEqual (pair.To, RssParser.GetITunesDuration (pair.From));
             });
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/AsyncCommandQueue.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/AsyncCommandQueue.cs
index 8d02efc..1346602 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/AsyncCommandQueue.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/AsyncCommandQueue.cs
@@ -5,33 +5,33 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Threading;
 using System.Collections.Generic;
 
 namespace Migo.TaskCore
-{        
+{
     delegate void ExecuteCommand (ICommand command);
 
     public class AsyncCommandQueue : IDisposable
@@ -43,15 +43,15 @@ namespace Migo.TaskCore
         private RegisteredWaitHandle registeredHandle;
         private AutoResetEvent are = new AutoResetEvent (false);
         private ManualResetEvent executingHandle = new ManualResetEvent (true);
-        
+
         private readonly ExecuteCommand execCommand;
-        
+
         private readonly object userSync;
         private readonly object sync = new object ();
-                
-        public EventHandler<EventArgs> QueueProcessed;        
-        public EventHandler<EventArgs> QueueProcessing; 
-        
+
+        public EventHandler<EventArgs> QueueProcessed;
+        public EventHandler<EventArgs> QueueProcessing;
+
         private bool IsProcessed {
             get {
                 bool ret = false;
@@ -59,13 +59,13 @@ namespace Migo.TaskCore
                 lock (sync) {
                     if (eventQueue.Count == 0) {
                         ret = true;
-                    }                
+                    }
                 }
-                
+
                 return ret;
             }
-        }        
-        
+        }
+
         public virtual WaitHandle WaitHandle {
             get { return executingHandle; }
         }
@@ -73,11 +73,11 @@ namespace Migo.TaskCore
         public AsyncCommandQueue () : this (null)
         {
         }
-        
+
         public AsyncCommandQueue (object sync)
         {
             userSync = sync;
-            
+
             if (userSync == null) {
                 execCommand = delegate (ICommand command) {
                     command.Execute ();
@@ -87,60 +87,60 @@ namespace Migo.TaskCore
                     lock (userSync) {
                         command.Execute ();
                     }
-                };                    
+                };
             }
-            
+
             eventQueue = new Queue<ICommand> ();
 
             registeredHandle = ThreadPool.RegisterWaitForSingleObject (
                 are, ProcessEventQueue, null, -1, false
             );
         }
-        
+
         public virtual void Dispose ()
         {
             if (SetDisposed ()) {
-                
+
                 executingHandle.WaitOne ();
-                
+
                 if (registeredHandle != null) {
                     registeredHandle.Unregister (null);
                     registeredHandle = null;
                 }
-                        
+
                 if (are != null) {
                     are.Close ();
                     are = null;
                 }
-                
+
                 if (executingHandle != null) {
                     executingHandle.Close ();
                     executingHandle = null;
-                }                
-                
+                }
+
                 eventQueue = null;
             }
         }
-    
+
         public virtual bool Register (ICommand command)
         {
-            lock (sync) {   
+            lock (sync) {
                 if (disposed) {
                     return false;
                 }
-            
+
                 return Register (command, true);
             }
         }
-        
+
         protected virtual bool Register (ICommand command, bool pumpQueue)
         {
             if (command == null) {
                 throw new ArgumentNullException ("command");
             }
-           
+
             eventQueue.Enqueue (command);
-            
+
             if (!executing && pumpQueue) {
                 SetExecuting (true);
             }
@@ -153,40 +153,40 @@ namespace Migo.TaskCore
             if (commands == null) {
                 throw new ArgumentNullException ("commands");
             }
-            
+
             lock (sync) {
                 if (disposed) {
                     return false;
                 }
-                
+
                 foreach (ICommand c in commands) {
                     Register (c, false);
                 }
-                
+
                 if (!executing) {
                     SetExecuting (true);
-                }                
+                }
             }
-            
+
             return true;
         }
 
-        protected virtual void SetExecuting (bool exec) 
+        protected virtual void SetExecuting (bool exec)
         {
             if (exec) {
                 executing = true;
-                are.Set ();                
+                are.Set ();
                 executingHandle.Reset ();
             } else {
                 executing = false;
                 executingHandle.Set ();
             }
         }
-        
+
         protected virtual bool SetDisposed ()
         {
             bool ret = false;
-            
+
             lock (sync) {
                 if (!disposed) {
                     ret = disposed = true;
@@ -194,12 +194,12 @@ namespace Migo.TaskCore
             }
             return ret;
         }
-        
+
         protected virtual void ProcessEventQueue (object state, bool timedOut)
-        {     
+        {
             ICommand e;
             bool done = false;
-           
+
             while (!done) {
                 RaiseEvent (QueueProcessing);
 
@@ -207,21 +207,21 @@ namespace Migo.TaskCore
                     lock (sync) {
                         e = eventQueue.Dequeue ();
                     }
-                    
+
                     if (e != null) {
                         try {
                             execCommand (e);
                         } catch (Exception ex) {
                             Hyena.Log.Exception (ex);
                         }
-                    } 
-                                       
+                    }
+
                     if (IsProcessed) {
                         RaiseEvent (QueueProcessed);
                         done = true;
-                    }                
+                    }
 
-                    if (done) {                
+                    if (done) {
                         lock (sync) {
                             if (eventQueue.Count == 0) {
                                 SetExecuting (false);
@@ -229,7 +229,7 @@ namespace Migo.TaskCore
                                 done = false;
                             }
                         }
-                        
+
                         break;
                     }
                 }
@@ -245,8 +245,8 @@ namespace Migo.TaskCore
                     handler (this, new EventArgs ());
                 } catch (Exception ex) {
                     Hyena.Log.Exception (ex);
-                }                
-            }            
+                }
+            }
         }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandDelegate.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandDelegate.cs
index 34418f2..951152b 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandDelegate.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandDelegate.cs
@@ -5,30 +5,30 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 
 namespace Migo.TaskCore
-{    
-    public delegate void CommandDelegate ();        
+{
+    public delegate void CommandDelegate ();
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandQueueManager.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandQueueManager.cs
index 10612cc..0ef3bef 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandQueueManager.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandQueueManager.cs
@@ -1,28 +1,28 @@
-/*************************************************************************** 
+/***************************************************************************
  *  CommandQueueManager.cs
  *
  *  Copyright (C) 2008 Michael C. Urbanski
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -30,19 +30,19 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 
-namespace Migo.TaskCore 
+namespace Migo.TaskCore
 {
     public static class CommandQueueManager
     {
-        private static readonly object sync;    
+        private static readonly object sync;
         private static Dictionary<Guid,AsyncCommandQueue> queues;
-        
+
         static CommandQueueManager ()
         {
             queues = new Dictionary<Guid,AsyncCommandQueue> ();
             sync = ((ICollection)queues).SyncRoot;
         }
-        
+
         public static AsyncCommandQueue GetCommandQueue (Guid guid)
         {
             lock (sync) {
@@ -50,22 +50,22 @@ namespace Migo.TaskCore
                     return queues[guid];
                 }
             }
-            
+
             return null;
         }
-        
+
         public static Guid Register (AsyncCommandQueue queue)
         {
             if (queue == null) {
                 throw new ArgumentNullException ("queue");
             }
-            
+
             Guid guid = Guid.NewGuid ();
-            
+
             lock (sync) {
-                queues.Add (guid, queue);        
+                queues.Add (guid, queue);
             }
-            
+
             return guid;
         }
     }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandWrapper.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandWrapper.cs
index c6fe1f5..4270fce 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandWrapper.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/CommandWrapper.cs
@@ -5,41 +5,41 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 using System;
 
 namespace Migo.TaskCore
-{           
+{
     public class CommandWrapper : ICommand
     {
         protected readonly CommandDelegate d;
 
-        public CommandWrapper (CommandDelegate del) 
+        public CommandWrapper (CommandDelegate del)
         {
             if (del == null) {
                 throw new ArgumentNullException ("del");
             }
-            
+
             this.d = del;
         }
 
@@ -47,6 +47,6 @@ namespace Migo.TaskCore
         public void Execute ()
         {
             d ();
-        }    
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/EventWrapper.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/EventWrapper.cs
index 9a91c74..f52ba73 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/EventWrapper.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/EventWrapper.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -36,13 +36,13 @@ namespace Migo.TaskCore
         private readonly object sender;
         private readonly EventHandler<T> handler;
 
-        public EventWrapper (EventHandler<T> handler, object sender, T e) 
+        public EventWrapper (EventHandler<T> handler, object sender, T e)
         {
             if (handler == null) {
                 throw new ArgumentNullException ("handler");
             } else if (e == null) {
                 throw new ArgumentNullException ("e");
-            } 
+            }
 
             this.e = e;
             this.sender = sender;
@@ -52,7 +52,7 @@ namespace Migo.TaskCore
 
         public void Execute ()
         {
-            handler (sender, e);             
-        }    
+            handler (sender, e);
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/ICommand.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/ICommand.cs
index f9b96dd..6e389f5 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/ICommand.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncCommandQueue/ICommand.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -31,5 +31,5 @@ namespace Migo.TaskCore
     public interface ICommand
     {
         void Execute ();
-    }    
+    }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/AsyncTaskScheduler.cs b/src/Libraries/Migo/Migo.TaskCore/AsyncTaskScheduler.cs
index 55377a8..22e392a 100644
--- a/src/Libraries/Migo/Migo.TaskCore/AsyncTaskScheduler.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/AsyncTaskScheduler.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWare IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWare OR THE USE OR OTHER 
+ *  THE SOFTWare IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWare OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -35,48 +35,48 @@ using System.Collections.Generic;
 using C5;
 
 namespace Migo.TaskCore
-{   
+{
     class ScheduledCommandWrapperComparer : IComparer<ScheduledCommandWrapper>
     {
         public int Compare (ScheduledCommandWrapper left,
                             ScheduledCommandWrapper right)
         {
             return DateTime.Compare (left.ScheduledFor, right.ScheduledFor);
-        }         
+        }
     }
-    
-    public class ScheduledCommandWrapper : CommandWrapper 
+
+    public class ScheduledCommandWrapper : CommandWrapper
     {
-        private readonly DateTime scheduledFor;        
-        
+        private readonly DateTime scheduledFor;
+
         public DateTime ScheduledFor {
             get { return scheduledFor; }
         }
-        
+
         public ScheduledCommandWrapper (DateTime t, CommandDelegate d) : base (d)
         {
             scheduledFor = t;
         }
     }
 
-    public static class TaskScheduler 
-    {        
+    public static class TaskScheduler
+    {
         private static Timer nextEventTimer;
-        private static ScheduledCommandWrapper nextTask;              
+        private static ScheduledCommandWrapper nextTask;
         private static IntervalHeap<ScheduledCommandWrapper> commands;
-        private static AutoResetEvent timerHandle = new AutoResetEvent (false);        
-        
-        private static bool disposed;                
-        private static readonly object sync = new object ();                
-        
-        static TaskScheduler () 
+        private static AutoResetEvent timerHandle = new AutoResetEvent (false);
+
+        private static bool disposed;
+        private static readonly object sync = new object ();
+
+        static TaskScheduler ()
         {
             commands = new IntervalHeap<ScheduledCommandWrapper> (
                 new ScheduledCommandWrapperComparer ()
             );
-            
+
             nextEventTimer = new Timer (TimerCallbackHandler);
-            ThreadPool.QueueUserWorkItem (BlahSignaledHandler);            
+            ThreadPool.QueueUserWorkItem (BlahSignaledHandler);
         }
 
         public static void Dispose ()
@@ -84,44 +84,44 @@ namespace Migo.TaskCore
             lock (sync) {
                 Console.WriteLine ("Dispose - start");
                 if (!disposed) {
-                    disposed = true;                    
+                    disposed = true;
 
                     if (nextEventTimer != null) {
                         nextEventTimer.Dispose ();
-                        nextEventTimer = null;                    
+                        nextEventTimer = null;
                     }
-                    
+
                     if (timerHandle != null) {
-                        timerHandle.Set ();                        
+                        timerHandle.Set ();
                     }
-                        
+
                     for (int i = commands.Count; i > 0; --i) {
                         commands.DeleteMin ();
                     }
                 }
-                Console.WriteLine ("Dispose - end");                
+                Console.WriteLine ("Dispose - end");
             }
         }
-        
+
         private static int count = 0;
         public static void Main ()
         {
-            
+
             ScheduledCommandWrapper[] commands = new ScheduledCommandWrapper[10];
             DateTime time = DateTime.Now.AddMilliseconds (1000);
-            
+
             for (int i = 0; i < 1000; ++i) {
                 TaskScheduler.Schedule (new ScheduledCommandWrapper (
                     time, delegate { lock (sync) { Console.WriteLine ("HI:  {0}", count++); } }
-                )); 
-            
+                ));
+
                 time = time.AddMilliseconds (100);
                 Console.WriteLine (time);
             }
 
             Thread.Sleep (100000);
-        }        
-                
+        }
+
         public static bool Cancel (IPriorityQueueHandle<ScheduledCommandWrapper> handle)
         {
 			bool ret = false;
@@ -129,7 +129,7 @@ namespace Migo.TaskCore
             if (handle == null) {
                 throw new ArgumentNullException ("handle");
             }
-            
+
             lock (sync) {
                 if (!disposed) {
 					ScheduledCommandWrapper command = commands.Delete (handle);
@@ -145,53 +145,53 @@ namespace Migo.TaskCore
             }
 			
 			return ret;
-        }        
-        
+        }
+
         public static IPriorityQueueHandle<ScheduledCommandWrapper> Schedule (ScheduledCommandWrapper scw)
         {
             if (scw == null) {
-                throw new ArgumentNullException ("scw");                
-            }            
-            
-            IPriorityQueueHandle<ScheduledCommandWrapper> handle = null;            
+                throw new ArgumentNullException ("scw");
+            }
+
+            IPriorityQueueHandle<ScheduledCommandWrapper> handle = null;
 
             lock (sync) {
                 if (!disposed) {
                     Console.WriteLine ("Scheduled");
                     commands.Add (ref handle, scw);
-                    
-                    if (nextTask == null || 
+
+                    if (nextTask == null ||
                         nextTask.ScheduledFor > scw.ScheduledFor) {
                         nextTask = scw;
 						ModifyTimer (nextTask.ScheduledFor);
                     }
                 }
             }
-            
+
             return handle;
         }
-         
+
         private static void ModifyTimer (DateTime newTime)
         {
             if (!disposed) {
                 TimeSpan span = newTime - DateTime.Now;
-                long time = span.TotalMilliseconds < 0 ? 0 : 
+                long time = span.TotalMilliseconds < 0 ? 0 :
                     Convert.ToInt64 (span.TotalMilliseconds);
                 nextEventTimer.Change (time, Timeout.Infinite);
             }
         }
-        
+
         private static void TimerCallbackHandler (object state)
         {
             Console.WriteLine ("TimerCallbackHandler");
 
             lock (sync) {
-                if (timerHandle != null) {                
+                if (timerHandle != null) {
                     timerHandle.Set ();
                 }
             }
         }
-        
+
         private static void BlahSignaledHandler (object state)
         {
             try {
@@ -207,7 +207,7 @@ namespace Migo.TaskCore
                 }
             }
         }
-        
+
         private static void BlahSignaledHandlerImpl ()
         {
             bool cont = false;			
@@ -216,9 +216,9 @@ namespace Migo.TaskCore
 			while (true) {
                 Console.WriteLine ("Waiting...");
                 timerHandle.WaitOne ();
-                Console.WriteLine ("Executing...");                
+                Console.WriteLine ("Executing...");
 				do {
-				    cont = false;                       
+				    cont = false;
 					command = null;
 					
 	                lock (sync) {
@@ -226,14 +226,14 @@ namespace Migo.TaskCore
                             Console.WriteLine ("Returned");
 	                        return;
 	                     } else {
-                            command = commands.DeleteMin ();                        
+                            command = commands.DeleteMin ();
                             if (commands.Count > 0) {								
                                 nextTask = commands.FindMin ();
                             } else {
                                 nextTask = null;
                             }
                         }
-                                
+
                         if (nextTask != null) {
                             if (nextTask.ScheduledFor <= DateTime.Now) {
     					        cont = true;
@@ -242,18 +242,18 @@ namespace Migo.TaskCore
                             }
 	                    }
 	                }
-	                
+	
 	                if (command != null) {
-                        try {	                   
+                        try {	
                             command.Execute ();
                         } catch (Exception e) {
                             Console.WriteLine (
                                 "ATS COMMAND EXCEPTION:  {0}", e.Message
-                            );                        
+                            );
                         }
 	                }
 				} while (cont);
-			}            
+			}
         }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskPriority.cs b/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskPriority.cs
index c17275f..498f2a6 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskPriority.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskPriority.cs
@@ -5,34 +5,34 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
 namespace Migo.TaskCore
 {
-    public enum TaskPriority : int 
+    public enum TaskPriority : int
     {
         Lowest,
         BelowNormal,
-        Normal, 
+        Normal,
         AboveNormal,
         Highest
     }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskStatus.cs b/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskStatus.cs
index 175cb96..e88fe2c 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskStatus.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Enumerations/TaskStatus.cs
@@ -5,30 +5,30 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 namespace Migo.TaskCore
 {
-    public enum TaskStatus : int 
+    public enum TaskStatus : int
     {
         Ready,
         Running,
diff --git a/src/Libraries/Migo/Migo.TaskCore/EventArgs/GroupStatusChangedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/EventArgs/GroupStatusChangedEventArgs.cs
index 72bd8fa..b6cdcc2 100644
--- a/src/Libraries/Migo/Migo.TaskCore/EventArgs/GroupStatusChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/EventArgs/GroupStatusChangedEventArgs.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 
 namespace Migo.TaskCore
@@ -35,19 +35,19 @@ namespace Migo.TaskCore
         private readonly int remainingTasks;
         private readonly int runningTasks;
         private readonly int completedTasks;
-        
+
         public int RemainingTasks {
             get { return remainingTasks; }
         }
-        
+
         public int RunningTasks {
             get { return runningTasks; }
         }
-        
+
         public int CompletedTasks {
             get { return completedTasks; }
-        }    
- 
+        }
+
         public GroupStatusChangedEventArgs (int remainingTasks,
                                             int runningTasks,
                                             int completedTasks)
@@ -56,5 +56,5 @@ namespace Migo.TaskCore
             this.runningTasks = runningTasks;
             this.completedTasks = completedTasks;
         }
-    }   
+    }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskCompletedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskCompletedEventArgs.cs
index db3e282..0f7c5dc 100644
--- a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskCompletedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskCompletedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -34,8 +34,8 @@ namespace Migo.TaskCore
     public class TaskCompletedEventArgs: AsyncCompletedEventArgs
     {
         public TaskCompletedEventArgs (Exception error,
-                                       bool cancelled, 
+                                       bool cancelled,
                                        object userState)
                                        : base (error, cancelled, userState) {}
-    }   
+    }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskEventArgs.cs
index f07585b..93a647f 100644
--- a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -31,37 +31,37 @@ using System.Collections.Generic;
 
 namespace Migo.TaskCore
 {
-    public class TaskEventArgs<T> : EventArgs where T : Task 
+    public class TaskEventArgs<T> : EventArgs where T : Task
     {
         private readonly T task;
         private readonly IEnumerable<T> tasks;
-        
-        public T Task 
+
+        public T Task
         {
             get { return task; }
         }
-        
-        public IEnumerable<T> Tasks 
+
+        public IEnumerable<T> Tasks
         {
-            get { return tasks; } 
+            get { return tasks; }
         }
-        
+
         public TaskEventArgs (T task)
         {
             if (task == null) {
                 throw new ArgumentNullException ("task");
             }
-            
+
             this.task = task;
             this.tasks = null;
         }
-        
+
         public TaskEventArgs (IEnumerable<T> tasks)
         {
             if (tasks == null) {
                 throw new ArgumentNullException ("tasks");
             }
-            
+
             this.task = null;
             this.tasks = tasks;
         }
diff --git a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedEventArgs.cs
index 16466c8..e35f93d 100644
--- a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -34,20 +34,20 @@ namespace Migo.TaskCore
     {
         private readonly TaskStatusChangedInfo statusChanged;
         private readonly TaskStatusChangedInfo[] statusesChanged;
-        
-        public TaskStatusChangedInfo StatusChanged 
+
+        public TaskStatusChangedInfo StatusChanged
         {
             get { return statusChanged; }
         }
-        
-        public TaskStatusChangedInfo[] StatusesChanged 
+
+        public TaskStatusChangedInfo[] StatusesChanged
         {
             get { return statusesChanged; }
         }
-        
+
         public TaskStatusChangedEventArgs (TaskStatusChangedInfo status) : this (true, status, null){}
         public TaskStatusChangedEventArgs (TaskStatusChangedInfo[] statuses) : this (false, null, statuses){}
-        
+
         private TaskStatusChangedEventArgs (bool isSingle,
                                             TaskStatusChangedInfo status,
                                             TaskStatusChangedInfo[] statuses)
@@ -55,9 +55,9 @@ namespace Migo.TaskCore
             if (isSingle && status == null) {
                 throw new ArgumentNullException ("status");
             } else if (!isSingle && statuses == null) {
-                throw new ArgumentNullException ("statuses");            
+                throw new ArgumentNullException ("statuses");
             }
-        
+
             this.statusChanged = status;
             this.statusesChanged = statuses;
         }
diff --git a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedInfo.cs b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedInfo.cs
index a308691..f72bb3e 100644
--- a/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedInfo.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/EventArgs/TaskStatusChangedInfo.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -35,22 +35,22 @@ namespace Migo.TaskCore
         private readonly Task task;
         private readonly TaskStatus newStatus;
         private readonly TaskStatus oldStatus;
-        
+
         public TaskStatus NewStatus
         {
             get { return newStatus; }
         }
-        
+
         public TaskStatus OldStatus
         {
             get { return oldStatus; }
-        }   
-        
-        public Task Task 
+        }
+
+        public Task Task
         {
             get { return task; }
         }
-        
+
         public TaskStatusChangedInfo (Task task,
                                       TaskStatus oldStatus,
                                       TaskStatus newStatus)
@@ -58,10 +58,10 @@ namespace Migo.TaskCore
             if (task == null) {
                 throw new ArgumentNullException ("task");
             }
-            
+
             this.task = task;
             this.newStatus = newStatus;
             this.oldStatus = oldStatus;
-        }        
+        }
     }
 }
\ No newline at end of file
diff --git a/src/Libraries/Migo/Migo.TaskCore/Exceptions/TaskStatusException.cs b/src/Libraries/Migo/Migo.TaskCore/Exceptions/TaskStatusException.cs
index e1ffc49..d29de32 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Exceptions/TaskStatusException.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Exceptions/TaskStatusException.cs
@@ -5,32 +5,32 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
-using System; 
- 
+
+using System;
+
 namespace Migo.TaskCore
 {
-    public class TaskStatusException : ApplicationException 
+    public class TaskStatusException : ApplicationException
     {
         public TaskStatusException (string message) : base (message) {}
     }
diff --git a/src/Libraries/Migo/Migo.TaskCore/GroupProgressManager.cs b/src/Libraries/Migo/Migo.TaskCore/GroupProgressManager.cs
index 4855d90..9e37ef3 100644
--- a/src/Libraries/Migo/Migo.TaskCore/GroupProgressManager.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/GroupProgressManager.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.ComponentModel;
 using System.Collections.Generic;
@@ -33,60 +33,60 @@ using System.Collections.Generic;
 namespace Migo.TaskCore
 {
     public class GroupProgressManager<T> where T : Task
-    {   
+    {
         private int progress;
-        private int oldProgress;        
+        private int oldProgress;
 
         private int totalTicks;
         private int currentTicks;
-       
+
         private Dictionary<T,int> progDict;
-        
+
         public event EventHandler<ProgressChangedEventArgs> ProgressChanged;
-        
+
         public GroupProgressManager ()
         {
             progDict = new Dictionary<T,int> ();
         }
-        
+
         public virtual void Add (T task)
         {
             Add (task, true);
         }
-         
+
         public virtual void Add (IEnumerable<T> tasks)
         {
             foreach (T task in tasks) {
                 Add (task, false);
             }
-            
+
             OnProgressChanged ();
-        }        
-        
+        }
+
         protected virtual void Add (T task, bool update)
-        {   
+        {
             if (progDict.ContainsKey (task)) {
-                throw new ArgumentException ("Task was added previously");                 
-            } else if (task.Progress != 0 || 
+                throw new ArgumentException ("Task was added previously");
+            } else if (task.Progress != 0 ||
                        task.Status != TaskStatus.Ready) {
                 throw new InvalidOperationException (
                     "Progress Manager:  Task has already been, or is currently being executed"
-                );                
+                );
             }
-            
+
             totalTicks += 100;
             progDict.Add (task, 0);
-       
+
             if (update) {
                 OnProgressChanged ();
-            }            
+            }
         }
-        
+
         public virtual void Remove (T task)
         {
             Remove (task, true);
         }
-        
+
         public virtual void Remove (IEnumerable<T> tasks)
         {
             foreach (T task in tasks) {
@@ -94,25 +94,25 @@ namespace Migo.TaskCore
                     Remove (task, false);
                 } catch { continue; }
             }
-            
+
             OnProgressChanged ();
         }
-        
+
         protected virtual void Remove (T task, bool update)
         {
             if (task.Progress == 100) {
-                if (progDict.ContainsKey (task)) {                
+                if (progDict.ContainsKey (task)) {
                     progDict.Remove (task);
                 }
-            } else {            
+            } else {
                 int prog = 0;
-                
+
                 if (progDict.ContainsKey (task)) {
                     prog = progDict[task];
                     progDict.Remove (task);
 
                     currentTicks -= prog;
-                    totalTicks -= 100; 
+                    totalTicks -= 100;
                 }
 
                 if (update) {
@@ -121,30 +121,30 @@ namespace Migo.TaskCore
             }
         }
 
-        public virtual void Reset () 
+        public virtual void Reset ()
         {
             progress = 0;
-            oldProgress = 0;        
+            oldProgress = 0;
 
             totalTicks = 0;
             currentTicks = 0;
-            
+
             progDict.Clear ();
         }
-        
+
         public virtual void Update (T task, int newProg)
-        {            
+        {
             if (newProg < 0) {
                 throw new ArgumentOutOfRangeException (
                     "newProg must be greater than or equal to 0"
                 );
             }
-            
+
             int delta = 0;
-            
-            if (progDict.ContainsKey (task)) {      
-                int prog = progDict[task];              
-                
+
+            if (progDict.ContainsKey (task)) {
+                int prog = progDict[task];
+
                 if (prog != newProg) {
                     progDict[task] = newProg;
                     delta = newProg - prog;
@@ -154,9 +154,9 @@ namespace Migo.TaskCore
             if (delta != 0) {
                 currentTicks += delta;
                 OnProgressChanged ();
-            }            
+            }
         }
-        
+
         protected virtual void OnProgressChanged ()
         {
             if (totalTicks == 0) {
@@ -166,15 +166,15 @@ namespace Migo.TaskCore
                     (currentTicks * 100) / totalTicks
                 );
             }
-            
+
             if (progress != oldProgress) {
                 oldProgress = progress;
-                
-                EventHandler<ProgressChangedEventArgs> handler = ProgressChanged;                
-                
+
+                EventHandler<ProgressChangedEventArgs> handler = ProgressChanged;
+
                 if (handler != null) {
                     handler (
-                        this, new ProgressChangedEventArgs (progress, null) 
+                        this, new ProgressChangedEventArgs (progress, null)
                     );
                 }
             }
diff --git a/src/Libraries/Migo/Migo.TaskCore/GroupStatusManager.cs b/src/Libraries/Migo/Migo.TaskCore/GroupStatusManager.cs
index 03f66cc..7f48313 100644
--- a/src/Libraries/Migo/Migo.TaskCore/GroupStatusManager.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/GroupStatusManager.cs
@@ -5,43 +5,43 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
  using System;
  using System.Threading;
- 
+
 namespace Migo.TaskCore
  {
     public class GroupStatusManager : IDisposable
-    {            
-        private bool disposed;        
+    {
+        private bool disposed;
         private bool suspendUpdate;
 
-        private int runningTasks;        
+        private int runningTasks;
         private int completedTasks;
         private int remainingTasks;
         private int maxRunningTasks = 0;
 
-        private ManualResetEvent mre;     
+        private ManualResetEvent mre;
 
         public event EventHandler<GroupStatusChangedEventArgs> StatusChanged;
 
@@ -49,79 +49,79 @@ namespace Migo.TaskCore
         {
             get {
                 CheckDisposed ();
-                return completedTasks; 
+                return completedTasks;
             }
-        }        
-        
+        }
+
         public virtual int RunningTasks
         {
-            get { 
+            get {
                 CheckDisposed ();
                 return runningTasks;
             }
         }
-        
+
         public virtual bool SuspendUpdate
         {
-            get { 
+            get {
                 CheckDisposed ();
                 return suspendUpdate;
             }
-            
+
             set {
                 CheckDisposed ();
-                suspendUpdate = value; 
+                suspendUpdate = value;
             }
         }
-        
+
         public virtual int RemainingTasks
         {
-            get { 
+            get {
                 CheckDisposed ();
                 return remainingTasks;
             }
-            
-            set { 
+
+            set {
                 CheckDisposed ();
                 SetRemainingTasks (value);
             }
-        }        
-        
+        }
+
         public virtual int MaxRunningTasks
         {
-            get { 
+            get {
                 CheckDisposed ();
                 return maxRunningTasks;
             }
-            
+
             set {
                 CheckDisposed ();
-                SetMaxRunningTasks (value); 
+                SetMaxRunningTasks (value);
             }
         }
 
         public virtual WaitHandle Handle {
             get {
                 CheckDisposed ();
-                return mre; 
+                return mre;
             }
         }
 
-        public GroupStatusManager () : this (0, 0) {}        
-        public GroupStatusManager (int totalTasks) : this (totalTasks, 0) {}        
+        public GroupStatusManager () : this (0, 0) {}
+        public GroupStatusManager (int totalTasks) : this (totalTasks, 0) {}
         public GroupStatusManager (int maxRunningTasks, int totalTasks)
         {
             mre = new ManualResetEvent (false);
-            
+
             SetRemainingTasks (totalTasks);
             SetMaxRunningTasks (maxRunningTasks);
         }
 
         public virtual void Dispose ()
         {
-            if (!disposed) {                            
+            if (!disposed) {
                 disposed = true;
-                
+
                 if (mre != null) {
                     mre.Close ();
                     mre = null;
@@ -134,87 +134,87 @@ namespace Migo.TaskCore
             CheckDisposed ();
 
             ++completedTasks;
-            OnStatusChanged ();   
-            
+            OnStatusChanged ();
+
             return completedTasks;
         }
 
         public virtual int DecrementCompletedTaskCount ()
-        {          
+        {
             CheckDisposed ();
-            
+
             if (completedTasks == 0) {
                throw new InvalidOperationException (
                    "Completed task count cannot be less than 0"
                 );
             }
-            
+
             --completedTasks;
-            OnStatusChanged ();                    
-            
+            OnStatusChanged ();
+
             return completedTasks;
-        }        
-        
+        }
+
         public virtual int IncrementRunningTaskCount ()
         {
             CheckDisposed ();
-            
+
             if (runningTasks >= remainingTasks) {
                 throw new InvalidOperationException (
                     "Running task count cannot be > remaining task count"
                 );
-            }        
-        
+            }
+
             ++runningTasks;
-            OnStatusChanged ();      
+            OnStatusChanged ();
 
             Evaluate ();
-            
+
             return runningTasks;
         }
 
         public virtual int DecrementRunningTaskCount ()
         {
             CheckDisposed ();
-            
+
             if (runningTasks == 0) {
                throw new InvalidOperationException (
                    "Runing task count cannot be less than 0"
                 );
             }
-            
+
             --runningTasks;
             OnStatusChanged ();
             Evaluate ();
-            
+
             return runningTasks;
         }
 
         public virtual int IncrementRemainingTaskCount ()
         {
             CheckDisposed ();
-            
+
             SetRemainingTasks (remainingTasks + 1);
             Evaluate ();
-            
-            return remainingTasks;   
-        }        
+
+            return remainingTasks;
+        }
 
         public virtual int DecrementRemainingTaskCount ()
         {
             CheckDisposed ();
-            
+
             if (remainingTasks == 0) {
                 throw new InvalidOperationException (
                     "Remaining task count cannot be less than 0"
                 );
             }
-            
+
             SetRemainingTasks (remainingTasks - 1);
             Evaluate ();
-            
+
             return remainingTasks;
-        }        
+        }
 
         public virtual void ResetWait ()
         {
@@ -225,38 +225,38 @@ namespace Migo.TaskCore
         public virtual void Reset ()
         {
             completedTasks = 0;
-            suspendUpdate = false;            
+            suspendUpdate = false;
         }
 
         public virtual bool SetRemainingTasks (int newRemainingTasks)
-        {             
+        {
             CheckDisposed ();
             if (newRemainingTasks < 0) {
                 throw new ArgumentException ("newRemainingTasks must be >= 0");
             }
-             
-            bool ret = false; 
-             
+
+            bool ret = false;
+
             if (remainingTasks != newRemainingTasks) {
                 ret = true;
                 remainingTasks = newRemainingTasks;
                 OnStatusChanged ();
-                Evaluate ();                
+                Evaluate ();
             }
-                
-            return ret;            
-        }  
+
+            return ret;
+        }
 
         public virtual void Update ()
         {
             CheckDisposed ();
-            OnStatusChanged ();        	    
+            OnStatusChanged ();        	
             Evaluate ();
         }
-        
+
         public virtual void Wait ()
-        {           
-            CheckDisposed ();                
+        {
+            CheckDisposed ();
             mre.WaitOne ();
         }
 
@@ -264,18 +264,18 @@ namespace Migo.TaskCore
         {
             if (disposed) {
                 throw new ObjectDisposedException (GetType ().FullName);
-            }     
+            }
         }
-        
+
         public virtual void Evaluate ()
         {
             if (suspendUpdate) {
                 return;
             }
-                             
+
             if ((remainingTasks == 0 && maxRunningTasks > 0) ||
                (runningTasks < maxRunningTasks &&
-               (remainingTasks - runningTasks) > 0)) { 
+               (remainingTasks - runningTasks) > 0)) {
 
                 mre.Set ();
             }
@@ -284,17 +284,17 @@ namespace Migo.TaskCore
         protected virtual void SetMaxRunningTasks (int newMaxTasks)
         {
             CheckDisposed ();
-                
+
             if (newMaxTasks < 0) {
                 throw new ArgumentException ("newMaxTasks must be >= 0");
             }
-                
+
             if (maxRunningTasks != newMaxTasks) {
                 maxRunningTasks = newMaxTasks;
                 Evaluate ();
             }
-        }   
-        
+        }
+
         protected virtual void OnStatusChanged (GroupStatusChangedEventArgs e)
         {
             if (suspendUpdate) {
@@ -302,23 +302,23 @@ namespace Migo.TaskCore
             }
 
             EventHandler<GroupStatusChangedEventArgs> handler = StatusChanged;
-            
+
             if (handler != null) {
                 handler (this, e);
             }
         }
 
         protected virtual void OnStatusChanged ()
-        {            
+        {
             if (suspendUpdate) {
                 return;
             }
-            
+
             OnStatusChanged (
                 new GroupStatusChangedEventArgs (
                     remainingTasks, runningTasks, completedTasks
                 )
-            );            
-        }        
+            );
+        }
     }
  }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ManipulatedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ManipulatedEventArgs.cs
index 864d0b9..bb847d1 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ManipulatedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ManipulatedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -31,38 +31,38 @@ using System.Collections.Generic;
 
 namespace Migo.TaskCore.Collections
 {
-    public class ManipulatedEventArgs<T> : EventArgs 
-    {  
+    public class ManipulatedEventArgs<T> : EventArgs
+    {
         private T task;
         private ICollection<T> tasks;
-        
+
         public T Task {
             get { return task; }
-            
+
             protected internal set {
                 TestCombination (value, tasks);
                 task = value;
-            }            
+            }
         }
-        
+
         public ICollection<T> Tasks {
             get { return tasks; }
-            
+
             protected internal set {
                 TestCombination (task, value);
                 tasks = value;
             }
         }
-        
+
         protected internal ManipulatedEventArgs () {}
-        
+
         protected ManipulatedEventArgs (T task, ICollection<T> tasks)
         {
             TestCombination (task, tasks);
             this.task = task;
             this.tasks = tasks;
         }
-        
+
         private void TestCombination (T task, ICollection<T> tasks)
         {
             if (task != null && tasks != null) {
@@ -77,4 +77,4 @@ namespace Migo.TaskCore.Collections
         }
     }
 }
-        
+
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ReorderedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ReorderedEventArgs.cs
index a4cfd47..e15386f 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ReorderedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/ReorderedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -32,8 +32,8 @@ namespace Migo.TaskCore.Collections
 {
     public class ReorderedEventArgs : EventArgs
     {
-        private readonly int[] order; 
-        
+        private readonly int[] order;
+
         public int[] Order
         {
             get { return order; }
@@ -43,6 +43,6 @@ namespace Migo.TaskCore.Collections
         public ReorderedEventArgs (int[] order)
         {
             this.order = order;
-        }        
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskAddedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskAddedEventArgs.cs
index cd79d6a..0b1d4c7 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskAddedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskAddedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -33,52 +33,52 @@ using Migo.TaskCore;
 
 namespace Migo.TaskCore.Collections
 {
-    public class TaskAddedEventArgs<T> : ManipulatedEventArgs<T> where T : Task 
-    {  
+    public class TaskAddedEventArgs<T> : ManipulatedEventArgs<T> where T : Task
+    {
         private readonly KeyValuePair<int,T> taskPair;
         private readonly ICollection<KeyValuePair<int,T>> taskPairs;
-        
+
         public KeyValuePair<int,T> TaskPair
         {
             get { return taskPair; }
         }
-        
-        // All indices are listed in ascending order from the start of the 
+
+        // All indices are listed in ascending order from the start of the
         // list so that in order addition will not affect indices.
         public ICollection<KeyValuePair<int,T>> TaskPairs
         {
             get { return taskPairs; }
         }
-        
+
         public TaskAddedEventArgs (int pos, T task) : base (task, null)
         {
             if (task == null) {
                 throw new ArgumentNullException ("task");
-            }            
-            
+            }
+
             this.taskPairs = null;
-            this.taskPair = new KeyValuePair<int,T> (pos, task);                       
+            this.taskPair = new KeyValuePair<int,T> (pos, task);
         }
-        
+
         public TaskAddedEventArgs (ICollection<KeyValuePair<int,T>> taskPairs)
         {
             if (taskPairs == null) {
                 throw new ArgumentNullException ("taskPairs");
             }
-            
+
             List<T> tsks = new List<T> (taskPairs.Count);
-            
-            foreach (KeyValuePair<int,T> kvp in taskPairs) {                
+
+            foreach (KeyValuePair<int,T> kvp in taskPairs) {
                 if (kvp.Value == null) {
                     throw new ArgumentNullException (
                         "No task in tasks may be null"
                     );
-                }                
-                
+                }
+
                 tsks.Add (kvp.Value);
             }
 
-            this.Tasks = tsks;            
+            this.Tasks = tsks;
             this.taskPairs = taskPairs;
             this.taskPair = default (KeyValuePair<int,T>);
         }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskRemovedEventArgs.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskRemovedEventArgs.cs
index 22ce033..1c9088c 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskRemovedEventArgs.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/EventArgs/TaskRemovedEventArgs.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -33,8 +33,8 @@ using Migo.TaskCore;
 
 namespace Migo.TaskCore.Collections
 {
-    public class TaskRemovedEventArgs<T> : ManipulatedEventArgs<T> where T : Task 
-    {  
+    public class TaskRemovedEventArgs<T> : ManipulatedEventArgs<T> where T : Task
+    {
         private readonly int index;
         private readonly IEnumerable<KeyValuePair<int,int>> indices;
 
@@ -42,10 +42,10 @@ namespace Migo.TaskCore.Collections
         {
             get { return index; }
         }
-        
-        // All indices are listed in descending order from the end of the 
+
+        // All indices are listed in descending order from the end of the
         // list so that in order removal will not affect indices.
-   
+
         // int - 0:  Index
         // int - 1:  Count
         public IEnumerable <KeyValuePair<int,int>> Indices
@@ -53,8 +53,8 @@ namespace Migo.TaskCore.Collections
             get { return indices; }
         }
 
-        protected TaskRemovedEventArgs (int index, T task, 
-                                        IEnumerable<KeyValuePair<int,int>> indices, ICollection<T> tasks) 
+        protected TaskRemovedEventArgs (int index, T task,
+                                        IEnumerable<KeyValuePair<int,int>> indices, ICollection<T> tasks)
                                         : base (task, tasks)
         {
             if (indices == null && index < 0) {
@@ -62,14 +62,14 @@ namespace Migo.TaskCore.Collections
                     "indices may not be null if index is < 0"
                 );
             }
-            
+
             this.index = index;
             this.indices = indices;
         }
-        
-        public TaskRemovedEventArgs (int index, T task) 
+
+        public TaskRemovedEventArgs (int index, T task)
             : this (index, task, null, null) {}
-        public TaskRemovedEventArgs (IEnumerable<KeyValuePair<int,int>> indices, ICollection<T> tasks) 
+        public TaskRemovedEventArgs (IEnumerable<KeyValuePair<int,int>> indices, ICollection<T> tasks)
             : this (-1, null, indices, tasks) {}
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/ITaskCollectionEnumerator.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/ITaskCollectionEnumerator.cs
index a024cfe..fe3a029 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/ITaskCollectionEnumerator.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/ITaskCollectionEnumerator.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -37,12 +37,12 @@ namespace Migo.TaskCore.Collections
     // This could cause issues for collections such as heaps.
     public interface ITaskCollectionEnumerator<T> : IEnumerator<T>
         where T : Task
-    {        
+    {
         // this needs to be looked at again.
         new T Current {
             get;
-        }   
-        
+        }
+
         bool MoveFirst (TaskStatus status);
         bool MoveLast (TaskStatus status);
     }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/PriorityQueue.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/PriorityQueue.cs
index ac0c443..26e472d 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/PriorityQueue.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/PriorityQueue.cs
@@ -5,24 +5,24 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskCollection.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskCollection.cs
index 1d98971..20bbd2f 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskCollection.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskCollection.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -33,83 +33,83 @@ using System.Collections.Generic;
 using Migo.TaskCore;
 
 namespace Migo.TaskCore.Collections
-{    
+{
     public abstract class TaskCollection<T> : ICollection<T>
         where T : Task
     {
-        private AsyncCommandQueue commandQueue;        
-        
+        private AsyncCommandQueue commandQueue;
+
         public EventHandler<ReorderedEventArgs> Reordered;
-    
+
         public EventHandler<TaskAddedEventArgs<T>> TaskAdded;
-        public EventHandler<TaskRemovedEventArgs<T>> TaskRemoved;        
-           
-        public abstract bool CanReorder 
+        public EventHandler<TaskRemovedEventArgs<T>> TaskRemoved;
+
+        public abstract bool CanReorder
         {
             get; // is Move implemented
         }
-    
+
         public virtual AsyncCommandQueue CommandQueue
         {
             get { return commandQueue; }
-            set { commandQueue = value; } 
+            set { commandQueue = value; }
         }
-    
+
         public abstract int Count {
             get;
         }
 
         public abstract bool IsReadOnly {
             get;
-        }          
-        
+        }
+
         public abstract bool IsSynchronized {
             get;
-        }          
-        
+        }
+
         public abstract object SyncRoot {
             get;
-        }        
-    
+        }
+
         public TaskCollection () {}
 
         public abstract IEnumerator<T> GetEnumerator ();
-        
+
         // This needs to be looked into.
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
-        public abstract T this [int index] 
+
+        public abstract T this [int index]
         {
             get; set;
         }
 
         public abstract void Add (T task);
-        public abstract bool Remove (T task);     
+        public abstract bool Remove (T task);
         public abstract void Remove (IEnumerable<T> tasks);
-        
-        public abstract void CopyTo (T[] array, int index);        
+
+        public abstract void CopyTo (T[] array, int index);
         public abstract void CopyTo (Array array, int index);
-        
-        public abstract void Clear ();                
-        public abstract bool Contains (T task); 
+
+        public abstract void Clear ();
+        public abstract bool Contains (T task);
 
         protected virtual IEnumerable<KeyValuePair<int,int>> DetectContinuity (int[] indices)
-        {                        
+        {
             if (indices == null) {
                 throw new ArgumentNullException ("indices");
             } else if (indices.Length == 0) {
                 return null;
             }
-            
+
             int cnt;
             int len = indices.Length;
-            List<KeyValuePair<int,int>> ret = new List<KeyValuePair<int,int>>();            
-            
+            List<KeyValuePair<int,int>> ret = new List<KeyValuePair<int,int>>();
+
             int i = len-1;
-            
+
             while (i > 0) {
                 cnt = 1;
                 while (indices[i] == indices[i-1]+1)
@@ -122,18 +122,18 @@ namespace Migo.TaskCore.Collections
 
                 ret.Add (new KeyValuePair<int,int>(indices[i--], cnt));
             }
-            
+
             return ret;
         }
-        
+
         protected virtual void OnReordered (int[] newOrder)
         {
             EventHandler<ReorderedEventArgs> handler = Reordered;
 
             if (handler != null) {
                 ReorderedEventArgs e = new ReorderedEventArgs (newOrder);
-                
-                if (commandQueue != null) {              
+
+                if (commandQueue != null) {
                 	commandQueue.Register (
                 	    new EventWrapper<ReorderedEventArgs> (handler, this, e)
                 	);
@@ -142,21 +142,21 @@ namespace Migo.TaskCore.Collections
                 }
             }
         }
-        
+
         protected virtual void OnTaskAdded (int pos, T task)
         {
             EventHandler<TaskAddedEventArgs<T>> handler = TaskAdded;
-            
+
             if (handler != null) {
-                TaskAddedEventArgs<T> e = new TaskAddedEventArgs<T> (pos, task);            
+                TaskAddedEventArgs<T> e = new TaskAddedEventArgs<T> (pos, task);
 
-                if (commandQueue != null) {  
+                if (commandQueue != null) {
                 	commandQueue.Register (
                 	    new EventWrapper<TaskAddedEventArgs<T>> (handler, this, e)
                 	);
                 } else {
                     handler (this, e);
-                } 
+                }
             }
         }
 
@@ -166,8 +166,8 @@ namespace Migo.TaskCore.Collections
 
             if (handler != null) {
                 TaskAddedEventArgs<T> e = new TaskAddedEventArgs<T> (pairs);
-            
-                if (commandQueue != null) {            
+
+                if (commandQueue != null) {
                 	commandQueue.Register (new EventWrapper<TaskAddedEventArgs<T>> (
                 	    handler, this, e)
                 	);
@@ -176,15 +176,15 @@ namespace Migo.TaskCore.Collections
                 }
             }
         }
-    
+
         protected virtual void OnTaskRemoved (int index, T task)
         {
             EventHandler<TaskRemovedEventArgs<T>> handler = TaskRemoved;
 
             if (handler != null) {
-                TaskRemovedEventArgs<T> e = 
+                TaskRemovedEventArgs<T> e =
                     new TaskRemovedEventArgs<T> (index, task);
-            
+
                 if (commandQueue != null) {
                 	commandQueue.Register (
                 	    new EventWrapper<TaskRemovedEventArgs<T>> (handler, this, e)
@@ -193,8 +193,8 @@ namespace Migo.TaskCore.Collections
             	    handler (this, e);
             	}
             }
-        }    
-    
+        }
+
         protected virtual void OnTasksRemoved (ICollection<T> tasks,
                                                IEnumerable<KeyValuePair<int,int>> indices)
         {
@@ -202,8 +202,8 @@ namespace Migo.TaskCore.Collections
 
             if (handler != null) {
                 TaskRemovedEventArgs<T> e = new TaskRemovedEventArgs<T> (indices, tasks);
-            
-                if (commandQueue != null) {            
+
+                if (commandQueue != null) {
                 	commandQueue.Register (
                 	    new EventWrapper<TaskRemovedEventArgs<T>> (handler, this, e)
                 	);
@@ -211,6 +211,6 @@ namespace Migo.TaskCore.Collections
                     handler (this, e);
                 }
             }
-        } 
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskList.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskList.cs
index 1a849e3..6ef697f 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskList.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskList.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -33,35 +33,35 @@ using System.Collections.Generic;
 using Migo.TaskCore;
 
 namespace Migo.TaskCore.Collections
-{    
-    public class TaskList<T> : TaskCollection<T>, IList<T>, IEnumerable<T>, IEnumerable 
+{
+    public class TaskList<T> : TaskCollection<T>, IList<T>, IEnumerable<T>, IEnumerable
         where T : Task
     {
         private List<T> list;
         internal int generation;
-        
+
         private readonly object syncRoot = new object ();
-        
+
         public override bool CanReorder {
             get { return true; }
         }
-        
+
         public override int Count {
             get { return list.Count; }
         }
-        
+
         public override bool IsReadOnly {
             get { return false; }
-        }        
-        
+        }
+
         public override bool IsSynchronized {
             get { return false; }
-        }        
-        
+        }
+
         public override object SyncRoot {
             get { return syncRoot; }
         }
-        
+
         public TaskList ()
         {
             list = new List<T> ();
@@ -69,84 +69,84 @@ namespace Migo.TaskCore.Collections
         }
 
         public override T this [int index] {
-            get { 
+            get {
                 CheckIndex (index);
                 return list[index];
             }
-            
+
             set {
                 CheckIndex (index);
-                list[index] = value; 
+                list[index] = value;
             }
-        }        
-        
+        }
+
         public override void Add (T task)
         {
             CheckTask (task);
-            
+
             int index = list.Count;
-            
+
             list.Add (task);
             ++generation;
 
             OnTaskAdded (index, task);
         }
-        
+
         public void AddRange (IEnumerable<T> tasks)
         {
             CheckTasks (tasks);
-        
+
             int index = list.Count;
             list.AddRange (tasks);
             ++generation;
-            
+
             OnTasksAdded (CreatePairs (index, tasks));
         }
-        
+
         public override void Clear ()
         {
             RemoveRange (0, list.Count);
         }
-        
+
         public override bool Contains (T task)
         {
             bool ret = false;
-            
+
             if (task != null) {
                 ret = list.Contains (task);
             }
-            
+
             return ret;
-        }        
-        
+        }
+
         public override void CopyTo (T[] array, int index)
         {
-            CheckCopyArgs (array, index);        
+            CheckCopyArgs (array, index);
             list.CopyTo (array, index);
         }
-        
+
         public override void CopyTo (Array array, int index)
         {
-            CheckCopyArgs (array, index);            
+            CheckCopyArgs (array, index);
             Array.Copy (list.ToArray (), 0, array, index, list.Count);
         }
-        
+
         public override IEnumerator<T> GetEnumerator ()
         {
             return new TaskListEnumerator<T> (this);
         }
-        
+
         public int IndexOf (T task)
         {
             int ret = -1;
-            
+
             if (task != null) {
                 ret = list.IndexOf (task);
             }
-            
+
             return ret;
         }
-        
+
         public void Insert (int index, T task)
         {
             CheckTask (task);
@@ -154,19 +154,19 @@ namespace Migo.TaskCore.Collections
 
             list.Insert (index, task);
             ++generation;
-            
+
             OnTaskAdded (index, task);
         }
-        
+
         public void InsertRange (int index, IEnumerable<T> tasks)
         {
-            CheckDestIndex (index);         
+            CheckDestIndex (index);
             CheckTasks (tasks);
-            
+
             list.InsertRange (index, tasks);
             ++generation;
-            
-            OnTasksAdded (CreatePairs (index, tasks));  
+
+            OnTasksAdded (CreatePairs (index, tasks));
         }
 
         public void Move (int sourceIndex, int destIndex)
@@ -174,80 +174,80 @@ namespace Migo.TaskCore.Collections
             if (sourceIndex == destIndex) {
                 return;
             } else if (sourceIndex >= list.Count || sourceIndex < 0) {
-                throw new ArgumentOutOfRangeException ("sourceIndex");    
+                throw new ArgumentOutOfRangeException ("sourceIndex");
             } else if (destIndex > list.Count || destIndex < 0) {
-                throw new ArgumentOutOfRangeException ("destIndex");    
+                throw new ArgumentOutOfRangeException ("destIndex");
             }
-                            
+
             Dictionary<Task,int> oldOrder = SaveOrder ();
-            
+
             T tmpTask;
-            
+
             tmpTask = list[sourceIndex];
             list.RemoveAt (sourceIndex);
-                
+
             int maxIndex = list.Count;
-               
+
             if (destIndex > maxIndex) {
-                list.Insert (maxIndex, tmpTask);                 
+                list.Insert (maxIndex, tmpTask);
             } else {
-                list.Insert (destIndex, tmpTask);                
+                list.Insert (destIndex, tmpTask);
             }
-            
+
             ++generation;
             OnReordered (NewOrder (oldOrder));
         }
-        
+
         public void Move (int destIndex, int[] sourceIndices)
         {
             if (destIndex > list.Count || destIndex < 0) {
-                throw new ArgumentOutOfRangeException ("destIndex");    
+                throw new ArgumentOutOfRangeException ("destIndex");
             }
-            
+
             int maxIndex = list.Count;
             List<T> tmpList = new List<T> (sourceIndices.Length);
-                        
-            foreach (int i in sourceIndices) 
+
+            foreach (int i in sourceIndices)
             {
                 if (i < 0 || i > maxIndex) {
                     throw new ArgumentOutOfRangeException ("sourceIndices");
                 }
-                
-                // A possible performance enhancement is to check for 
-                // contiguous regions in the source and remove those regions 
+
+                // A possible performance enhancement is to check for
+                // contiguous regions in the source and remove those regions
                 // at once.
                 tmpList.Add (list[i]);
             }
 
             Dictionary<Task,int> oldOrder = SaveOrder ();
 
-            if (tmpList.Count > 0) 
-            {            
+            if (tmpList.Count > 0)
+            {
                 int offset = 0;
                 Array.Sort (sourceIndices);
-                
+
                 foreach (int i in sourceIndices)
                 {
                     try {
                         list.RemoveAt (i-offset);
                     } catch { continue; }
-                    
+
                     ++offset;
                 }
-                              
-                maxIndex = list.Count;                              
-                              
+
+                maxIndex = list.Count;
+
                 if (destIndex > maxIndex) {
                     list.InsertRange (maxIndex, tmpList);
                 } else {
                     list.InsertRange (destIndex, tmpList);
                 }
-                
+
                 ++generation;
                 OnReordered (NewOrder (oldOrder));
             }
         }
-        
+
         public override bool Remove (T task)
         {
             bool ret = false;
@@ -255,76 +255,76 @@ namespace Migo.TaskCore.Collections
 
             if (index != -1) {
                 list.RemoveAt (index);
-                
+
                 ret = true;
                 ++generation;
                 OnTaskRemoved (index, task);
             }
-            
+
             return ret;
         }
-        
+
         public override void Remove (IEnumerable<T> tasks)
         {
             if (tasks == null) {
                 throw new ArgumentNullException ("tasks");
             }
-            
+
             int lastIndex;
             int currentIndex;
             List<int> indices = new List<int> ();
-            List<T> removedTasks = new List<T> ();            
+            List<T> removedTasks = new List<T> ();
             Dictionary<T,int> lastPosition = new Dictionary<T,int> ();
-            
+
             foreach (T task in tasks) {
-                lastIndex = lastPosition.ContainsKey (task) ? 
+                lastIndex = lastPosition.ContainsKey (task) ?
                     lastPosition[task] : -1;
-                    
+
                 currentIndex = list.IndexOf (task, lastIndex+1);
-                
+
                 if (currentIndex != -1) {
                     removedTasks.Add (task);
                     indices.Add (currentIndex);
-                    
+
                     if (lastIndex != -1) {
-                        lastPosition[task] = currentIndex;   
+                        lastPosition[task] = currentIndex;
                     } else {
                         lastPosition.Add (task, currentIndex);
                     }
                 }
-            }                        
-            
+            }
+
             if (indices.Count > 0) {
                 indices.Sort ();
-                
+
                 for (int i = indices.Count-1; i >= 0; --i) {
-                    list.RemoveAt (i);   
+                    list.RemoveAt (i);
                 }
-                
+
                 ++generation;
-                OnTasksRemoved (removedTasks, DetectContinuity (indices.ToArray ()));                            
+                OnTasksRemoved (removedTasks, DetectContinuity (indices.ToArray ()));
             }
         }
-        
+
         public void RemoveAt (int index)
         {
             CheckIndex (index);
-            
+
             T task = list[index];
             list.RemoveAt (index);
             ++generation;
-            
-            OnTaskRemoved (index, task);            
-        }        
-        
+
+            OnTaskRemoved (index, task);
+        }
+
         public void RemoveRange (int index, int count)
-        {            
+        {
             if (count == 0) {
                 return;
             }
-            
-            CheckIndex (index);            
-            
+
+            CheckIndex (index);
+
             if (count < 0 || count > list.Count) {
                 throw new ArgumentOutOfRangeException ("count");
             } else if (count+index > list.Count) {
@@ -332,12 +332,12 @@ namespace Migo.TaskCore.Collections
                     "index and count exceed length of list"
                 );
             }
-            
+
             List<T> tasks = list.GetRange (index, count);
-            
+
             list.RemoveRange (index, count);
             ++generation;
-            
+
             int[] indices = new int[count];
 
             for (int i = 0; i < count; ++i) {
@@ -363,14 +363,14 @@ namespace Migo.TaskCore.Collections
             } else if (index >= array.Length) {
                 throw new ArgumentException (
                     "index exceeds array length"
-                );            
+                );
             } else if (list.Count > (array.Length-index)) {
                 throw new ArgumentException (
                     "index and count exceed length of array"
-                );            
+                );
             }
         }
-        
+
         private void CheckDestIndex (int index)
         {
             if (index < 0 || index > list.Count) {
@@ -378,13 +378,13 @@ namespace Migo.TaskCore.Collections
             }
         }
 
-        private void CheckIndex (int index) 
+        private void CheckIndex (int index)
         {
             if (index < 0 || index >= list.Count) {
                 throw new ArgumentOutOfRangeException ("index");
-            }        
+            }
         }
-        
+
         private void CheckTask (T task)
         {
             if (task == null) {
@@ -397,7 +397,7 @@ namespace Migo.TaskCore.Collections
             if (tasks == null) {
                 throw new ArgumentNullException ("tasks");
             }
-            
+
             foreach (Task t in tasks) {
                 if (t == null) {
                     throw new ArgumentException (
@@ -410,37 +410,37 @@ namespace Migo.TaskCore.Collections
         private ICollection<KeyValuePair<int,T>> CreatePairs (int index, IEnumerable<T> tasks)
         {
             List<KeyValuePair<int,T>> pairs = new List<KeyValuePair<int,T>> ();
-            
+
             foreach (T task in tasks) {
                 pairs.Add (new KeyValuePair<int,T> (index++, task));
-            }        
-            
+            }
+
             return pairs;
         }
-        
+
         private int[] NewOrder (Dictionary<Task,int> oldOrder)
         {
             int i = -1;
             int[] newOrder = new int[list.Count];
-            
+
             foreach (Task t in list) {
                 newOrder[++i] = oldOrder[t];
             }
-            
+
             return newOrder;
-        }        
-        
+        }
+
         private Dictionary<Task,int> SaveOrder ()
         {
             Dictionary<Task,int> ret = new Dictionary<Task,int> (list.Count);
-            
+
             int i = -1;
-            
+
             foreach (Task t in list) {
                 ret[t] = ++i;
             }
-            
+
             return ret;
-        }        
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskListEnumerator.cs b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskListEnumerator.cs
index 6785efb..092326f 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskListEnumerator.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Migo.TaskCore.Collections/TaskListEnumerator.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -37,38 +37,38 @@ namespace Migo.TaskCore.Collections
     public class TaskListEnumerator<T> : ITaskCollectionEnumerator<T>
         where T : Task
     {
-        private TaskList<T> list;        
+        private TaskList<T> list;
 
         private int index;
-        private int generation;        
-                        
-        public T Current 
+        private int generation;
+
+        public T Current
         {
-            get { 
+            get {
                 Check ();
-                
+
                 if (index < 0 || index >= list.Count) {
                     throw new ArgumentOutOfRangeException ("index");
                 }
-                
+
                 return list[index];
-            }        
+            }
         }
-        
+
         T ITaskCollectionEnumerator<T>.Current {
             get { return Current; }
         }
 
         object IEnumerator.Current {
             get { return Current; }
-        } 
+        }
 
         public TaskListEnumerator (TaskList<T> taskList)
         {
             if (taskList == null) {
                 throw new ArgumentNullException ("taskList");
             }
-            
+
             list = taskList;
             index = -1;
             generation = list.generation;
@@ -86,22 +86,22 @@ namespace Migo.TaskCore.Collections
             index = -1;
             generation = list.generation;
         }
-        
+
         public bool MoveNext ()
         {
             Check ();
             return (++index < list.Count);
         }
-        
+
         public bool MoveFirst (TaskStatus status)
         {
             Check ();
-            
+
             int i;
             int retIndex;
-            
+
             retIndex = i = -1;
-            
+
             foreach (T t in list) {
                 ++i;
                 if (t != null) {
@@ -111,41 +111,41 @@ namespace Migo.TaskCore.Collections
                     }
                 }
             }
-            
-            return MoveIndex (retIndex);            
+
+            return MoveIndex (retIndex);
         }
-        
+
         public bool MoveLast (TaskStatus status)
         {
             Check ();
-            
+
             T t;
             int i = list.Count;
 
             while (--i > -1) {
                 t = list[i];
-                
+
                 if (t != null) {
                     if (t.Status == status) {
                         break;
                     }
                 }
             }
-            
-            return MoveIndex (i);            
-        }        
-         
+
+            return MoveIndex (i);
+        }
+
         private bool MoveIndex (int index)
         {
             bool ret = false;
             if (index < list.Count && index > -1) {
                 this.index = index;
                 ret = true;
-            } 
-            
+            }
+
             return ret;
         }
-        
+
         private void Check ()
         {
             if (list == null) {
diff --git a/src/Libraries/Migo/Migo.TaskCore/Task.cs b/src/Libraries/Migo/Migo.TaskCore/Task.cs
index 6b62197..420523d 100644
--- a/src/Libraries/Migo/Migo.TaskCore/Task.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/Task.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Threading;
 using System.ComponentModel;
@@ -33,76 +33,76 @@ using System.ComponentModel;
 namespace Migo.TaskCore
 {
     public abstract class Task
-    {    
+    {
         private string name;
-        private int progress;        
-        
+        private int progress;
+
         private Guid groupID;
         private AsyncCommandQueue commandQueue;
-        
+
         private TaskStatus status;
-        
-        private readonly object userState;        
-        private readonly object syncRoot = new object ();            
-        
-        public EventHandler<TaskCompletedEventArgs> Completed;                        
-        public EventHandler<ProgressChangedEventArgs> ProgressChanged;            
-        public EventHandler<TaskStatusChangedEventArgs> StatusChanged;            
-        
-        public bool IsCompleted 
+
+        private readonly object userState;
+        private readonly object syncRoot = new object ();
+
+        public EventHandler<TaskCompletedEventArgs> Completed;
+        public EventHandler<ProgressChangedEventArgs> ProgressChanged;
+        public EventHandler<TaskStatusChangedEventArgs> StatusChanged;
+
+        public bool IsCompleted
         {
             get {
                 bool ret = false;
                 TaskStatus status = Status;
-                
+
                 if (status == TaskStatus.Cancelled ||
                     status == TaskStatus.Failed    ||
                     status == TaskStatus.Succeeded ||
                     status == TaskStatus.Stopped
                 ) {
                     ret = true;
-                }   
-                
+                }
+
                 return ret;
             }
         }
-        
-        public string Name 
+
+        public string Name
         {
             get { return name; }
             set { name = value; }
         }
 
-        public int Progress 
+        public int Progress
         {
             get { return progress; }
             protected set {
                 SetProgress (value);
             }
-        }   
+        }
 
-        public TaskStatus Status 
+        public TaskStatus Status
         {
             get { return status; }
-            protected set { SetStatus (value); } 
+            protected set { SetStatus (value); }
         }
 
-        public object SyncRoot 
+        public object SyncRoot
         {
             get { return syncRoot; }
-        }        
-        
+        }
+
         public object UserState {
             get { return userState; }
         }
-        
+
         public abstract WaitHandle WaitHandle {
             get;
-        }        
-     
+        }
+
         internal Guid GroupID {
             get { return groupID; }
-            set { 
+            set {
                 lock (syncRoot) {
                     groupID = value;
                     commandQueue = CommandQueueManager.GetCommandQueue (groupID);
@@ -113,15 +113,15 @@ namespace Migo.TaskCore
         protected Task () : this (String.Empty, null) {}
         protected Task (string name, object userState)
         {
-            GroupID = Guid.Empty;                                    
+            GroupID = Guid.Empty;
 
             this.name = name;
             this.userState = userState;
-            
+
             progress = 0;
-            status = TaskStatus.Ready;            
-        }     
-        
+            status = TaskStatus.Ready;
+        }
+
         public abstract void CancelAsync ();
         public abstract void ExecuteAsync ();
 
@@ -137,12 +137,12 @@ namespace Migo.TaskCore
 
         public virtual void Stop ()
         {
-            throw new NotImplementedException ("Stop");            
+            throw new NotImplementedException ("Stop");
         }
 
         public override string ToString ()
         {
-            return Name;  
+            return Name;
         }
 
         protected virtual void SetProgress (int progress)
@@ -157,20 +157,20 @@ namespace Migo.TaskCore
 
         protected internal virtual void SetStatus (TaskStatus status)
         {
-            SetStatus (status, true);              
-        }                
-                
-        protected internal virtual void SetStatus (TaskStatus status, 
+            SetStatus (status, true);
+        }
+
+        protected internal virtual void SetStatus (TaskStatus status,
                                                    bool emitStatusChangedEvent)
         {
             if (this.status != status) {
                 TaskStatus oldStatus = this.status;
                 this.status = status;
-                
+
                 if (emitStatusChangedEvent) {
                     OnStatusChanged (oldStatus, status);
                 }
-            }                
+            }
         }
 
         protected virtual void OnProgressChanged (int progress)
@@ -184,21 +184,21 @@ namespace Migo.TaskCore
         {
             AsyncCommandQueue queue = commandQueue;
             EventHandler<ProgressChangedEventArgs> handler = ProgressChanged;
-            
+
             if (queue != null) {
-                queue.Register (new CommandWrapper (delegate {     
+                queue.Register (new CommandWrapper (delegate {
                     if (handler != null) {
-                        handler (this, e);                
+                        handler (this, e);
                     }
-                }));                    
+                }));
             } else if (handler != null) {
-                ThreadPool.QueueUserWorkItem (delegate {                            
+                ThreadPool.QueueUserWorkItem (delegate {
                     handler (this, e);
                 });
             }
         }
 
-        protected virtual void OnStatusChanged (TaskStatus oldStatus, 
+        protected virtual void OnStatusChanged (TaskStatus oldStatus,
                                                 TaskStatus newStatus)
         {
             OnStatusChanged (
@@ -212,27 +212,27 @@ namespace Migo.TaskCore
             EventHandler<TaskStatusChangedEventArgs> handler = StatusChanged;
 
             if (queue != null) {
-                queue.Register (new CommandWrapper (delegate {            
-                    TaskStatusChangedEventArgs e = new TaskStatusChangedEventArgs (tsci);                      
+                queue.Register (new CommandWrapper (delegate {
+                    TaskStatusChangedEventArgs e = new TaskStatusChangedEventArgs (tsci);
                     if (handler != null) {
-                        handler (this, e);               
+                        handler (this, e);
                     }
                 }));
             } else if (handler != null) {
-                ThreadPool.QueueUserWorkItem (delegate {            
+                ThreadPool.QueueUserWorkItem (delegate {
                     handler (this, new TaskStatusChangedEventArgs (tsci));
                 });
             }
         }
-  
+
         protected virtual void OnTaskCompleted (Exception error, bool cancelled)
         {
             OnTaskCompleted (new TaskCompletedEventArgs (
                 error, cancelled, userState
-            ));               
+            ));
         }
-        
-        protected virtual void OnTaskCompleted (TaskCompletedEventArgs e) 
+
+        protected virtual void OnTaskCompleted (TaskCompletedEventArgs e)
         {
             AsyncCommandQueue queue = commandQueue;
             EventHandler<TaskCompletedEventArgs> handler = Completed;
@@ -248,6 +248,6 @@ namespace Migo.TaskCore
                     handler (this, e);
                 });
             }
-        }  
+        }
     }
 }
diff --git a/src/Libraries/Migo/Migo.TaskCore/TaskGroup.cs b/src/Libraries/Migo/Migo.TaskCore/TaskGroup.cs
index 0ab76d9..3c587a7 100644
--- a/src/Libraries/Migo/Migo.TaskCore/TaskGroup.cs
+++ b/src/Libraries/Migo/Migo.TaskCore/TaskGroup.cs
@@ -5,27 +5,27 @@
  *  Written by Mike Urbanski <michael.c.urbanski at gmail.com>
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLgsm, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLgsm, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
- 
+
 using System;
 using System.Threading;
 using System.ComponentModel;
@@ -34,43 +34,43 @@ using System.Collections.Generic;
 using Migo.TaskCore.Collections;
 
 namespace Migo.TaskCore
-{        
+{
     public class TaskGroup<T> where T : Task
-    {         
+    {
         private bool disposed;
         private bool executing;
         private bool cancelRequested;
-                
-        private readonly Guid id;                      
-        private readonly object sync;        
-        
-        private AsyncCommandQueue commandQueue;        
-        
-        private List<T> currentTasks;        
-        private TaskCollection<T> tasks;            
-           
+
+        private readonly Guid id;
+        private readonly object sync;
+
+        private AsyncCommandQueue commandQueue;
+
+        private List<T> currentTasks;
+        private TaskCollection<T> tasks;
+
         private GroupStatusManager gsm;
         private GroupProgressManager<T> gpm;
-        
+
         // Used to notify user after stopped event has fired
         private ManualResetEvent execHandle = new ManualResetEvent (true);
-        
+
         // mildly redundant but necessary
-        // Used to notify system when all tasks are completed       
+        // Used to notify system when all tasks are completed
         private AutoResetEvent executingHandle = new AutoResetEvent (false);
-        
+
         public event EventHandler<EventArgs> Started;
         public event EventHandler<EventArgs> Stopped;
-        
+
         public event EventHandler<TaskEventArgs<T>> TaskStarted;
-        public event EventHandler<TaskEventArgs<T>> TaskStopped;        
+        public event EventHandler<TaskEventArgs<T>> TaskStopped;
         public event EventHandler<TaskEventArgs<T>> TaskAssociated;
-        
+
         public event EventHandler<ProgressChangedEventArgs> ProgressChanged;
-        public event EventHandler<GroupStatusChangedEventArgs> StatusChanged;        
+        public event EventHandler<GroupStatusChangedEventArgs> StatusChanged;
 
         public event EventHandler<ProgressChangedEventArgs> TaskProgressChanged;
-        public event EventHandler<TaskStatusChangedEventArgs> TaskStatusChanged;        
+        public event EventHandler<TaskStatusChangedEventArgs> TaskStatusChanged;
 
         public virtual int CompletedTasks
         {
@@ -81,16 +81,16 @@ namespace Migo.TaskCore
                 }
             }
         }
-        
-        protected virtual bool Disposed 
+
+        protected virtual bool Disposed
         {
-            get { 
+            get {
                 lock (sync) {
                     return disposed;
                 }
             }
         }
-        
+
         public virtual bool IsExecuting
         {
             get {
@@ -100,26 +100,26 @@ namespace Migo.TaskCore
                 }
             }
         }
-        
+
         public Guid ID {
-            get { 
-                lock (sync) {            
-                    CheckDisposed ();                
+            get {
+                lock (sync) {
+                    CheckDisposed ();
                     return id;
                 }
             }
         }
-        
-        public virtual int RunningTasks 
+
+        public virtual int RunningTasks
         {
             get {
-                lock (sync) {            
+                lock (sync) {
                     CheckDisposed ();
                     return gsm.RunningTasks;
                 }
             }
-        }                
-        
+        }
+
         public virtual TaskCollection<T> Tasks
         {
             get {
@@ -130,45 +130,45 @@ namespace Migo.TaskCore
             }
         }
 
-        public virtual int RemainingTasks 
+        public virtual int RemainingTasks
         {
             get {
-                lock (sync) {                
+                lock (sync) {
                     CheckDisposed ();
                     return gsm.RemainingTasks;
                 }
             }
-        }     
+        }
 
         protected GroupProgressManager<T> ProgressManager
         {
             get {
                 return gpm;
             }
-            
+
             set {
-                SetProgressManager (value); 
+                SetProgressManager (value);
             }
         }
 
-        protected GroupStatusManager StatusManager 
+        protected GroupStatusManager StatusManager
         {
-            get { 
+            get {
                 if (gsm == null) {
                     SetStatusManager (new GroupStatusManager ());
                 }
-                
+
                 return gsm;
             }
-            
-            set { 
-                SetStatusManager (value); 
+
+            set {
+                SetStatusManager (value);
             }
         }
 
-        public IEnumerable<T> CurrentTasks 
+        public IEnumerable<T> CurrentTasks
         {
-            get { 
+            get {
                 lock (sync) {
 					CheckDisposed ();					
                     return currentTasks as IEnumerable<T>;
@@ -176,28 +176,28 @@ namespace Migo.TaskCore
             }
         }
 
-        public int MaxRunningTasks 
+        public int MaxRunningTasks
         {
             get {
                 lock (sync) {
-                    CheckDisposed ();                
-                    return gsm.MaxRunningTasks; 
+                    CheckDisposed ();
+                    return gsm.MaxRunningTasks;
                 }
             }
-            
-            set { 
+
+            set {
                 lock (sync) {
-                    CheckDisposed ();                
+                    CheckDisposed ();
                     gsm.MaxRunningTasks = value;
                 }
             }
-        }      
+        }
 
-        public WaitHandle Handle 
+        public WaitHandle Handle
         {
-            get { 
+            get {
                 lock (sync) {
-                    CheckDisposed ();            
+                    CheckDisposed ();
                     return execHandle;
                 }
             }
@@ -205,33 +205,33 @@ namespace Migo.TaskCore
 
         public object SyncRoot
         {
-            get {             
+            get {
                 return sync;
             }
         }
-        
+
         private bool IsDone
         {
             get {
                 return (Disposed || gsm.RemainingTasks == 0);
             }
-        }        
-        
+        }
+
         public TaskGroup (int maxRunningTasks, TaskCollection<T> tasks)
             : this (maxRunningTasks, tasks, null, null)
         {
         }
 
-        public TaskGroup (int maxRunningTasks, 
-                          TaskCollection<T> tasks, 
+        public TaskGroup (int maxRunningTasks,
+                          TaskCollection<T> tasks,
                           GroupStatusManager statusManager)
             : this (maxRunningTasks, tasks, statusManager, null)
         {
         }
-        
-        protected TaskGroup (int maxRunningTasks, 
+
+        protected TaskGroup (int maxRunningTasks,
                              TaskCollection<T> tasks,
-                             GroupStatusManager statusManager, 
+                             GroupStatusManager statusManager,
                              GroupProgressManager<T> progressManager)
         {
             if (maxRunningTasks < 0) {
@@ -239,64 +239,64 @@ namespace Migo.TaskCore
             } else if (tasks == null) {
                 throw new ArgumentNullException ("tasks");
             }
-            
+
             sync = tasks.SyncRoot;
             currentTasks = new List<T> (maxRunningTasks);
 
             commandQueue = new AsyncCommandQueue ();
             id = CommandQueueManager.Register (commandQueue);
-                     
+
             SetProgressManager (
                 progressManager ?? new GroupProgressManager<T> ()
-            );            
-                        
+            );
+
             SetStatusManager (
                 statusManager ?? new GroupStatusManager ()
-            );  
-                        
+            );
+
             try {
                 gsm.SuspendUpdate = true;
-                
+
                 gsm.RemainingTasks = tasks.Count;
-                gsm.MaxRunningTasks = maxRunningTasks;               
-                                
+                gsm.MaxRunningTasks = maxRunningTasks;
+
                 SetTaskCollection (tasks);
             } finally {
                 gsm.SuspendUpdate = false;
                 gsm.Update ();
-            }         
+            }
         }
-   
+
         public virtual void CancelAsync ()
         {
             if (SetCancelled ()) {
                 List<T> tasksCpy = null;
 
-                lock (sync) {                    
+                lock (sync) {
                     tasksCpy = new List<T> (tasks);
 
                     foreach (T task in tasksCpy) {
                         task.CancelAsync ();
                     }
-                }                      
+                }
             }
         }
-        
+
         public virtual void StopAsync ()
         {
             if (SetCancelled ()) {
                 List<T> tasksCpy = null;
 
-                lock (sync) {                    
+                lock (sync) {
                     tasksCpy = new List<T> (tasks);
-                    
+
                     foreach (T task in tasksCpy) {
                         task.Stop ();
                     }
-                }                      
-            } 
-        }        
-        
+                }
+            }
+        }
+
 		public virtual void Dispose ()
 		{
 		    Dispose (null);
@@ -304,42 +304,42 @@ namespace Migo.TaskCore
 		
         public virtual void Dispose (AutoResetEvent handle)
         {
-            if (SetDisposed ()) { 
-                commandQueue.Dispose ();                                
-                
+            if (SetDisposed ()) {
+                commandQueue.Dispose ();
+
                 try {
                     lock (sync) {
-                        tasks.TaskAdded -= OnTaskAddedHandler;            
-                        tasks.TaskRemoved -= OnTaskRemovedHandler; 
+                        tasks.TaskAdded -= OnTaskAddedHandler;
+                        tasks.TaskRemoved -= OnTaskRemovedHandler;
                         tasks.CommandQueue = null;
 
                         if (tasks.Count > 0) {
                             Disassociate (tasks);
-                        }                          
-                    }    
-                    
+                        }
+                    }
+
                     gsm.StatusChanged -= OnStatusChangedHandler;
                     gsm.Dispose ();
-                    
+
                     gpm.ProgressChanged -= OnProgressChangedHandler;
                     gpm.Reset ();
                 } finally {
                     gpm = null;
                     gsm = null;
                     tasks = null;
-                }            
-            
+                }
+
                 if (executingHandle != null) {
                     executingHandle.Close ();
-                    executingHandle = null;                    
+                    executingHandle = null;
                 }
-                
+
                 if (execHandle != null) {
                     execHandle.Close ();
                     execHandle = null;
                 }
             }
-            
+
             if (handle != null) {
                 handle.Set ();
             }
@@ -347,14 +347,14 @@ namespace Migo.TaskCore
 
         public void Execute ()
         {
-            if (SetExecuting (true)) {                
+            if (SetExecuting (true)) {
                 try {
                     OnStarted ();
                     SpawnExecutionThread ();
                 } catch (Exception e) {
                     Hyena.Log.Exception (e);
-                    SetExecuting (false);                
-                    Reset ();                                                                        
+                    SetExecuting (false);
+                    Reset ();
                     OnStopped ();
                 }
             }
@@ -364,33 +364,33 @@ namespace Migo.TaskCore
         {
             lock (sync) {
                 CheckDisposed ();
-                
+
                 if (executing && !cancelRequested) {
                     cancelRequested = true;
                     return true;
                 }
             }
-            
+
             return false;
         }
-        
+
         private bool SetDisposed ()
         {
             lock (sync) {
                 if (!disposed) {
                     disposed = true;
-                    return true; 
+                    return true;
                 }
             }
 
             return false;
         }
-        
+
         protected virtual bool SetExecuting (bool exec)
         {
             lock (sync) {
                 CheckDisposed ();
-                
+
                 if (exec) {
                     if (!executing && !cancelRequested) {
                         executing = true;
@@ -401,56 +401,56 @@ namespace Migo.TaskCore
                     cancelRequested = false;
                 }
             }
-            
+
             return false;
         }
 
-        protected virtual void SetProgressManager (GroupProgressManager<T> progressManager) 
+        protected virtual void SetProgressManager (GroupProgressManager<T> progressManager)
         {
-            CheckDisposed ();        
-            
+            CheckDisposed ();
+
             if (progressManager == null) {
                 throw new ArgumentNullException ("progressManager");
             } else if (gpm != null) {
                 throw new InvalidOperationException ("ProgressManager already set");
             }
-                                
+
             gpm = progressManager;
             gpm.ProgressChanged += OnProgressChangedHandler;
         }
-        
-        protected virtual void SetStatusManager (GroupStatusManager statusManager) 
+
+        protected virtual void SetStatusManager (GroupStatusManager statusManager)
         {
             CheckDisposed ();
-            
+
             if (statusManager == null) {
                 throw new ArgumentNullException ("statusManager");
             } else if (gsm != null) {
                 throw new InvalidOperationException ("StatusManager already set");
             }
-            
+
             gsm = statusManager;
             gsm.StatusChanged += OnStatusChangedHandler;
         }
-        
+
         protected virtual void SetTaskCollection (TaskCollection<T> collection)
         {
-            CheckDisposed ();                
-    
+            CheckDisposed ();
+
             if (tasks != null) {
                 throw new InvalidOperationException (
                     "Already associated with a task collection"
                 );
             }
-    
+
             tasks = collection;
             tasks.CommandQueue = commandQueue;
-            
-            tasks.TaskAdded += OnTaskAddedHandler;            
-            tasks.TaskRemoved += OnTaskRemovedHandler; 
-            
-            Associate (tasks);                   
-        }        
+
+            tasks.TaskAdded += OnTaskAddedHandler;
+            tasks.TaskRemoved += OnTaskRemovedHandler;
+
+            Associate (tasks);
+        }
 
         protected virtual void CheckDisposed ()
         {
@@ -463,42 +463,42 @@ namespace Migo.TaskCore
         {
             Associate (task, true);
         }
-                
+
         protected virtual void Associate (IEnumerable<T> tasks)
-        {          
+        {
             foreach (T task in tasks) {
                 if (task != null) {
                     Associate (task, false);
                 }
             }
-            
+
             gpm.Add (tasks);
         }
 
         protected virtual void Associate (T task, bool addToProgressGroup)
-        {            
-            CheckDisposed ();            
+        {
+            CheckDisposed ();
 
             if (task.GroupID != Guid.Empty) {
                 throw new ApplicationException (
                     "Task already associated with a group"
                 );
-            }             
-            
+            }
+
             task.GroupID = id;
-            
+
             task.Completed += OnTaskCompletedHandler;
             task.ProgressChanged += OnTaskProgressChangedHandler;
             task.StatusChanged += OnTaskStatusChangedHandler;
 
             if (addToProgressGroup) {
                 gpm.Add (task);
-            }      
+            }
         }
 
         protected virtual bool CheckID (T task)
         {
-            return (task.GroupID == id); 
+            return (task.GroupID == id);
         }
 
         protected virtual void Disassociate (IEnumerable<T> tasks)
@@ -516,21 +516,21 @@ namespace Migo.TaskCore
         {
             Disassociate (task, true);
         }
-        
+
         protected virtual void Disassociate (T task, bool removeFromProgressGroup)
         {
             if (CheckID (task)) {
                 task.GroupID = Guid.Empty;
-                
+
                 task.Completed -= OnTaskCompletedHandler;
                 task.ProgressChanged -= OnTaskProgressChangedHandler;
-                task.StatusChanged -= OnTaskStatusChangedHandler;  
-                
+                task.StatusChanged -= OnTaskStatusChangedHandler;
+
                 if (removeFromProgressGroup && gpm != null) {
                     gpm.Remove (task);
-                }              
+                }
             }
-        }    
+        }
 
         protected virtual void Reset ()
         {
@@ -548,13 +548,13 @@ namespace Migo.TaskCore
                 OnEvent (Started);
             }
         }
-        
+
         protected virtual void OnStopped ()
         {
             lock (sync) {
                 OnEvent (Stopped);
-                execHandle.Set ();                
-            }            
+                execHandle.Set ();
+            }
         }
 
         protected virtual void OnTaskStarted (T task)
@@ -593,94 +593,94 @@ namespace Migo.TaskCore
         }
 
         protected virtual void OnTaskCompletedHandler (object sender, TaskCompletedEventArgs e)
-        {   
+        {
             lock (sync) {
                 T t = sender as T;
-                
+
                 try {
                     gsm.SuspendUpdate = true;
-                    
+
                     if (currentTasks.Contains (t)) {
                         gsm.DecrementRunningTaskCount ();
-                        
+
                         if (t.IsCompleted) {
                             if (!e.Cancelled) {
                                 gsm.IncrementCompletedTaskCount ();
-                            }           
+                            }
                         }
                     }
-                    
+
                     if (t.IsCompleted) {
                         gsm.DecrementRemainingTaskCount ();
                     }
                 } finally {
                     gsm.SuspendUpdate = false;
                     gsm.Update ();
-                    OnTaskStopped (t);                                
+                    OnTaskStopped (t);
                 }
             }
-        }       
-        
+        }
+
         protected virtual void OnTaskProgressChangedHandler (object sender, ProgressChangedEventArgs e)
-        {     
-            EventHandler<ProgressChangedEventArgs> handler = TaskProgressChanged;                
-                
+        {
+            EventHandler<ProgressChangedEventArgs> handler = TaskProgressChanged;
+
             lock (sync) {
                 if (!cancelRequested) {
                     gpm.Update (sender as T, e.ProgressPercentage);
                 }
-            }   
-            
+            }
+
             if (handler != null) {
-                handler (this, e);          
-            }                           
-        }        
-        
+                handler (this, e);
+            }
+        }
+
         protected virtual void OnTaskStatusChangedHandler (object sender, TaskStatusChangedEventArgs e)
-        {         
-            EventHandler<TaskStatusChangedEventArgs> handler = TaskStatusChanged;                
-                
+        {
+            EventHandler<TaskStatusChangedEventArgs> handler = TaskStatusChanged;
+
             if (handler != null) {
-                handler (this, e);        
-            }            
-            
-            gsm.Evaluate ();       
-        } 
-        
+                handler (this, e);
+            }
+
+            gsm.Evaluate ();
+        }
+
         protected virtual void OnTaskAddedHandler (object sender, TaskAddedEventArgs<T> e)
-        {        
+        {
             lock (sync) {
                 if (e.Task != null) {
                     Associate (e.Task);
                     gsm.IncrementRemainingTaskCount ();
-                    OnTaskAssociated (e.Task);    
+                    OnTaskAssociated (e.Task);
                 } else if (e.Tasks != null) {
                     Associate (e.Tasks);
                     gsm.RemainingTasks += e.Tasks.Count;
                     OnTaskAssociated (e.Tasks);
-                }  
+                }
             }
-        }        
-        
+        }
+
         protected virtual void OnTaskRemovedHandler (object sender, TaskRemovedEventArgs<T> e)
         {
             lock (sync) {
                 if (e.Index != -1 && e.Task != null) {
                     T tsk = e.Task as T;
-                    
+
                     if (currentTasks.Contains (tsk)) {
                         tsk.CancelAsync ();
                         return;
-                    } else if (tsk.Status == TaskStatus.Ready || 
+                    } else if (tsk.Status == TaskStatus.Ready ||
                                tsk.Status == TaskStatus.Paused) {
                         gsm.DecrementRemainingTaskCount ();
-                    } 
-                    
-                    Disassociate (tsk);                    
-                } else if (e.Indices != null && e.Tasks != null) {           
+                    }
+
+                    Disassociate (tsk);
+                } else if (e.Indices != null && e.Tasks != null) {
                     int sub = e.Tasks.Count;
                     List<T> removeList = new List<T> (sub);
-                    
+
                     foreach (T tsk in e.Tasks) {
                         if (currentTasks.Contains (tsk)) {
                             tsk.CancelAsync ();
@@ -689,9 +689,9 @@ namespace Migo.TaskCore
                             removeList.Add (tsk);
                         }
                     }
-                    
+
                     if (sub > 0) {
-                        Disassociate (removeList);                        
+                        Disassociate (removeList);
                         gsm.RemainingTasks -= sub;
                     }
                 }
@@ -701,13 +701,13 @@ namespace Migo.TaskCore
         protected virtual void OnProgressChangedHandler (object sender, ProgressChangedEventArgs e)
         {
             lock (sync) {
-                if (!cancelRequested) {        
+                if (!cancelRequested) {
                     EventHandler<ProgressChangedEventArgs> handler = ProgressChanged;
-                    
+
                     if (handler != null) {
                     	commandQueue.Register (
                     	    new EventWrapper<ProgressChangedEventArgs> (handler, this, e)
-                    	);            
+                    	);
                     }
                 }
             }
@@ -717,121 +717,121 @@ namespace Migo.TaskCore
         {
             OnTaskEvent (task, TaskAssociated);
         }
-        
-        protected virtual void OnTaskAssociated (IEnumerable<T> tasks) 
+
+        protected virtual void OnTaskAssociated (IEnumerable<T> tasks)
         {
-            OnTaskEvent (tasks, TaskAssociated);            
+            OnTaskEvent (tasks, TaskAssociated);
         }
-        
+
         private void OnEvent (EventHandler<EventArgs> eventHandler)
         {
             EventHandler<EventArgs> handler = eventHandler;
-        
+
             if (handler != null) {
             	commandQueue.Register (new EventWrapper<EventArgs> (
             	    handler, this, new EventArgs ())
             	);
-            }                
+            }
         }
 
         private void OnTaskEvent (T task, EventHandler<TaskEventArgs<T>> eventHandler)
         {
             EventHandler<TaskEventArgs<T>> handler = eventHandler;
-        
+
             if (handler != null) {
             	commandQueue.Register (new EventWrapper<TaskEventArgs<T>> (
             	    handler, this, new TaskEventArgs<T> (task))
             	);
-            }                         
+            }
         }
 
         private void OnTaskEvent (IEnumerable<T> tasks, EventHandler<TaskEventArgs<T>> eventHandler)
         {
             EventHandler<TaskEventArgs<T>> handler = eventHandler;
-        
+
             if (handler != null) {
             	commandQueue.Register (new EventWrapper<TaskEventArgs<T>> (
             	    handler, this, new TaskEventArgs<T> (tasks))
             	);
-            }                         
-        }        
-        
+            }
+        }
+
         private void PumpQueue ()
         {
             try {
-                PumpQueueImpl (); 
+                PumpQueueImpl ();
             } finally {
                 executingHandle.WaitOne ();
-                
+
                 lock (sync) {
-                    SetExecuting (false); 
+                    SetExecuting (false);
                     OnStopped ();
                     Reset ();
                 }
             }
         }
-                
+
         private void PumpQueueImpl ()
         {
             T task;
-            
+
             while (true) {
                 gsm.Wait ();
-           
+
                 lock (sync) {
-                    gsm.ResetWait ();     
-                    
+                    gsm.ResetWait ();
+
                     if (IsDone) {
-                        executingHandle.Set ();                                                
+                        executingHandle.Set ();
                         return;
                     } else if (cancelRequested) {
                         continue;
                     }
-                    
+
                     task = null;
                     ITaskCollectionEnumerator<T> tce = Tasks.GetEnumerator ()
-                        as ITaskCollectionEnumerator<T>;   
-                        
+                        as ITaskCollectionEnumerator<T>;
+
                     if (tce.MoveFirst (TaskStatus.Ready)) {
                         task = tce.Current;
-  
-                        try {                            
-                            lock (task.SyncRoot) { 
+
+                        try {
+                            lock (task.SyncRoot) {
                                 if (task.Status != TaskStatus.Ready) {
                                 	continue;
                                 }
-                                
+
                                 currentTasks.Add (task);
                                 gsm.IncrementRunningTaskCount ();
-                            
+
                                 OnTaskStarted (task);
                                 task.ExecuteAsync ();
                             }
-                        } catch (Exception e) {        
+                        } catch (Exception e) {
                             Hyena.Log.Exception (e);
-                            
+
                             try {
                                 gsm.SuspendUpdate = true;
                                 gsm.DecrementRunningTaskCount ();
                                 gsm.IncrementCompletedTaskCount ();
                             } finally {
-                                OnTaskStopped (task);                             
+                                OnTaskStopped (task);
                                 gsm.SuspendUpdate = false;
                                 gsm.Update ();
-                            } 
+                            }
                         }
                     }
                 }
             }
-        } 
-        
+        }
+
         private void SpawnExecutionThread ()
-        {                     
+        {
             Thread t = new Thread (new ThreadStart (PumpQueue));
             t.Name = GetType ().ToString ();
             t.Priority = ThreadPriority.Normal;
             t.IsBackground = true;
-            t.Start ();       
-        }        
+            t.Start ();
+        }
     }
 }
diff --git a/src/Libraries/Mono.Data.Sqlite/Makefile.in b/src/Libraries/Mono.Data.Sqlite/Makefile.in
index fcaf899..475ee4f 100644
--- a/src/Libraries/Mono.Data.Sqlite/Makefile.in
+++ b/src/Libraries/Mono.Data.Sqlite/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -391,6 +400,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -494,11 +504,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -516,6 +527,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -545,6 +557,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -564,14 +577,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Mono.Data.Sqlite/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Mono.Data.Sqlite/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Mono.Data.Sqlite/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Mono.Data.Sqlite/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -589,25 +602,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -637,13 +666,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -675,6 +708,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -695,6 +729,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -703,18 +739,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -775,7 +821,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -792,6 +838,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3.cs
index 6c86468..2b8ed01 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3_UTF16.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3_UTF16.cs
index d109c96..0babde8 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3_UTF16.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLite3_UTF16.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for SQLite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteBase.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteBase.cs
index 25a06f0..a7e3394 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteBase.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteBase.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for SQLite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -112,7 +112,7 @@ namespace Mono.Data.Sqlite
     /// <param name="stmt">The statement to finalize</param>
     internal abstract void FinalizeStatement(SqliteStatement stmt);
     /// <summary>
-    /// Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA, 
+    /// Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,
     /// transparently attempt to rebuild the SQL statement and throw an error if that was not possible.
     /// </summary>
     /// <param name="stmt">The statement to reset</param>
@@ -178,7 +178,7 @@ namespace Mono.Data.Sqlite
     internal abstract void SetRollbackHook(SqliteRollbackCallback func);
 
     internal abstract long GetLastInsertRowId ();
-    
+
     internal abstract object GetValue(SqliteStatement stmt, int index, SqliteType typ);
 
     protected virtual void Dispose(bool bDisposing)
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommand.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommand.cs
index 759266e..eb9d039 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommand.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommand.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for SQLite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -109,7 +109,7 @@ namespace Mono.Data.Sqlite
     /// Initializes the command with the given command text
     /// </summary>
     /// <param name="commandText">The SQL command text</param>
-    public SqliteCommand(string commandText) 
+    public SqliteCommand(string commandText)
       : this(commandText, null, null)
     {
     }
@@ -129,7 +129,7 @@ namespace Mono.Data.Sqlite
     /// Initializes the command and associates it with the specified connection.
     /// </summary>
     /// <param name="connection">The connection to associate with the command</param>
-    public SqliteCommand(SqliteConnection connection) 
+    public SqliteCommand(SqliteConnection connection)
       : this(null, connection, null)
     {
     }
@@ -234,7 +234,7 @@ namespace Mono.Data.Sqlite
 
           _parameterCollection.MapParameters(stmt);
           stmt.BindParameters();
-        }        
+        }
         return stmt;
       }
       catch (Exception)
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommandBuilder.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommandBuilder.cs
index 4a3a18c..0910a2d 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommandBuilder.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteCommandBuilder.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -347,7 +347,7 @@ namespace Mono.Data.Sqlite
     private bool HasSchemaPrimaryKey(DataTable schema)
     {
       DataColumn IsKeyColumn = schema.Columns[SchemaTableColumn.IsKey];
-      
+
       foreach (DataRow schemaRow in schema.Rows)
       {
         if ((bool)schemaRow[IsKeyColumn] == true)
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnection.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnection.cs
index f6f6263..968501d 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnection.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnection.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -141,7 +141,7 @@ namespace Mono.Data.Sqlite
     /// Busy command timeout value. Defaults to 30
     /// </summary>
     internal int                 _busyTimeout;
-    
+
 #if !PLATFORM_COMPACTFRAMEWORK
     /// <summary>
     /// Whether or not the connection is enlisted in a distrubuted transaction
@@ -166,7 +166,7 @@ namespace Mono.Data.Sqlite
     /// </summary>
     private byte[]               _password;
 #endif
-    
+
     internal bool                _binaryGuid;
 
     internal long                _version;
@@ -347,7 +347,7 @@ namespace Mono.Data.Sqlite
     }
 
     /// <summary>
-    /// Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection 
+    /// Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection
     /// will also be opened.
     /// </summary>
     /// <returns></returns>
@@ -421,7 +421,7 @@ namespace Mono.Data.Sqlite
     /// </summary>
     /// <param name="isolationLevel">Sqlite doesn't support varying isolation levels, so this parameter is ignored.</param>
     /// <param name="deferredLock">When TRUE, Sqlite defers obtaining a write lock until a write operation is requested.
-    /// When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer 
+    /// When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
     /// environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
     /// <returns>Returns a SqliteTransaction object.</returns>
     public SqliteTransaction BeginTransaction(System.Data.IsolationLevel isolationLevel, bool deferredLock)
@@ -433,7 +433,7 @@ namespace Mono.Data.Sqlite
     /// Creates a new SqliteTransaction if one isn't already active on the connection.
     /// </summary>
     /// <param name="deferredLock">When TRUE, Sqlite defers obtaining a write lock until a write operation is requested.
-    /// When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer 
+    /// When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
     /// environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
     /// <returns>Returns a SqliteTransaction object.</returns>
     public SqliteTransaction BeginTransaction(bool deferredLock)
@@ -503,7 +503,7 @@ namespace Mono.Data.Sqlite
         if (_enlistment != null)
         {
           // If the connection is enlisted in a transaction scope and the scope is still active,
-          // we cannot truly shut down this connection until the scope has completed.  Therefore make a 
+          // we cannot truly shut down this connection until the scope has completed.  Therefore make a
           // hidden connection temporarily to hold open the connection until the scope has completed.
           SqliteConnection cnn = new SqliteConnection();
           cnn._sql = _sql;
@@ -511,7 +511,7 @@ namespace Mono.Data.Sqlite
           cnn._enlistment = _enlistment;
           cnn._connectionState = _connectionState;
           cnn._version = _version;
-          
+
           cnn._enlistment._transaction._cnn = cnn;
           cnn._enlistment._disposeConnection = true;
         }
@@ -651,7 +651,7 @@ namespace Mono.Data.Sqlite
 #endif
     public override string DataSource
     {
-      get 
+      get
       {
         return _dataSource;
       }
@@ -678,13 +678,13 @@ namespace Mono.Data.Sqlite
     internal void MapMonoKeyword (string[] arPiece, List<KeyValuePair<string, string>> ls)
     {
 	    string keyword, value;
-	    
+	
 	    switch (arPiece[0].ToLower (CultureInfo.InvariantCulture)) {
 		    case "uri":
 			    keyword = "Data Source";
 			    value = MapMonoUriPath (arPiece[1]);
 			    break;
-			    
+			
 		    default:
 			    keyword = arPiece[0];
 			    value = arPiece[1];
@@ -706,7 +706,7 @@ namespace Mono.Data.Sqlite
 		    throw new InvalidOperationException ("Invalid connection string: invalid URI");
 	    }
     }
-    
+
     /// <summary>
     /// Parses the connection string into component parts
     /// </summary>
@@ -808,7 +808,7 @@ namespace Mono.Data.Sqlite
       } catch (Exception) {
 	      // ignore
       }
-      
+
       try
       {
         bool bUTF16 = (Convert.ToBoolean(FindKey(opts, "UseUTF16Encoding", "False"), CultureInfo.InvariantCulture) == true);
@@ -960,7 +960,7 @@ namespace Mono.Data.Sqlite
     {
       SetPassword(String.IsNullOrEmpty(databasePassword) ? null : System.Text.UTF8Encoding.UTF8.GetBytes(databasePassword));
     }
-    
+
     /// <summary>
     /// Sets the password for a password-protected database.  A password-protected database is
     /// unusable for any operation until the password has been set.
@@ -977,7 +977,7 @@ namespace Mono.Data.Sqlite
       _password = databasePassword;
     }
 #endif
-    
+
     /// <summary>
     /// Expand the filename of the data source, resolving the |DataDirectory| macro as appropriate.
     /// </summary>
@@ -1991,7 +1991,7 @@ namespace Mono.Data.Sqlite
   internal delegate void SqliteRollbackCallback();
 
   /// <summary>
-  /// Raised when a transaction is about to be committed.  To roll back a transaction, set the 
+  /// Raised when a transaction is about to be committed.  To roll back a transaction, set the
   /// rollbackTrans boolean value to true.
   /// </summary>
   /// <param name="sender">The connection committing the transaction</param>
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnectionStringBuilder.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnectionStringBuilder.cs
index 2fa72ce..bb813f0 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnectionStringBuilder.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConnectionStringBuilder.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -189,7 +189,7 @@ namespace Mono.Data.Sqlite
       }
     }
 #endregion
-    
+
     /// <summary>
     /// Determines whether or not the connection will automatically participate
     /// in the current distributed transaction (if one exists)
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConvert.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConvert.cs
index 725b5f2..deb6404 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConvert.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteConvert.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -48,7 +48,7 @@ namespace Mono.Data.Sqlite
   using System.Globalization;
   using System.Text;
 
-#if !PLATFORM_COMPACTFRAMEWORK 
+#if !PLATFORM_COMPACTFRAMEWORK
   using System.ComponentModel.Design;
 #endif
 
@@ -136,7 +136,7 @@ namespace Mono.Data.Sqlite
     private static string[] _datetimeFormats = new string[] {
       "yyyy-MM-dd HH:mm:ss.fffffff",
       "yyyy-MM-dd HH:mm:ss",
-      "yyyy-MM-dd HH:mm",                               
+      "yyyy-MM-dd HH:mm",
       "yyyyMMddHHmmss",
       "yyyyMMddHHmm",
       "yyyyMMddTHHmmssfffffff",
@@ -225,7 +225,7 @@ namespace Mono.Data.Sqlite
     {
       if (nativestring == IntPtr.Zero)
         return null;
-    
+
       // This assumes a single byte terminates the string.
 
       int len = 0;
@@ -237,7 +237,7 @@ namespace Mono.Data.Sqlite
         len = s.Length;
         while (len > 0 && s [len-1] == 0)
           --len;
-        if (len == s.Length) 
+        if (len == s.Length)
           return s;
         return s.Substring (0, len);
       }
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataAdapter.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataAdapter.cs
index 60bb1d8..592f901 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataAdapter.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataAdapter.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataReader.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataReader.cs
index f885667..3a38363 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataReader.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteDataReader.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -102,7 +102,7 @@ namespace Mono.Data.Sqlite
     /// </summary>
     private SqliteKeyReader _keyInfo;
 #endif
-    
+
     /// <summary>
     /// Internal constructor, initializes the datareader and sets up to begin executing statements
     /// </summary>
@@ -236,7 +236,7 @@ namespace Mono.Data.Sqlite
     /// <summary>
     /// Sqlite is inherently un-typed.  All datatypes in Sqlite are natively strings.  The definition of the columns of a table
     /// and the affinity of returned types are all we have to go on to type-restrict data in the reader.
-    /// 
+    ///
     /// This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In
     /// the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)
     /// to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.
@@ -300,7 +300,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetBoolean(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Boolean);
       return Convert.ToBoolean(GetValue(i), CultureInfo.CurrentCulture);
     }
@@ -316,7 +316,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetByte(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Byte);
       return Convert.ToByte(_activeStatement._sql.GetInt32(_activeStatement, i));
     }
@@ -339,7 +339,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetBytes(i - VisibleFieldCount, fieldOffset, buffer, bufferoffset, length);
 #endif
-      
+
       VerifyType(i, DbType.Binary);
       return _activeStatement._sql.GetBytes(_activeStatement, i, (int)fieldOffset, buffer, bufferoffset, length);
     }
@@ -355,7 +355,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetChar(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.SByte);
       return Convert.ToChar(_activeStatement._sql.GetInt32(_activeStatement, i));
     }
@@ -378,7 +378,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetChars(i - VisibleFieldCount, fieldoffset, buffer, bufferoffset, length);
 #endif
-      
+
       VerifyType(i, DbType.String);
       return _activeStatement._sql.GetChars(_activeStatement, i, (int)fieldoffset, buffer, bufferoffset, length);
     }
@@ -396,7 +396,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetDataTypeName(i - VisibleFieldCount);
 #endif
-      
+
       SqliteType typ = GetSqliteType(i);
       if (typ.Type == DbType.Object) return SqliteConvert.SqliteTypeToType(typ).Name;
       return _activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity);
@@ -413,7 +413,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetDateTime(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.DateTime);
       return _activeStatement._sql.GetDateTime(_activeStatement, i);
     }
@@ -429,7 +429,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetDecimal(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Decimal);
       return Convert.ToDecimal(_activeStatement._sql.GetDouble(_activeStatement, i));
     }
@@ -445,7 +445,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetDouble(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Double);
       return _activeStatement._sql.GetDouble(_activeStatement, i);
     }
@@ -463,7 +463,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetFieldType(i - VisibleFieldCount);
 #endif
-      
+
       return SqliteConvert.SqliteTypeToType(GetSqliteType(i));
     }
 
@@ -478,7 +478,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetFloat(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Single);
       return Convert.ToSingle(_activeStatement._sql.GetDouble(_activeStatement, i));
     }
@@ -494,7 +494,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetGuid(i - VisibleFieldCount);
 #endif
-      
+
       TypeAffinity affinity = VerifyType(i, DbType.Guid);
       if (affinity == TypeAffinity.Blob)
       {
@@ -517,7 +517,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetInt16(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Int16);
       return Convert.ToInt16(_activeStatement._sql.GetInt32(_activeStatement, i));
     }
@@ -533,7 +533,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetInt32(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Int32);
       return _activeStatement._sql.GetInt32(_activeStatement, i);
     }
@@ -549,7 +549,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetInt64(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.Int64);
       return _activeStatement._sql.GetInt64(_activeStatement, i);
     }
@@ -566,7 +566,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetName(i - VisibleFieldCount);
 #endif
-      
+
       return _activeStatement._sql.ColumnName(_activeStatement, i);
     }
 
@@ -586,7 +586,7 @@ namespace Mono.Data.Sqlite
         if (r > -1) r += VisibleFieldCount;
       }
 #endif
-      
+
       return r;
     }
 
@@ -666,7 +666,7 @@ namespace Mono.Data.Sqlite
 
         strColumn = _command.Connection._sql.ColumnOriginalName(_activeStatement, n);
         if (String.IsNullOrEmpty(strColumn) == false) row[SchemaTableColumn.BaseColumnName] = strColumn;
-        
+
         row[SchemaTableColumn.IsExpression] = String.IsNullOrEmpty(strColumn);
         row[SchemaTableColumn.IsAliased] = (String.Compare(GetName(n), strColumn, true, CultureInfo.InvariantCulture) != 0);
 
@@ -781,7 +781,7 @@ namespace Mono.Data.Sqlite
             }
           }
         }
-        
+
         if (String.IsNullOrEmpty(dataType))
         {
           TypeAffinity affin;
@@ -798,7 +798,7 @@ namespace Mono.Data.Sqlite
       if (_keyInfo != null)
         _keyInfo.AppendSchemaTable(tbl);
 #endif
-      
+
       tbl.AcceptChanges();
       tbl.EndLoadData();
 
@@ -816,7 +816,7 @@ namespace Mono.Data.Sqlite
       if (i >= VisibleFieldCount && _keyInfo != null)
         return _keyInfo.GetString(i - VisibleFieldCount);
 #endif
-      
+
       VerifyType(i, DbType.String);
       return _activeStatement._sql.GetText(_activeStatement, i);
     }
@@ -909,7 +909,7 @@ namespace Mono.Data.Sqlite
         {
           // Reset the previously-executed statement
           _activeStatement._sql.Reset(_activeStatement);
-          
+
           // If we're only supposed to return a single rowset, step through all remaining statements once until
           // they are all done and return false to indicate no more resultsets exist.
           if ((_commandBehavior & CommandBehavior.SingleResult) != 0)
@@ -996,7 +996,7 @@ namespace Mono.Data.Sqlite
 
       typ = _fieldTypeArray[i];
 
-      // If not initialized, then fetch the declared column datatype and attempt to convert it 
+      // If not initialized, then fetch the declared column datatype and attempt to convert it
       // to a known DbType.
       if (typ.Affinity == TypeAffinity.Uninitialized)
         typ.Type = SqliteConvert.TypeNameToDbType(_activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity));
@@ -1027,7 +1027,7 @@ namespace Mono.Data.Sqlite
           if (_keyInfo != null)
             _keyInfo.Reset();
 #endif
-	  
+	
           return true;
         }
 
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteEnlistment.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteEnlistment.cs
index 864eaa1..e2caed7 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteEnlistment.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteEnlistment.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /*******************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteException.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteException.cs
index 5f51ae3..820dcce 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteException.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteException.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFactory.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFactory.cs
index 7fe6f8e..a9a5bce 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFactory.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFactory.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunction.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunction.cs
index 5f3a5a6..7f0a38b 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunction.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunction.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -99,11 +99,11 @@ namespace Mono.Data.Sqlite
   /// Although there is one instance of a class derived from SqliteFunction per database connection, the derived class has no access
   /// to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database
   /// calls during processing.
-  /// 
+  ///
   /// It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class
   /// services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement
   /// information in member variables of user-defined function classes.
-  /// 
+  ///
   /// For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will
   /// be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.
   /// </remarks>
@@ -374,7 +374,7 @@ namespace Mono.Data.Sqlite
       if (n > 1) obj = _contextDataList[nAux];
 
       Step(ConvertParams(nArgs, argsptr), n, ref obj);
-      _contextDataList[nAux] = obj;      
+      _contextDataList[nAux] = obj;
     }
 
     /// <summary>
@@ -464,7 +464,7 @@ namespace Mono.Data.Sqlite
               break;
             }
           }
-          
+
           if (found == false)
             continue;
 
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunctionAttribute.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunctionAttribute.cs
index a455b93..bd774b6 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunctionAttribute.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteFunctionAttribute.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteMetaDataCollectionNames.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteMetaDataCollectionNames.cs
index fab3e1a..abebe04 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteMetaDataCollectionNames.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteMetaDataCollectionNames.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameter.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameter.cs
index d85d574..4dba90f 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameter.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameter.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -81,7 +81,7 @@ namespace Mono.Data.Sqlite
     /// <summary>
     /// Default constructor
     /// </summary>
-    public SqliteParameter() 
+    public SqliteParameter()
       : this(null, (DbType)(-1), 0, null, DataRowVersion.Current)
     {
     }
@@ -211,7 +211,7 @@ namespace Mono.Data.Sqlite
     /// <param name="parameterSize">The size of the parameter</param>
     /// <param name="sourceColumn">The source column</param>
     /// <param name="rowVersion">The row version information</param>
-    public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)      
+    public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)
     {
       _parameterName = parameterName;
       _dbType = (int)parameterType;
@@ -241,7 +241,7 @@ namespace Mono.Data.Sqlite
     /// <param name="scale">Ignored</param>
     /// <param name="sourceColumn">The source column</param>
     /// <param name="rowVersion">The row version information</param>
-    /// <param name="value">The initial value to assign the parameter</param>   
+    /// <param name="value">The initial value to assign the parameter</param>
 #if !PLATFORM_COMPACTFRAMEWORK
     [EditorBrowsable(EditorBrowsableState.Advanced)]
 #endif
@@ -319,7 +319,7 @@ namespace Mono.Data.Sqlite
       {
         return _nullable;
       }
-      set 
+      set
       {
         _nullable = value;
       }
@@ -461,7 +461,7 @@ namespace Mono.Data.Sqlite
       set
       {
         _objValue = value;
-        if (_dbType == -1 && _objValue != null && _objValue != DBNull.Value) // If the DbType has never been assigned, try to glean one from the value's datatype 
+        if (_dbType == -1 && _objValue != null && _objValue != DBNull.Value) // If the DbType has never been assigned, try to glean one from the value's datatype
           _dbType = (int)SqliteConvert.TypeToDbType(_objValue.GetType());
       }
     }
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameterCollection.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameterCollection.cs
index 2267c27..c0f8b0a 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameterCollection.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteParameterCollection.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteStatement.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteStatement.cs
index 2ff1a20..d12f72c 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteStatement.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteStatement.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -132,7 +132,7 @@ namespace Mono.Data.Sqlite
     internal bool MapParameter(string s, SqliteParameter p)
     {
       if (_paramNames == null) return false;
-      
+
       int startAt = 0;
       if (s.Length > 0)
       {
@@ -159,7 +159,7 @@ namespace Mono.Data.Sqlite
     public void Dispose()
     {
       _sql.FinalizeStatement(this);
-      
+
       _paramNames = null;
       _paramValues = null;
       _sql = null;
@@ -168,7 +168,7 @@ namespace Mono.Data.Sqlite
       GC.SuppressFinalize(this);
     }
     #endregion
-    
+
     /// <summary>
     ///  Bind all parameters, making sure the caller didn't miss any
     /// </summary>
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteTransaction.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteTransaction.cs
index dc79c86..9678f0a 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteTransaction.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SQLiteTransaction.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SR.Designer.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SR.Designer.cs
index a78fcd2..944c047 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SR.Designer.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SR.Designer.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -43,8 +43,8 @@
 #if NET_2_0
 namespace Mono.Data.Sqlite {
     using System;
-    
-    
+
+
     /// <summary>
     ///   A strongly-typed resource class, for looking up localized strings, etc.
     /// </summary>
@@ -55,15 +55,15 @@ namespace Mono.Data.Sqlite {
     [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     internal class SR {
-        
+
         private static global::System.Resources.ResourceManager resourceMan;
-        
+
         private static global::System.Globalization.CultureInfo resourceCulture;
-        
+
         [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         internal SR() {
         }
-        
+
         /// <summary>
         ///   Returns the cached ResourceManager instance used by this class.
         /// </summary>
@@ -77,7 +77,7 @@ namespace Mono.Data.Sqlite {
                 return resourceMan;
             }
         }
-        
+
         /// <summary>
         ///   Overrides the current thread's CurrentUICulture property for all
         ///   resource lookups using this strongly typed resource class.
@@ -91,7 +91,7 @@ namespace Mono.Data.Sqlite {
                 resourceCulture = value;
             }
         }
-        
+
         /// <summary>
         ///   Looks up a localized string similar to <?xml version="1.0" standalone="yes"?>
         ///<DocumentElement>
@@ -113,7 +113,7 @@ namespace Mono.Data.Sqlite {
                 return ResourceManager.GetString("DataTypes", resourceCulture);
             }
         }
-        
+
         /// <summary>
         ///   Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.
         /// </summary>
@@ -122,7 +122,7 @@ namespace Mono.Data.Sqlite {
                 return ResourceManager.GetString("Keywords", resourceCulture);
             }
         }
-        
+
         /// <summary>
         ///   Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?>
         ///<DocumentElement>
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SqliteDataSourceEnumerator.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SqliteDataSourceEnumerator.cs
index 050e2e4..2ac1c8a 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SqliteDataSourceEnumerator.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/SqliteDataSourceEnumerator.cs
@@ -16,10 +16,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 using System;
 using System.Data;
 using System.Data.Common;
-        
+
 namespace Mono.Data.Sqlite
 {
         public class SqliteDataSourceEnumerator : DbDataSourceEnumerator
@@ -72,7 +72,7 @@ namespace Mono.Data.Sqlite
 			dt.Rows.Add (dr);
 			
 			return dt;
-                }                
+                }
         }
 }
 
diff --git a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/UnsafeNativeMethods.cs b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/UnsafeNativeMethods.cs
index 6ad9d91..b68a7b9 100644
--- a/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/UnsafeNativeMethods.cs
+++ b/src/Libraries/Mono.Data.Sqlite/Mono.Data.Sqlite/UnsafeNativeMethods.cs
@@ -18,10 +18,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -34,7 +34,7 @@
 /********************************************************
  * ADO.NET 2.0 Data Provider for Sqlite Version 3.X
  * Written by Robert Simpson (robert at blackcastlesoft.com)
- * 
+ *
  * Released to the public domain, use at your own risk!
  ********************************************************/
 #if NET_2_0
@@ -90,7 +90,7 @@ namespace Mono.Data.Sqlite
 
     [DllImport(SQLITE_DLL)]
     internal static extern int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);
-	  
+	
     [DllImport(SQLITE_DLL)]
     internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);
 
@@ -303,7 +303,7 @@ namespace Mono.Data.Sqlite
 
     [DllImport(SQLITE_DLL)]
     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);
-    
+
     [DllImport(SQLITE_DLL)]
     internal static extern long sqlite3_last_insert_rowid(IntPtr db);
   }
diff --git a/src/Libraries/Mono.Media/Makefile.in b/src/Libraries/Mono.Media/Makefile.in
index 2d65ac8..cd9eff8 100644
--- a/src/Libraries/Mono.Media/Makefile.in
+++ b/src/Libraries/Mono.Media/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -375,6 +384,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -478,11 +488,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -500,6 +511,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -529,6 +541,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -548,14 +561,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Mono.Media/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Mono.Media/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Mono.Media/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Mono.Media/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -573,25 +586,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -621,13 +650,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -659,6 +692,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -679,6 +713,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -687,18 +723,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -759,7 +805,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -776,6 +822,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs
index a397b1c..2183342 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 
 namespace Media.Playlists.Xspf
@@ -33,20 +33,20 @@ namespace Media.Playlists.Xspf
     public struct LinkEntry
     {
         public static readonly LinkEntry Zero;
-        
+
         private Uri rel;
         private Uri value;
-        
+
         public LinkEntry(Uri rel, Uri value)
         {
             this.rel = rel;
             this.value = value;
         }
-        
+
         public Uri Rel {
             get { return rel; }
         }
-        
+
         public Uri Value {
             get { return value; }
         }
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs
index 75defa7..48abcfa 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs
@@ -33,20 +33,20 @@ namespace Media.Playlists.Xspf
     public struct MetaEntry
     {
         public static readonly MetaEntry Zero;
-    
+
         private Uri rel;
         private string value;
-        
+
         public MetaEntry(Uri rel, string value)
         {
             this.rel = rel;
             this.value = value;
         }
-        
+
         public Uri Rel {
             get { return rel; }
         }
-        
+
         public string Value {
             get { return value; }
         }
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs
index ba3eaab..48ff30e 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.IO;
 using System.Xml;
@@ -37,32 +37,32 @@ namespace Media.Playlists.Xspf
     public class Playlist : XspfBaseObject
     {
         // TODO: Add attribution, extension support
-        
+
         private static string XspfNamespace = "http://xspf.org/ns/0/";
-        
+
         private Uri default_base_uri;
         private Uri document_base_uri;
-        
+
         private bool loaded = false;
 
-        private Uri location;  
+        private Uri location;
         private Uri identifier;
         private Uri license;
         private DateTime date;
-        
+
         private List<Track> tracks = new List<Track>();
-        
+
         public Playlist()
         {
         }
-        
+
         private static XmlNamespaceManager BuildNamespaceManager (XmlDocument doc)
         {
             XmlNamespaceManager xmlns = new XmlNamespaceManager (doc.NameTable);
             xmlns.AddNamespace ("xspf", XspfNamespace);
             return xmlns;
         }
-        
+
         private static XmlNode FindPlaylistNode (XmlDocument doc, XmlNamespaceManager xmlns)
         {
             XmlNode playlist_node = doc.SelectSingleNode ("/xspf:playlist", xmlns);
@@ -73,12 +73,12 @@ namespace Media.Playlists.Xspf
             }
             return playlist_node;
         }
-        
+
         private static bool Sniff (XmlDocument doc)
         {
             XmlNamespaceManager xmlns = BuildNamespaceManager (doc);
             XmlNode playlist_node = FindPlaylistNode (doc, xmlns);
-            
+
             if (playlist_node != null) {
                 XmlAttribute version_attr = playlist_node.Attributes["version"];
                 if (!(version_attr == null || version_attr.Value == null)) {
@@ -90,35 +90,35 @@ namespace Media.Playlists.Xspf
             }
             return false;
         }
-        
+
         public static bool Sniff (string path)
         {
             XmlDocument doc = new XmlDocument ();
             doc.Load (path);
             return Sniff (doc);
         }
-        
+
         public static bool Sniff (XmlReader reader)
         {
             XmlDocument doc = new XmlDocument ();
             doc.Load (reader);
             return Sniff (doc);
         }
-        
+
         public static bool Sniff (TextReader reader)
         {
             XmlDocument doc = new XmlDocument ();
             doc.Load (reader);
             return Sniff (doc);
         }
-        
+
         public static bool Sniff (Stream stream)
         {
             XmlDocument doc = new XmlDocument ();
             doc.Load (stream);
             return Sniff (doc);
         }
-        
+
         private void Load(XmlDocument doc)
         {
             XmlNamespaceManager xmlns = BuildNamespaceManager (doc);
@@ -141,18 +141,18 @@ namespace Media.Playlists.Xspf
                     throw new ApplicationException("Invalid XSPF Version '" + version_attr.Value + "'");
                 }
             }
-            
+
             XmlAttribute base_attr = playlist_node.Attributes["xml:base"];
             if(base_attr != null) {
                 document_base_uri = new Uri(base_attr.Value);
             }
-            
+
             LoadBase(playlist_node, xmlns);
-            
+
             location = XmlUtil.ReadUri(playlist_node, xmlns, ResolvedBaseUri, "xspf:location");
             identifier = XmlUtil.ReadUri(playlist_node, xmlns, ResolvedBaseUri, "xspf:identifier");
             license = XmlUtil.ReadUri(playlist_node, xmlns, ResolvedBaseUri, "xspf:license");
-            
+
             date = XmlUtil.ReadDate(playlist_node, xmlns, "xspf:date");
 
             foreach(XmlNode node in playlist_node.SelectNodes("xspf:trackList/xspf:track", xmlns)) {
@@ -160,66 +160,66 @@ namespace Media.Playlists.Xspf
                 track.Load(this, node, xmlns);
                 AddTrack(track);
             }
-            
+
             loaded = true;
         }
-        
+
         public void Load(string path)
         {
             XmlDocument doc = new XmlDocument();
             doc.Load(path);
             Load(doc);
         }
-        
+
         public void Load(XmlReader reader)
         {
             XmlDocument doc = new XmlDocument();
             doc.Load(reader);
             Load(doc);
         }
-        
+
         public void Load(TextReader reader)
         {
             XmlDocument doc = new XmlDocument();
             doc.Load(reader);
             Load(doc);
         }
-        
+
         public void Load(Stream stream)
         {
             XmlDocument doc = new XmlDocument();
             doc.Load(stream);
             Load(doc);
         }
-        
+
         public void Save(string path)
         {
             Save(new XmlTextWriter(path, System.Text.Encoding.UTF8));
         }
-        
+
         public void Save(Stream stream)
         {
             Save(new XmlTextWriter(stream, System.Text.Encoding.UTF8));
         }
-        
+
         public void Save(XmlTextWriter writer)
         {
             // FIXME: This is very very limited write support
-            
+
             writer.Indentation = 2;
             writer.IndentChar = ' ';
             writer.Formatting = System.Xml.Formatting.Indented;
-            
+
             writer.WriteStartDocument();
             writer.WriteStartElement("playlist", XspfNamespace);
             writer.WriteAttributeString("version", "1");
-            
+
             SaveBase(writer);
-            
+
             if (Date.Ticks > 0) {
                 writer.WriteElementString ("date", Date.ToUniversalTime ().ToString ("o"));
             }
-            
+
             writer.WriteStartElement("trackList");
             foreach(Track track in tracks) {
                 writer.WriteStartElement("track");
@@ -227,28 +227,28 @@ namespace Media.Playlists.Xspf
                 writer.WriteEndElement();
             }
             writer.WriteEndElement();
-            
+
             writer.WriteEndElement();
             writer.WriteEndDocument();
-            
+
             writer.Flush();
             writer.Close();
         }
-        
+
         public void AddTrack(Track track)
         {
             track.Parent = this;
             tracks.Add(track);
         }
-        
+
         public void RemoveTrack(Track track)
         {
             track.Parent = null;
             tracks.Remove(track);
         }
-        
+
         public Uri DefaultBaseUri {
-            get { 
+            get {
                 if(default_base_uri == null) {
                     string path = Path.GetFullPath(Environment.CurrentDirectory);
                     if(path == null) {
@@ -259,32 +259,32 @@ namespace Media.Playlists.Xspf
                         default_base_uri = Location;
                     }
                 }
-                
+
                 return default_base_uri;
             }
-            
-            set { 
+
+            set {
                 if(loaded) {
                     throw new ApplicationException("Setting DefaultBaseUri must be done before Load()");
                 }
-                
-                default_base_uri = value; 
+
+                default_base_uri = value;
             }
         }
-        
+
         public Uri DocumentBaseUri {
             get { return document_base_uri; }
         }
-        
+
         public override Uri ResolvedBaseUri {
             get { return DocumentBaseUri == null ? DefaultBaseUri : DocumentBaseUri; }
         }
-        
+
         public Uri Location {
             get { return location; }
             set { location = value; }
         }
-        
+
         public Uri Identifier {
             get { return identifier; }
             set { identifier = value; }
@@ -294,16 +294,16 @@ namespace Media.Playlists.Xspf
             get { return license; }
             set { license = value; }
         }
-        
+
         public DateTime Date {
             get { return date; }
             set { date = value; }
         }
-        
+
         public ReadOnlyCollection<Track> Tracks {
             get { return new ReadOnlyCollection<Track>(tracks); }
         }
-        
+
         public int TrackCount {
             get { return tracks.Count; }
         }
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Tests/XspfTests.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Tests/XspfTests.cs
index 074dad3..2249a0f 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Tests/XspfTests.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Tests/XspfTests.cs
@@ -112,7 +112,7 @@ namespace Media.Playlists.Xspf.Tests
 
             Assert.AreEqual(uri, track.Info);
             Assert.AreEqual(uri, track.Image);
-            
+
             Assert.AreEqual(11, track.TrackNumber);
             Assert.AreEqual(TimeSpan.FromMilliseconds(5159), track.Duration);
 
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs
index 2c37b6d..1c06625 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Xml;
 using System.Collections.Generic;
@@ -36,25 +36,25 @@ namespace Media.Playlists.Xspf
     public class Track : XspfBaseObject
     {
         // TODO: Add attribution, extension support
-        
+
         private Uri base_uri;
-    
+
         private string album;
-        
+
         private uint track_num;
         private TimeSpan duration;
-    
+
         private List<Uri> locations = new List<Uri>();
         private List<Uri> identifiers = new List<Uri>();
-        
+
         private Playlist parent;
-        
-        private XmlNode ctor_node;
-        
+
+        private XmlNode extension_node;
+
         public Track()
         {
         }
-        
+
         internal void Load(Playlist playlist, XmlNode node, XmlNamespaceManager xmlns)
         {
             XmlAttribute base_attr = node.Attributes["xml:base"];
@@ -67,142 +67,146 @@ namespace Media.Playlists.Xspf
             } else {
                 base_uri = playlist.ResolvedBaseUri;
             }
-            
+
             LoadBase(node, xmlns);
-            
-            ctor_node = node;
-            
+
+            extension_node = node.SelectSingleNode ("xspf:extension", xmlns);
+
             album = XmlUtil.ReadString(node, xmlns, "xspf:album");
 
             track_num = XmlUtil.ReadUInt(node, xmlns, "xspf:trackNum");
             duration = TimeSpan.FromMilliseconds(XmlUtil.ReadUInt(node, xmlns, "xspf:duration"));
-            
+
             locations = XmlUtil.ReadUris(node, xmlns, ResolvedBaseUri, "xspf:location");
             identifiers = XmlUtil.ReadUris(node, xmlns, ResolvedBaseUri, "xspf:identifier");
         }
-        
+
         public void Save(XmlWriter writer)
         {
             SaveBase(writer);
-            
+
             if(album != null) {
                 writer.WriteElementString("album", album);
             }
-            
+
             // Only write valid (ie non-0) track numbers
             if (TrackNumber > 0) {
                 writer.WriteElementString ("trackNum", TrackNumber.ToString ());
             }
-            
+
             foreach(Uri uri in locations) {
                 string escaped = uri.IsAbsoluteUri? uri.AbsoluteUri : Uri.EscapeUriString (uri.ToString ());
                 writer.WriteElementString ("location", escaped);
             }
         }
-        
-        // XXX: Better solution could probably be achieved?
+
+        // TODO: Better solution could probably be achieved?
         public string GetExtendedValue (string key)
         {
-            foreach (XmlNode n in ctor_node) {
-                if (n.LocalName == key) {                    
+            if (extension_node == null) {
+                return null;
+            }
+            
+            foreach (XmlNode n in extension_node) {
+                if (n.LocalName == key) {
                     return n.InnerText;
                 }
             }
-            
+
             return null;
         }
-        
+
         public Uri GetLocationAt(int position)
         {
             return locations[position];
         }
-        
+
         public void InsertLocation(int position, Uri uri)
         {
             locations.Insert(position, uri);
         }
-        
+
         public void ReplaceLocation(int position, Uri uri)
         {
             locations.RemoveAt(position);
             locations.Insert(position, uri);
         }
-        
+
         public void AddLocation(Uri uri)
         {
             locations.Add(uri);
         }
-        
+
         public void RemoveLocation(Uri uri)
         {
             locations.Remove(uri);
         }
-        
+
         public void ClearLocations()
         {
             locations.Clear();
         }
-        
+
         public Uri GetIdentifierAt(int position)
         {
             return identifiers[position];
         }
-        
+
         public void InsertIdentifier(int position, Uri uri)
         {
             identifiers.Insert(position, uri);
         }
-        
+
         public void AddIdentifier(Uri uri)
         {
             identifiers.Add(uri);
         }
-        
+
         public void RemoveIdentifier(Uri uri)
         {
             identifiers.Remove(uri);
         }
-        
+
         public void ClearIdentifiers()
         {
             identifiers.Clear();
         }
-        
+
         public override Uri ResolvedBaseUri {
             get { return base_uri; }
         }
-        
+
         public string Album {
             get { return album; }
             set { album = value; }
         }
-        
+
         public uint TrackNumber {
             get { return track_num; }
             set { track_num = value; }
         }
-        
+
         public TimeSpan Duration {
             get { return duration; }
             set { duration = value; }
         }
-                
+
         public ReadOnlyCollection<Uri> Locations {
             get { return new ReadOnlyCollection<Uri>(locations); }
         }
-        
+
         public ReadOnlyCollection<Uri> Identifiers {
             get { return new ReadOnlyCollection<Uri>(identifiers); }
         }
-        
+
         public int LocationCount {
             get { return locations.Count; }
         }
-        
+
         public int IdentifierCount {
             get { return identifiers.Count; }
         }
-        
+
         public Playlist Parent {
             internal set { parent = value; }
             get { return parent; }
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs
index a76c2c2..be7b2d4 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs
@@ -35,9 +35,9 @@ namespace Media.Playlists.Xspf
     {
         public static readonly W3CDateTime MaxValue = new W3CDateTime(DateTime.MaxValue, TimeSpan.Zero);
         public static readonly W3CDateTime MinValue = new W3CDateTime(DateTime.MinValue, TimeSpan.Zero);
-        
+
         public static TimeSpan LocalUtcOffset {
-            get { 
+            get {
                 DateTime now = DateTime.Now;
                 return now - now.ToUniversalTime();
             }
@@ -46,7 +46,7 @@ namespace Media.Playlists.Xspf
         public static W3CDateTime Now {
             get { return new W3CDateTime(DateTime.Now); }
         }
-        
+
         public static W3CDateTime UtcNow {
             get { return new W3CDateTime(DateTime.UtcNow); }
         }
@@ -54,36 +54,36 @@ namespace Media.Playlists.Xspf
         public static W3CDateTime Today {
             get { return new W3CDateTime(DateTime.Today); }
         }
-        
+
         private DateTime datetime;
         private TimeSpan offset;
-        
+
         public W3CDateTime(DateTime datetime, TimeSpan offset)
         {
             this.datetime = datetime;
             this.offset = offset;
         }
-        
+
         public W3CDateTime(DateTime datetime) : this(datetime, LocalUtcOffset)
         {
         }
-        
+
         public DateTime DateTime {
             get { return datetime; }
         }
-        
+
         public DateTime LocalTime {
             get { return UtcTime + LocalUtcOffset; }
         }
-        
+
         public TimeSpan UtcOffset {
             get { return offset; }
         }
-        
+
         public DateTime UtcTime {
             get { return datetime - offset; }
         }
-        
+
         public W3CDateTime Add(TimeSpan value)
         {
             return new W3CDateTime(datetime + value, offset);
@@ -134,7 +134,7 @@ namespace Media.Playlists.Xspf
             if(o == null || !(o is W3CDateTime)) {
                 return false;
             }
-            
+
             return DateTime.Equals(UtcTime, ((W3CDateTime)o).UtcTime);
         }
 
@@ -172,7 +172,7 @@ namespace Media.Playlists.Xspf
         {
             return new W3CDateTime(UtcTime, TimeSpan.Zero);
         }
-    
+
         public string ToString(string format)
         {
             switch(format) {
@@ -197,33 +197,33 @@ namespace Media.Playlists.Xspf
 
         public static W3CDateTime Parse(string s)
         {
-            const string Rfc822DateFormat = 
+            const string Rfc822DateFormat =
                 @"^((Mon|Tue|Wed|Thu|Fri|Sat|Sun), *)?(?<day>\d\d?) +" +
                 @"(?<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +" +
                 @"(?<year>\d\d(\d\d)?) +" +
                 @"(?<hour>\d\d):(?<min>\d\d)(:(?<sec>\d\d))? +" +
                 @"(?<ofs>([+\-]?\d\d\d\d)|UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT)$";
-        
+
             const string W3CDateFormat =
                 @"^(?<year>\d\d\d\d)" +
-                @"(-(?<month>\d\d)(-(?<day>\d\d)(T(?<hour>\d\d):" + 
+                @"(-(?<month>\d\d)(-(?<day>\d\d)(T(?<hour>\d\d):" +
                 @"(?<min>\d\d)(:(?<sec>\d\d)(?<ms>\.\d+)?)?" +
-                @"(?<ofs>(Z|[+\-]\d\d:\d\d)))?)?)?$"; 
+                @"(?<ofs>(Z|[+\-]\d\d:\d\d))?)?)?)?$";
 
             string combined_format = String.Format(
                 @"(?<rfc822>{0})|(?<w3c>{1})", Rfc822DateFormat, W3CDateFormat);
 
             Regex reDate = new Regex(combined_format);
             Match m = reDate.Match(s);
-            
+
             if(!m.Success) {
                 throw new FormatException("Input is not a valid W3C or RFC822 date");
-            } 
-            
+            }
+
             try {
                 bool isRfc822 = m.Groups["rfc822"].Success;
                 int year = Int32.Parse(m.Groups["year"].Value);
-                
+
                 if(year < 1000) {
                     year += 2000 - (year < 50 ? 0 : 1);
                 }
@@ -243,12 +243,12 @@ namespace Media.Playlists.Xspf
 
                 TimeSpan offset = TimeSpan.Zero;
                 if(m.Groups["ofs"].Success) {
-                    offset = isRfc822 
+                    offset = isRfc822
                         ? ParseRfc822Offset(m.Groups["ofs"].Value)
                         : ParseW3COffset(m.Groups["ofs"].Value);
                 }
-        
-        
+
+
                 return new W3CDateTime(new DateTime(year, month, day, hour, min, sec, ms), offset);
             } catch(Exception e) {
                 throw new FormatException("Input is not a valid W3C or RFC822 date", e);
@@ -256,7 +256,7 @@ namespace Media.Playlists.Xspf
         }
 
         private static readonly string [] MonthNames = new string [] {
-            "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
+            "Jan", "Feb", "Mar", "Apr", "May", "Jun",
             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
         };
 
@@ -267,7 +267,7 @@ namespace Media.Playlists.Xspf
                     return i + 1;
                 }
             }
-        
+
             throw new ApplicationException("Invalid month name: " + monthName);
         }
 
@@ -276,16 +276,16 @@ namespace Media.Playlists.Xspf
             if(s == string.Empty) {
                 return TimeSpan.Zero;
             }
-            
+
             int hours = 0;
-            
+
             switch(s) {
                 case "UT":
                 case "GMT": break;
                 case "EDT": hours = -4; break;
-                case "EST": 
+                case "EST":
                 case "CDT": hours = -5; break;
-                case "CST": 
+                case "CST":
                 case "MDT": hours = -6; break;
                 case "MST":
                 case "PDT": hours = -7; break;
@@ -296,9 +296,9 @@ namespace Media.Playlists.Xspf
                         return TimeSpan.Parse(sfmt);
                     } else {
                         return TimeSpan.Parse(s.Insert(s.Length - 2, ":"));
-                    } 
+                    }
             }
-            
+
             return TimeSpan.FromHours(hours);
         }
 
@@ -312,15 +312,15 @@ namespace Media.Playlists.Xspf
                 return TimeSpan.Parse(s);
             }
         }
-        
+
         private static string FormatOffset(TimeSpan offset, string separator)
         {
             string s = String.Empty;
-            
+
             if(offset >= TimeSpan.Zero) {
                 s = "+";
             }
-            
+
             return s + offset.Hours.ToString("00") + separator + offset.Minutes.ToString("00");
         }
 
@@ -363,12 +363,12 @@ namespace Media.Playlists.Xspf
         {
             return datetime.Add(timespan);
         }
-        
+
         public static W3CDateTime operator -(W3CDateTime datetime, TimeSpan timespan)
         {
             return datetime.Subtract(timespan);
         }
-        
+
         public int CompareTo(object o)
         {
             if(o == null) {
@@ -376,7 +376,7 @@ namespace Media.Playlists.Xspf
             } else if(o is W3CDateTime) {
                 return Compare(this, (W3CDateTime)o);
             }
-            
+
             throw new ArgumentException("Must be a W3CDateTime");
         }
     }
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs
index 7f378a1..eea20f3 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Xml;
 using System.Collections.Generic;
@@ -37,113 +37,113 @@ namespace Media.Playlists.Xspf
         internal static string ReadString(XmlNode parentNode, XmlNamespaceManager xmlns, string xpath)
         {
             XmlNode node = parentNode.SelectSingleNode(xpath, xmlns);
-            
+
             if(node == null) {
                 return null;
             }
-            
+
             return node.InnerText == null ? null : node.InnerText.Trim();
         }
-        
+
         internal static Uri ReadUri(XmlNode node, XmlNamespaceManager xmlns, Uri baseUri, string xpath)
         {
             string str = ReadString(node, xmlns, xpath);
             if(str == null) {
                 return null;
             }
-            
+
             return ResolveUri(baseUri, str);
         }
-        
+
         internal static DateTime ReadDate(XmlNode node, XmlNamespaceManager xmlns, string xpath)
         {
             string str = ReadString(node, xmlns, xpath);
             if(str == null) {
                 return DateTime.MinValue;
             }
-            
+
             W3CDateTime datetime = W3CDateTime.Parse(str);
             return datetime.LocalTime;
-        }       
-        
+        }
+
         internal static uint ReadUInt(XmlNode node, XmlNamespaceManager xmlns, string xpath)
         {
             string str = ReadString(node, xmlns, xpath);
             if(str == null) {
                 return 0;
             }
-            
+
             return UInt32.Parse(str);
         }
-        
+
         internal static string ReadRelPair(XmlNode node, Uri baseUri, out Uri rel)
         {
             XmlAttribute attr = node.Attributes["rel"];
             string rel_value = attr == null || attr.Value == null ? null : attr.Value.Trim();
             string value = node.InnerText == null ? null : node.InnerText.Trim();
-            
+
             if(rel_value == null || value == null) {
                 rel = null;
                 return null;
             }
-            
+
             rel = ResolveUri(baseUri, rel_value);
             return value;
         }
-        
-        internal static List<MetaEntry> ReadMeta(XmlNode parentNode, XmlNamespaceManager xmlns, 
+
+        internal static List<MetaEntry> ReadMeta(XmlNode parentNode, XmlNamespaceManager xmlns,
             Uri baseUri, string xpath)
         {
             List<MetaEntry> meta_collection = new List<MetaEntry>();
-            
+
             foreach(XmlNode node in parentNode.SelectNodes(xpath, xmlns)) {
                 Uri rel;
                 string value = ReadRelPair(node, baseUri, out rel);
-                
+
                 if(value == null || rel == null) {
                     continue;
                 }
-                
+
                 meta_collection.Add(new MetaEntry(rel, value));
             }
-            
+
             return meta_collection;
         }
-        
-        internal static List<LinkEntry> ReadLinks(XmlNode parentNode, XmlNamespaceManager xmlns, 
+
+        internal static List<LinkEntry> ReadLinks(XmlNode parentNode, XmlNamespaceManager xmlns,
             Uri baseUri, string xpath)
         {
             List<LinkEntry> link_collection = new List<LinkEntry>();
-            
+
             foreach(XmlNode node in parentNode.SelectNodes(xpath, xmlns)) {
                 Uri rel;
                 string value = ReadRelPair(node, baseUri, out rel);
-                
+
                 if(value == null || rel == null) {
                     continue;
                 }
 
                 link_collection.Add(new LinkEntry(rel, ResolveUri(baseUri, value)));
             }
-            
+
             return link_collection;
         }
-        
-        internal static List<Uri> ReadUris(XmlNode parentNode, XmlNamespaceManager xmlns, 
+
+        internal static List<Uri> ReadUris(XmlNode parentNode, XmlNamespaceManager xmlns,
             Uri baseUri, string xpath)
         {
             List<Uri> uri_collection = new List<Uri>();
-            
+
             foreach(XmlNode node in parentNode.SelectNodes(xpath, xmlns)) {
                 string value = node.InnerText == null ? null : node.InnerText.Trim();
                 if(value != null) {
                     uri_collection.Add(ResolveUri(baseUri, value));
                 }
             }
-            
+
             return uri_collection;
         }
-        
+
         internal static Uri ResolveUri(Uri baseUri, string str)
         {
             try {
diff --git a/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs b/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs
index f6accd5..9dd5519 100644
--- a/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs
+++ b/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs
@@ -25,7 +25,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
- 
+
 using System;
 using System.Xml;
 using System.Collections.Generic;
@@ -37,103 +37,103 @@ namespace Media.Playlists.Xspf
     {
         private string title;
         private string creator;
-        private string annotation;        
-        
+        private string annotation;
+
         private Uri info;
         private Uri image;
-        
+
         private List<LinkEntry> links;
         private List<MetaEntry> meta;
 
         public abstract Uri ResolvedBaseUri {
             get;
         }
-        
+
         protected void LoadBase(XmlNode parentNode, XmlNamespaceManager xmlns)
-        { 
+        {
             title = XmlUtil.ReadString(parentNode, xmlns, "xspf:title");
             creator = XmlUtil.ReadString(parentNode, xmlns, "xspf:creator");
             annotation = XmlUtil.ReadString(parentNode, xmlns, "xspf:annotation");
-            
+
             info = XmlUtil.ReadUri(parentNode, xmlns, ResolvedBaseUri, "xspf:info");
             image = XmlUtil.ReadUri(parentNode, xmlns, ResolvedBaseUri, "xspf:image");
-            
+
             meta = XmlUtil.ReadMeta(parentNode, xmlns, ResolvedBaseUri, "xspf:meta");
             links = XmlUtil.ReadLinks(parentNode, xmlns, ResolvedBaseUri, "xspf:link");
         }
-        
+
         protected void SaveBase(XmlWriter writer)
         {
             if(title != null) {
                 writer.WriteElementString("title", title);
             }
-            
+
             if(creator != null) {
                 writer.WriteElementString("creator", creator);
             }
-            
+
             if(annotation != null) {
                 writer.WriteElementString("annotation", annotation);
             }
-            
+
             if(info != null) {
                 writer.WriteElementString("info", info.AbsoluteUri);
             }
-            
+
             if(image != null) {
                 writer.WriteElementString("image", image.AbsoluteUri);
             }
         }
-        
+
         public MetaEntry FindMetaEntry(string rel)
         {
             return FindMetaEntry(new Uri(ResolvedBaseUri, rel));
         }
-        
+
         public MetaEntry FindMetaEntry(Uri uri)
         {
             if(meta == null) {
                 return MetaEntry.Zero;
             }
-            
+
             foreach(MetaEntry meta_entry in meta) {
                 if(meta_entry.Rel == uri) {
                     return meta_entry;
                 }
             }
-            
+
             return MetaEntry.Zero;
         }
-                
+
         public string Title {
             get { return title; }
             set { title = value; }
         }
-        
+
         public string Creator {
             get { return creator; }
             set { creator = value; }
         }
-        
+
         public string Annotation {
             get { return annotation; }
             set { annotation = value; }
         }
-                
+
         public Uri Info {
             get { return info; }
             set { info = value; }
         }
-        
+
         public Uri Image {
             get { return image; }
             set { image = value; }
         }
-        
+
         public ReadOnlyCollection<MetaEntry> Meta {
             get { return new ReadOnlyCollection<MetaEntry>(meta); }
         }
-        
+
         public ReadOnlyCollection<LinkEntry> Links {
             get { return new ReadOnlyCollection<LinkEntry>(links); }
         }
diff --git a/src/Libraries/Mtp/Makefile.in b/src/Libraries/Mtp/Makefile.in
index 24e7d38..fbbedbe 100644
--- a/src/Libraries/Mtp/Makefile.in
+++ b/src/Libraries/Mtp/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -56,6 +58,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -75,8 +78,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = Mtp.dll.config
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -141,6 +165,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -160,6 +186,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -173,29 +201,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -381,6 +390,7 @@ SOURCES = \
 @ENABLE_MTP_TRUE at LINK_GTK = $(GTKSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_GCONF = $(GCONFSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_GNOME = $(GNOMESHARP_LIBS)
+ at ENABLE_MTP_TRUE@LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 @ENABLE_MTP_TRUE at LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 @ENABLE_MTP_TRUE at LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 @ENABLE_MTP_TRUE at LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -484,11 +494,12 @@ SOURCES = \
 @ENABLE_MTP_TRUE at REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 @ENABLE_MTP_TRUE at REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+ at ENABLE_MTP_TRUE@REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
- at ENABLE_MTP_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+ at ENABLE_MTP_TRUE@REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 @ENABLE_MTP_TRUE at LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 @ENABLE_MTP_TRUE at LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -506,6 +517,7 @@ SOURCES = \
 @ENABLE_MTP_TRUE at REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+ at ENABLE_MTP_TRUE@REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 @ENABLE_MTP_TRUE at REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 @ENABLE_MTP_TRUE at REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 @ENABLE_MTP_TRUE at REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -535,6 +547,7 @@ SOURCES = \
 @ENABLE_MTP_TRUE at ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 @ENABLE_MTP_TRUE at INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_MTP_TRUE@@ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@@ENABLE_MTP_TRUE at ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 @ENABLE_MTP_TRUE at FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 @ENABLE_MTP_TRUE at DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 @ENABLE_MTP_TRUE at OUTPUT_FILES = \
@@ -557,14 +570,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/Mtp/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/Mtp/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/Mtp/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/Mtp/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -582,27 +595,43 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 Mtp.dll.config: $(top_builddir)/config.status $(srcdir)/Mtp.dll.config.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -632,13 +661,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -670,6 +703,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -692,6 +726,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -700,18 +736,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -772,7 +818,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 @ENABLE_MTP_TRUE@		-nowarn:0278 -nowarn:0078 $$warn \
 @ENABLE_MTP_TRUE@		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 @ENABLE_MTP_TRUE@		-debug -target:$(TARGET) -out:$@ \
- at ENABLE_MTP_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+ at ENABLE_MTP_TRUE@		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 @ENABLE_MTP_TRUE@		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 @ENABLE_MTP_TRUE@	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 @ENABLE_MTP_TRUE@		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -789,6 +835,7 @@ uninstall-am: uninstall-local uninstall-moduleSCRIPTS
 
 @ENABLE_MTP_TRUE at uninstall-local: $(THEME_ICONS_SOURCE)
 @ENABLE_MTP_TRUE@	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/Mtp/Mtp/AbstractTrackList.cs b/src/Libraries/Mtp/Mtp/AbstractTrackList.cs
index fba1831..984bf4c 100644
--- a/src/Libraries/Mtp/Mtp/AbstractTrackList.cs
+++ b/src/Libraries/Mtp/Mtp/AbstractTrackList.cs
@@ -59,7 +59,7 @@ namespace Mtp
         {
             RemoveTrack ((int)track.FileId);
         }
-        
+
         public void RemoveTrack (int track_id)
         {
             track_ids.Remove (track_id);
diff --git a/src/Libraries/Mtp/Mtp/Album.cs b/src/Libraries/Mtp/Mtp/Album.cs
index e0d00e6..db74437 100644
--- a/src/Libraries/Mtp/Mtp/Album.cs
+++ b/src/Libraries/Mtp/Mtp/Album.cs
@@ -6,24 +6,24 @@
  *  Gabriel Burt (gburt at novell.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -108,7 +108,7 @@ namespace Mtp
                 if (cover_art == null) {
                     return;
                 }
-                
+
                 FileSampleData cover = new FileSampleData ();
                 cover.data = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (byte)) * cover_art.Length);
                 Marshal.Copy (cover_art, 0, cover.data, cover_art.Length);
@@ -137,7 +137,7 @@ namespace Mtp
         {
             return LIBMTP_Update_Album (Device.Handle, ref album);
         }
-        
+
         public void Remove ()
         {
 			MtpDevice.LIBMTP_Delete_Object(Device.Handle, AlbumId);
diff --git a/src/Libraries/Mtp/Mtp/Error.cs b/src/Libraries/Mtp/Mtp/Error.cs
index 0f7199b..ed79bd8 100644
--- a/src/Libraries/Mtp/Mtp/Error.cs
+++ b/src/Libraries/Mtp/Mtp/Error.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Mtp/Mtp/ErrorCode.cs b/src/Libraries/Mtp/Mtp/ErrorCode.cs
index 5bf108b..59a1732 100644
--- a/src/Libraries/Mtp/Mtp/ErrorCode.cs
+++ b/src/Libraries/Mtp/Mtp/ErrorCode.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Mtp/Mtp/FileSampleData.cs b/src/Libraries/Mtp/Mtp/FileSampleData.cs
index 3c7422d..fcab905 100644
--- a/src/Libraries/Mtp/Mtp/FileSampleData.cs
+++ b/src/Libraries/Mtp/Mtp/FileSampleData.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Mtp/Mtp/FileType.cs b/src/Libraries/Mtp/Mtp/FileType.cs
index 85308a5..02b5f00 100644
--- a/src/Libraries/Mtp/Mtp/FileType.cs
+++ b/src/Libraries/Mtp/Mtp/FileType.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Mtp/Mtp/Folder.cs b/src/Libraries/Mtp/Mtp/Folder.cs
index 792eb7c..b0d8a12 100644
--- a/src/Libraries/Mtp/Mtp/Folder.cs
+++ b/src/Libraries/Mtp/Mtp/Folder.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -73,7 +73,7 @@ namespace Mtp
 		{
 			if (string.IsNullOrEmpty(name))
 			    throw new ArgumentNullException("name");
-			    
+			
 			// First create the folder on the device and check for error
 			uint id = CreateFolder (device.Handle, name, FolderId);
 			
@@ -233,7 +233,7 @@ namespace Mtp
 		/*
 		public object NextSibling
 		{
-			get 
+			get
 			{
 				if(sibling == IntPtr.Zero)
 					return null;
@@ -243,7 +243,7 @@ namespace Mtp
 		
 		public object NextChild
 		{
-			get 
+			get
 			{
 				if(child == IntPtr.Zero)
 					return null;
diff --git a/src/Libraries/Mtp/Mtp/MtpDevice.cs b/src/Libraries/Mtp/Mtp/MtpDevice.cs
index bca0817..22b79ef 100644
--- a/src/Libraries/Mtp/Mtp/MtpDevice.cs
+++ b/src/Libraries/Mtp/Mtp/MtpDevice.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
@@ -449,7 +449,7 @@ namespace Mtp
 		// void LIBMTP_Release_Device_List (LIBMTP_mtpdevice_t *)
 				
 
-		// int LIBMTP_Detect_Descriptor (uint16_t *, uint16_t *); 
+		// int LIBMTP_Detect_Descriptor (uint16_t *, uint16_t *);
 		/*
 				void 	LIBMTP_Dump_Device_Info (LIBMTP_mtpdevice_t *)
 				
diff --git a/src/Libraries/Mtp/Mtp/Playlist.cs b/src/Libraries/Mtp/Mtp/Playlist.cs
index ff43c38..0a91f68 100644
--- a/src/Libraries/Mtp/Mtp/Playlist.cs
+++ b/src/Libraries/Mtp/Mtp/Playlist.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/Mtp/Mtp/Track.cs b/src/Libraries/Mtp/Mtp/Track.cs
index 2213df9..451ad3e 100644
--- a/src/Libraries/Mtp/Mtp/Track.cs
+++ b/src/Libraries/Mtp/Mtp/Track.cs
@@ -6,24 +6,24 @@
  *  Alan McGovern (alan.mcgovern at gmail.com)
  ****************************************************************************/
 
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
+/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW:
  *
  *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),  
- *  to deal in the Software without restriction, including without limitation  
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
- *  and/or sell copies of the Software, and to permit persons to whom the  
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
  *  Software is furnished to do so, subject to the following conditions:
  *
- *  The above copyright notice and this permission notice shall be included in 
+ *  The above copyright notice and this permission notice shall be included in
  *  all copies or substantial portions of the Software.
  *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  *  DEALINGS IN THE SOFTWARE.
  */
 
diff --git a/src/Libraries/MusicBrainz/Makefile.in b/src/Libraries/MusicBrainz/Makefile.in
index 4689460..d8697ce 100644
--- a/src/Libraries/MusicBrainz/Makefile.in
+++ b/src/Libraries/MusicBrainz/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -16,8 +17,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -54,6 +56,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -73,8 +76,29 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 am__installdirs = "$(DESTDIR)$(moduledir)"
-moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(module_SCRIPTS)
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -139,6 +163,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -158,6 +184,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -171,29 +199,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -385,6 +394,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -488,11 +498,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -510,6 +521,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -539,6 +551,7 @@ ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET)))
 ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION)
 INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR)))
 @ENABLE_TESTS_TRUE at ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS"
+ at ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK"
 FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE))
 DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/')
 OUTPUT_FILES = \
@@ -558,14 +571,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Libraries/MusicBrainz/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Libraries/MusicBrainz/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Libraries/MusicBrainz/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Libraries/MusicBrainz/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -583,25 +596,41 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 install-moduleSCRIPTS: $(module_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)"
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \
-	    $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-moduleSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(module_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(moduledir)/$$f"; \
-	done
+	@list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(moduledir)" && rm -f $$files
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -631,13 +660,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -669,6 +702,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -689,6 +723,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -697,18 +733,28 @@ install-data-am: install-data-local install-moduleSCRIPTS
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -769,7 +815,7 @@ $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK)
 		-nowarn:0278 -nowarn:0078 $$warn \
 		-define:HAVE_GTK_2_10 -define:NET_2_0 \
 		-debug -target:$(TARGET) -out:$@ \
-		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) \
+		$(BUILD_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \
 		$(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD)
 	@if [ -e $(srcdir)/$(notdir $@.config) ]; then \
 		cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \
@@ -786,6 +832,7 @@ install-data-local: $(THEME_ICONS_SOURCE)
 
 uninstall-local: $(THEME_ICONS_SOURCE)
 	@$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Artist.cs b/src/Libraries/MusicBrainz/MusicBrainz/Artist.cs
index d823497..ecb4479 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Artist.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Artist.cs
@@ -30,17 +30,17 @@ namespace MusicBrainz
 {
     public sealed class Artist : MusicBrainzEntity
     {
-        
+
         #region Private
-        
+
         const string EXTENSION = "artist";
         ArtistReleaseType artist_release_type = DefaultArtistReleaseType;
         ArtistType? type;
         ReadOnlyCollection<Release> releases;
         bool have_all_releases;
-        
+
         #endregion
-        
+
         #region Constructors
 
         Artist (string id) : base (id, null)
@@ -57,11 +57,11 @@ namespace MusicBrainz
         internal Artist (XmlReader reader) : base (reader, false)
         {
         }
-        
+
         #endregion
-        
+
         #region Protected
-        
+
         internal override string UrlExtension {
             get { return EXTENSION; }
         }
@@ -107,11 +107,11 @@ namespace MusicBrainz
                 break;
             }
         }
-        
+
         #endregion
 
         #region Public
-        
+
         static ArtistReleaseType default_artist_release_type = new ArtistReleaseType (ReleaseStatus.Official, ReleaseArtistType.SingleArtist);
         public static ArtistReleaseType DefaultArtistReleaseType {
             get { return default_artist_release_type; }
@@ -120,7 +120,7 @@ namespace MusicBrainz
                 default_artist_release_type = value;
             }
         }
-        
+
         public ArtistReleaseType ArtistReleaseType {
             get { return artist_release_type; }
             set {
@@ -149,7 +149,7 @@ namespace MusicBrainz
         {
             return GetPropertyOrDefault (ref type, ArtistType.Unknown);
         }
-        
+
         public ReadOnlyCollection<Release> GetReleases ()
         {
             return releases ?? (have_all_releases
@@ -163,7 +163,7 @@ namespace MusicBrainz
         }
 
         #endregion
-        
+
         #region Static
 
         public static Artist Get (string id)
@@ -188,26 +188,26 @@ namespace MusicBrainz
         {
             return artist.ToString ();
         }
-        
+
         #endregion
-        
+
     }
-    
+
     #region Ancillary Types
-    
+
     public enum ArtistType
     {
         Unknown,
         Group,
         Person
     }
-    
+
     public enum ReleaseArtistType
     {
         VariousArtists,
         SingleArtist
     }
-    
+
     public sealed class ArtistReleaseType
     {
         string str;
@@ -219,7 +219,7 @@ namespace MusicBrainz
         public ArtistReleaseType (ReleaseStatus status, ReleaseArtistType artistType) : this ((Enum)status, artistType)
         {
         }
-        
+
         public ArtistReleaseType (ReleaseType type, ReleaseStatus status, ReleaseArtistType artistType)
         {
             StringBuilder builder = new StringBuilder ();
@@ -235,7 +235,7 @@ namespace MusicBrainz
             Format (builder, enumeration, artistType);
             str = builder.ToString ();
         }
-        
+
         static void Format (StringBuilder builder, Enum enumeration, ReleaseArtistType artistType)
         {
             builder.Append (artistType == ReleaseArtistType.VariousArtists ? "va-" : "sa-");
@@ -251,7 +251,7 @@ namespace MusicBrainz
         {
             return this == o as ArtistReleaseType;
         }
-        
+
         public static bool operator ==(ArtistReleaseType artistReleaseType1, ArtistReleaseType artistReleaseType2)
         {
             if (Object.ReferenceEquals (artistReleaseType1, null)) {
@@ -259,18 +259,18 @@ namespace MusicBrainz
             }
             return !Object.ReferenceEquals (artistReleaseType2, null) && artistReleaseType1.str == artistReleaseType2.str;
         }
-        
+
         public static bool operator !=(ArtistReleaseType artistReleaseType1, ArtistReleaseType artistReleaseType2)
         {
             return !(artistReleaseType1 == artistReleaseType2);
         }
-        
+
         public override int GetHashCode ()
         {
             return str.GetHashCode ();
         }
     }
-    
+
     #endregion
-    
+
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Disc.cs b/src/Libraries/MusicBrainz/MusicBrainz/Disc.cs
index 562b565..91f9f6f 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Disc.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Disc.cs
@@ -33,7 +33,7 @@ namespace MusicBrainz
         internal Disc ()
         {
         }
-        
+
         internal Disc (XmlReader reader)
         {
             reader.Read ();
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/DiscLinux.cs b/src/Libraries/MusicBrainz/MusicBrainz/DiscLinux.cs
index 22c127d..391f655 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/DiscLinux.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/DiscLinux.cs
@@ -36,40 +36,40 @@ namespace MusicBrainz
         const int CDROM_LEADOUT = 0xAA;
         const int CD_FRAMES = 75;
         const int XA_INTERVAL = ((60 + 90 + 2) * CD_FRAMES);
-        
+
         [DllImport ("libc.so.6", CharSet = CharSet.Auto)]
         static extern int open (string path, int flags);
-        
+
         [DllImport ("libc.so.6")]
         static extern int close (int fd);
-        
+
         [DllImport ("libc.so.6", EntryPoint = "ioctl")]
         static extern int read_toc_header (int fd, int request, ref cdrom_tochdr header);
         static int read_toc_header (int fd, ref cdrom_tochdr header)
         {
             return read_toc_header (fd, CDROMREADTOCHDR, ref header);
         }
-        
+
         [DllImport ("libc.so.6", EntryPoint = "ioctl")]
         static extern int read_multisession (int fd, int request, ref cdrom_multisession multisession);
         static int read_multisession (int fd, ref cdrom_multisession multisession)
         {
             return read_multisession (fd, CDROMMULTISESSION, ref multisession);
         }
-        
+
         [DllImport ("libc.so.6", EntryPoint = "ioctl")]
         static extern int read_toc_entry (int fd, int request, ref cdrom_tocentry entry);
         static int read_toc_entry (int fd, ref cdrom_tocentry entry)
         {
             return read_toc_entry (fd, CDROMREADTOCENTRY, ref entry);
         }
-        
+
         struct cdrom_tochdr
         {
             public byte cdth_trk0;
             public byte cdth_trk1;
         }
-        
+
         struct cdrom_tocentry
         {
             public byte cdte_track;
@@ -78,76 +78,76 @@ namespace MusicBrainz
             public int lba;
             public byte cdte_datamode;
         }
-        
+
         struct cdrom_multisession
         {
             public int lba;
             public byte xa_flag;
             public byte addr_format;
         }
-        
+
         int ReadTocHeader (int fd)
         {
             cdrom_tochdr th = new cdrom_tochdr ();
             cdrom_multisession ms = new cdrom_multisession ();
-            
+
             int ret = read_toc_header (fd, ref th);
-            
+
             if (ret < 0) return ret;
-            
+
             first_track = th.cdth_trk0;
             last_track = th.cdth_trk1;
-            
+
             ms.addr_format = CDROM_LBA;
             ret = read_multisession (fd, ref ms);
-            
+
             if(ms.xa_flag != 0) last_track--;
-            
+
             return ret;
         }
-        
+
         static int ReadTocEntry (int fd, byte track_number, ref ulong lba)
         {
             cdrom_tocentry te = new cdrom_tocentry ();
             te.cdte_track = track_number;
             te.cdte_format = CDROM_LBA;
-            
+
             int ret = read_toc_entry (fd, ref te);
-            
+
             if(ret == 0) lba = (ulong)te.lba;
-            
+
             return ret;
         }
-        
+
         int ReadLeadout (int fd, ref ulong lba)
         {
             cdrom_multisession ms = new cdrom_multisession ();
             ms.addr_format = CDROM_LBA;
-            
+
             int ret = read_multisession (fd, ref ms);
-            
+
             if (ms.xa_flag != 0) {
                 lba = (ulong)(ms.lba - XA_INTERVAL);
                 return ret;
             }
-            
+
             return ReadTocEntry (fd, CDROM_LEADOUT, ref lba);
         }
-        
+
         internal DiscLinux (string device)
         {
             int fd = open (device, O_RDONLY | O_NONBLOCK);
-            
+
             if (fd < 0) throw new LocalDiscException (String.Format ("Cannot open device '{0}'", device));
-            
+
             try {
                 if (ReadTocHeader (fd) < 0) throw new LocalDiscException ("Cannot read table of contents");
                 if (last_track == 0) throw new LocalDiscException ("This disc has no tracks");
-                
+
                 ulong lba = 0;
                 ReadLeadout (fd, ref lba);
                 track_offsets [0] = (int)lba + 150;
-                
+
                 for (byte i = first_track; i <= last_track; i++) {
                     ReadTocEntry (fd, i, ref lba);
                     track_offsets[i] = (int)lba + 150;
@@ -155,7 +155,7 @@ namespace MusicBrainz
             } finally {
                 close (fd);
             }
-            
+
             Init ();
         }
     }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/DiscWin32.cs b/src/Libraries/MusicBrainz/MusicBrainz/DiscWin32.cs
index 8aa8067..c357d40 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/DiscWin32.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/DiscWin32.cs
@@ -34,7 +34,7 @@ namespace MusicBrainz
 
         [DllImport ("winmm")]
         static extern Int32 mciGetErrorString (Int32 errorCode, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder errorText, Int32 errorTextSize);
-        
+
         delegate void MciCall (string result);
 
         internal DiscWin32 (string device)
@@ -96,7 +96,7 @@ namespace MusicBrainz
                 string.Format ("close {0} wait", alias),
                 string.Format ("Could not close device {0}", device),
                 null);
-            
+
             Init ();
         }
 
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Label.cs b/src/Libraries/MusicBrainz/MusicBrainz/Label.cs
index 547597d..412772a 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Label.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Label.cs
@@ -28,15 +28,15 @@ namespace MusicBrainz
 {
     public sealed class Label : MusicBrainzEntity
     {
-        
+
         #region Private
-        
+
         const string EXTENSION = "label";
         string country;
         LabelType? type;
-        
+
         #endregion
-        
+
         #region Constructors
 
         Label (string id) : base (id, null)
@@ -46,11 +46,11 @@ namespace MusicBrainz
         internal Label (XmlReader reader) : base (reader, false)
         {
         }
-        
+
         #endregion
-        
+
         #region Protected
-        
+
         internal override string UrlExtension {
             get { return EXTENSION; }
         }
@@ -74,11 +74,11 @@ namespace MusicBrainz
                 country = reader.ReadString ();
             } else base.ProcessXmlCore (reader);
         }
-        
+
         #endregion
 
         #region Public
-        
+
         public string GetCountry ()
         {
             return GetPropertyOrNull (ref country);
@@ -88,9 +88,9 @@ namespace MusicBrainz
         {
             return GetPropertyOrDefault (ref type, LabelType.None);
         }
-        
+
         #endregion
-        
+
         #region Static
 
         public static Label Get (string id)
@@ -115,13 +115,13 @@ namespace MusicBrainz
         {
             return label.ToString ();
         }
-        
+
         #endregion
 
     }
-    
+
     #region Ancillary Types
-    
+
     public enum LabelType
     {
         None,
@@ -131,7 +131,7 @@ namespace MusicBrainz
         BootlegProduction,
         ReissueProduction
     }
-    
+
     #endregion
-    
+
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/LocalDisc.cs b/src/Libraries/MusicBrainz/MusicBrainz/LocalDisc.cs
index 1db5798..dc4da1b 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/LocalDisc.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/LocalDisc.cs
@@ -36,16 +36,16 @@ namespace MusicBrainz
                 submission_service_url = value;
             }
         }
-        
+
         internal byte first_track;
         internal byte last_track;
         internal int [] track_offsets = new int [100];
         TimeSpan [] track_durations;
-        
+
         internal LocalDisc()
         {
         }
-        
+
         internal void Init ()
         {
             track_durations = new TimeSpan [last_track];
@@ -55,14 +55,14 @@ namespace MusicBrainz
             }
             GenerateId ();
         }
-        
+
         void GenerateId ()
         {
             StringBuilder input_builder = new StringBuilder (804);
 
             input_builder.AppendFormat ("{0:X2}", first_track);
             input_builder.AppendFormat ("{0:X2}", last_track);
-            
+
             for (int i = 0; i < track_offsets.Length; i++)
                 input_builder.AppendFormat ("{0:X8}", track_offsets[i]);
 
@@ -70,7 +70,7 @@ namespace MusicBrainz
             string base64 = Convert.ToBase64String (SHA1.Create ().
                 ComputeHash (Encoding.ASCII.GetBytes (input_builder.ToString ())));
             StringBuilder hash_builder = new StringBuilder (base64.Length);
-            
+
             foreach (char c in base64)
                 switch (c) {
                 case '+':
@@ -86,15 +86,15 @@ namespace MusicBrainz
                     hash_builder.Append (c);
                     break;
                 }
-            
+
             Id = hash_builder.ToString ();
         }
-        
+
         public TimeSpan [] GetTrackDurations ()
         {
             return (TimeSpan []) track_durations.Clone ();
         }
-        
+
         Uri submission_url;
         public Uri SubmissionUrl {
             get {
@@ -103,7 +103,7 @@ namespace MusicBrainz
                 }
                 return submission_url; }
         }
-        
+
         Uri BuildSubmissionUrl ()
         {
             StringBuilder builder = new StringBuilder ();
@@ -124,7 +124,7 @@ namespace MusicBrainz
             }
             return new Uri(builder.ToString ());
         }
-        
+
         public static LocalDisc GetFromDevice (string device)
         {
             if (device == null) throw new ArgumentNullException ("device");
@@ -142,7 +142,7 @@ namespace MusicBrainz
             }
         }
     }
-    
+
     public class LocalDiscException : Exception
     {
         public LocalDiscException (string message) : base (message)
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzEntity.cs b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzEntity.cs
index f5dd097..f34776e 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzEntity.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzEntity.cs
@@ -31,20 +31,20 @@ namespace MusicBrainz
     // A person-like entity, such as an artist or a label.
     public abstract class MusicBrainzEntity : MusicBrainzObject
     {
-        
+
         #region Private
-        
+
         string name;
         string sort_name;
         string disambiguation;
         string begin_date;
         string end_date;
         ReadOnlyCollection<string> aliases;
-        
+
         #endregion
-        
+
         #region Constructors
-        
+
         internal MusicBrainzEntity (string id, string parameters) : base (id, parameters)
         {
         }
@@ -52,9 +52,9 @@ namespace MusicBrainz
         internal MusicBrainzEntity (XmlReader reader, bool all_rels_loaded) : base (reader, all_rels_loaded)
         {
         }
-        
+
         #endregion
-        
+
         #region Protected
 
         internal override void CreateIncCore (StringBuilder builder)
@@ -103,7 +103,7 @@ namespace MusicBrainz
                 break;
             }
         }
-        
+
         internal static string CreateNameParameter (string name)
         {
             StringBuilder builder = new StringBuilder (name.Length + 6);
@@ -111,7 +111,7 @@ namespace MusicBrainz
             Utils.PercentEncode (builder, name);
             return builder.ToString ();
         }
-        
+
         #endregion
 
         #region Public
@@ -150,13 +150,13 @@ namespace MusicBrainz
         {
             return GetPropertyOrNew (ref aliases);
         }
-        
+
         public override string ToString ()
         {
             return name;
         }
-        
+
         #endregion
-        
+
     }
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzItem.cs b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzItem.cs
index 73187e7..56c31e1 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzItem.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzItem.cs
@@ -29,16 +29,16 @@ namespace MusicBrainz
     // The item-like product of an artist, such as a track or a release.
     public abstract class MusicBrainzItem : MusicBrainzObject
     {
-        
+
         #region Private
-        
+
         string title;
         Artist artist;
-        
+
         #endregion
-        
+
         #region Constructors
-        
+
         internal MusicBrainzItem (string id) : base (id, null)
         {
         }
@@ -47,9 +47,9 @@ namespace MusicBrainz
         {
             if (this.artist == null) this.artist = artist;
         }
-        
+
         #endregion
-        
+
         #region Protected Overrides
 
         internal override void CreateIncCore (StringBuilder builder)
@@ -79,11 +79,11 @@ namespace MusicBrainz
                 break;
             }
         }
-        
+
         #endregion
 
         #region Public
-        
+
         public virtual string GetTitle ()
         {
             return GetPropertyOrNull (ref title);
@@ -94,24 +94,24 @@ namespace MusicBrainz
         {
             return GetPropertyOrNull (ref artist);
         }
-        
+
         public override string ToString ()
         {
             return title;
         }
-        
+
         #endregion
-        
+
     }
-    
+
     #region Ancillary Types
-    
+
     public abstract class ItemQueryParameters
     {
         internal ItemQueryParameters ()
         {
         }
-        
+
         string title;
         public string Title {
             get { return title; }
@@ -149,7 +149,7 @@ namespace MusicBrainz
         }
 
         internal abstract void ToStringCore (StringBuilder builder);
-        
+
         public override string ToString ()
         {
             StringBuilder builder = new StringBuilder ();
@@ -181,7 +181,7 @@ namespace MusicBrainz
             return builder.ToString ();
         }
     }
-    
+
     #endregion
-    
+
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzObject.cs b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzObject.cs
index 765635e..4fea83f 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzObject.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzObject.cs
@@ -34,9 +34,9 @@ namespace MusicBrainz
 {
     public abstract class MusicBrainzObject
     {
-        
+
         #region Private Fields
-        
+
         static DateTime last_accessed;
         static readonly TimeSpan min_interval = new TimeSpan (0, 0, 1); // 1 second
         static readonly object server_mutex = new object ();
@@ -47,10 +47,10 @@ namespace MusicBrainz
             "label-rels",
             "url-rels"
         };
-        
+
         bool all_data_loaded;
         bool all_rels_loaded;
-        
+
         string id;
         byte score;
         ReadOnlyCollection<Relation<Artist>> artist_rels;
@@ -58,9 +58,9 @@ namespace MusicBrainz
         ReadOnlyCollection<Relation<Track>> track_rels;
         ReadOnlyCollection<Relation<Label>> label_rels;
         ReadOnlyCollection<UrlRelation> url_rels;
-        
+
         #endregion
-        
+
         #region Constructors
 
         internal MusicBrainzObject (string id, string parameters)
@@ -74,9 +74,9 @@ namespace MusicBrainz
             this.all_rels_loaded = all_rels_loaded;
             CreateFromXml (reader);
         }
-        
+
         #endregion
-        
+
         #region Private Methods
 
         string CreateInc ()
@@ -85,7 +85,7 @@ namespace MusicBrainz
             CreateIncCore (builder);
             return builder.ToString ();
         }
-        
+
         void CreateFromId (string id, string parameters)
         {
             XmlProcessingClosure (
@@ -98,7 +98,7 @@ namespace MusicBrainz
                 }
             );
         }
-        
+
         void CreateFromXml (XmlReader reader)
         {
             reader.Read ();
@@ -137,32 +137,32 @@ namespace MusicBrainz
             ProcessXmlCore (reader);
             reader.Close ();
         }
-        
+
         #endregion
-        
+
         #region Protected
-        
+
         internal bool AllDataLoaded {
             get { return all_data_loaded; }
         }
-        
+
         internal bool AllRelsLoaded {
             get { return all_rels_loaded; }
             set { all_rels_loaded = value; }
         }
-        
+
         internal virtual void CreateIncCore (StringBuilder builder)
         {
             if (!all_rels_loaded)
                 AppendIncParameters (builder, rels_params);
         }
-        
+
         internal static void AppendIncParameters (StringBuilder builder, string parameter)
         {
             builder.Append (builder.Length == 0 ? "&inc=" : "+");
             builder.Append (parameter);
         }
-        
+
         internal static void AppendIncParameters (StringBuilder builder, string parameter1, string parameter2)
         {
             builder.Append (builder.Length == 0 ? "&inc=" : "+");
@@ -176,7 +176,7 @@ namespace MusicBrainz
             foreach (string parameter in parameters)
                 AppendIncParameters (builder, parameter);
         }
-        
+
         internal void LoadMissingData ()
         {
             if (!all_data_loaded) {
@@ -195,7 +195,7 @@ namespace MusicBrainz
                 url_rels = obj.GetUrlRelations ();
             }
         }
-        
+
         internal T GetPropertyOrNull<T> (ref T field_reference) where T : class
         {
             if (field_reference == null) LoadMissingData ();
@@ -206,18 +206,18 @@ namespace MusicBrainz
         {
             return GetPropertyOrDefault (ref field_reference, default (T));
         }
-        
+
         internal T GetPropertyOrDefault<T> (ref T? field_reference, T default_value) where T : struct
         {
             if (field_reference == null) LoadMissingData ();
             return field_reference ?? default_value;
         }
-        
+
         internal ReadOnlyCollection<T> GetPropertyOrNew<T> (ref ReadOnlyCollection<T> field_reference)
         {
             return GetPropertyOrNew (ref field_reference, true);
         }
-        
+
         internal ReadOnlyCollection<T> GetPropertyOrNew<T> (ref ReadOnlyCollection<T> field_reference, bool condition)
         {
             if (field_reference == null && condition) LoadMissingData ();
@@ -232,12 +232,12 @@ namespace MusicBrainz
         internal virtual void ProcessAttributes (XmlReader reader)
         {
         }
-        
+
         internal abstract void LoadMissingDataCore ();
         internal abstract string UrlExtension { get; }
-        
+
         #endregion
-        
+
         #region Public
 
         public virtual string Id {
@@ -272,12 +272,12 @@ namespace MusicBrainz
         {
             return GetPropertyOrNew (ref url_rels, !all_rels_loaded);
         }
-        
+
         public override bool Equals (object obj)
         {
             return this == obj as MusicBrainzObject;
         }
-        
+
         public static bool operator ==(MusicBrainzObject obj1, MusicBrainzObject obj2)
         {
             if (Object.ReferenceEquals (obj1, null)) {
@@ -285,7 +285,7 @@ namespace MusicBrainz
             }
             return !Object.ReferenceEquals (obj2, null) && obj1.GetType () == obj2.GetType () && obj1.Id == obj2.Id;
         }
-        
+
         public static bool operator !=(MusicBrainzObject obj1, MusicBrainzObject obj2)
         {
             return !(obj1 == obj2);
@@ -295,7 +295,7 @@ namespace MusicBrainz
         {
             return (GetType ().Name + Id).GetHashCode ();
         }
-        
+
         #endregion
 
         #region Static
@@ -389,20 +389,20 @@ namespace MusicBrainz
 
             WebRequest request = WebRequest.Create (url);
             bool cache_implemented = false;
-            
+
             try {
                 request.CachePolicy = MusicBrainzService.CachePolicy;
                 cache_implemented = true;
             } catch (NotImplementedException) {}
-            
+
             HttpWebResponse response = null;
-            
+
             try {
                 response = (HttpWebResponse)request.GetResponse ();
             } catch (WebException e) {
                 response = (HttpWebResponse)e.Response;
             }
-            
+
             if (response == null) throw new MusicBrainzNotFoundException ();
 
             switch (response.StatusCode) {
@@ -483,6 +483,6 @@ namespace MusicBrainz
         #endregion
 
     }
-    
+
     internal delegate void XmlProcessingDelegate (XmlReader reader);
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzService.cs b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzService.cs
index 1006c38..5e860db 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzService.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/MusicBrainzService.cs
@@ -35,15 +35,15 @@ namespace MusicBrainz
                 service_url = value;
             }
         }
-        
+
         static RequestCachePolicy cache_policy;
         public static RequestCachePolicy CachePolicy {
             get { return cache_policy; }
             set { cache_policy = value; }
         }
-        
+
         public static event EventHandler<XmlRequestEventArgs> XmlRequest;
-        
+
         internal static void OnXmlRequest (string url, bool fromCache)
         {
             EventHandler<XmlRequestEventArgs> handler = XmlRequest;
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Query.cs b/src/Libraries/MusicBrainz/MusicBrainz/Query.cs
index 1ec5ffb..89241fa 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Query.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Query.cs
@@ -29,18 +29,18 @@ namespace MusicBrainz
 {
     public sealed class Query<T> : IEnumerable<T> where T : MusicBrainzObject
     {
-        
+
         #region Private
 
         const int default_limit = 100;
-        
+
         string parameters;
         string url_extension;
         int limit = default_limit;
-        
+
         int offset;
         int? count;
-        
+
         List<T> results;
         List<T> ResultsWindow {
             get {
@@ -74,21 +74,21 @@ namespace MusicBrainz
                 }
             }
         }
-        
+
         #endregion
 
         #region Constructors
-        
+
         internal Query (string url_extension, string parameters)
         {
             this.url_extension = url_extension;
             this.parameters = parameters;
         }
-        
+
         #endregion
 
         #region Public
-        
+
         public int Count {
             get {
                 if (count == null)
@@ -105,7 +105,7 @@ namespace MusicBrainz
                 return ResultsWindow[index - offset];
             }
         }
-        
+
         public T First ()
         {
             int tmp_limit = limit;
@@ -114,7 +114,7 @@ namespace MusicBrainz
             limit = tmp_limit;
             return result;
         }
-        
+
         public T PerfectMatch ()
         {
             int tmp_limit = limit;
@@ -122,16 +122,16 @@ namespace MusicBrainz
             T result1 = Count > 0 ? this [0] : null;
             T result2 = Count > 1 ? this [1] : null;
             limit = tmp_limit;
-            
+
             return (result1 != null && result1.Score == 100 && (result2 == null || result2.Score < 100))
                 ? result1 : null;
         }
-        
+
         public IEnumerable<T> Best ()
         {
             return Best (100);
         }
-        
+
         public IEnumerable<T> Best (int scoreThreshold)
         {
             foreach (T result in this) {
@@ -139,36 +139,36 @@ namespace MusicBrainz
                 yield return result;
             }
         }
-        
+
         public IEnumerator<T> GetEnumerator ()
         {
             for (int i = 0; i < Count; i++) yield return this [i];
         }
-        
+
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return GetEnumerator ();
         }
-        
+
         public static implicit operator T (Query<T> query)
         {
             return query.First ();
         }
-        
+
         #endregion
-        
+
     }
 
     [AttributeUsage (AttributeTargets.Method | AttributeTargets.Property)]
     internal sealed class QueryableAttribute : Attribute
     {
         readonly string name;
-        
+
         public QueryableAttribute (string name)
         {
             this.name = name;
         }
-        
+
         public string Name {
             get { return name; }
         }
@@ -179,17 +179,17 @@ namespace MusicBrainz
     {
         readonly string member;
         readonly string name;
-        
+
         public QueryableMemberAttribute (string member, string name)
         {
             this.member = member;
             this.name = name;
         }
-        
+
         public string Member {
             get { return member; }
         }
-        
+
         public string Name {
             get { return name; }
         }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Relation.cs b/src/Libraries/MusicBrainz/MusicBrainz/Relation.cs
index 96ebd23..4040c2d 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Relation.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Relation.cs
@@ -64,12 +64,12 @@ namespace MusicBrainz
         public string BeginDate {
             get { return begin; }
         }
-        
+
         public string EndDate {
             get { return end; }
         }
     }
-    
+
     public sealed class Relation<T> : RelationBase<T> where T : MusicBrainzObject
     {
         internal Relation (string type,
@@ -95,7 +95,7 @@ namespace MusicBrainz
         {
         }
     }
-    
+
     public enum RelationDirection
     {
         Forward,
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Release.cs b/src/Libraries/MusicBrainz/MusicBrainz/Release.cs
index 2aa6164..64e8c97 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Release.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Release.cs
@@ -30,9 +30,9 @@ namespace MusicBrainz
 {
     public sealed class Release : MusicBrainzItem
     {
-        
+
         #region Private
-        
+
         const string EXTENSION = "release";
         ReleaseType? type;
         ReleaseStatus? status;
@@ -43,9 +43,9 @@ namespace MusicBrainz
         ReadOnlyCollection<Event> events;
         ReadOnlyCollection<Track> tracks;
         int? track_number;
-        
+
         #endregion
-        
+
         #region Constructors
 
         Release (string id) : base (id)
@@ -55,17 +55,17 @@ namespace MusicBrainz
         internal Release (XmlReader reader) : base (reader, null, false)
         {
         }
-        
+
         #endregion
-        
+
         #region Protected
-        
+
         internal override string UrlExtension {
             get { return EXTENSION; }
         }
-        
+
         static readonly string [] track_params = new string [] { "tracks", "track-level-rels", "artist" };
-        
+
         internal override void CreateIncCore (StringBuilder builder)
         {
             AppendIncParameters (builder, "release-events", "labels");
@@ -153,7 +153,7 @@ namespace MusicBrainz
                 break;
             }
         }
-        
+
         #endregion
 
         #region Public
@@ -165,7 +165,7 @@ namespace MusicBrainz
 
         [Queryable ("release")]
         public override string GetTitle ()
-        { 
+        {
             return base.GetTitle ();
         }
 
@@ -200,7 +200,7 @@ namespace MusicBrainz
 
         [QueryableMember("Count", "discids")]
         public ReadOnlyCollection<Disc> GetDiscs ()
-        { 
+        {
             return GetPropertyOrNew (ref discs);
         }
 
@@ -220,7 +220,7 @@ namespace MusicBrainz
         }
 
         #endregion
-        
+
         #region Static
 
         public static Release Get (string id)
@@ -232,7 +232,7 @@ namespace MusicBrainz
         public static Query<Release> Query (string title)
         {
             if (title == null) throw new ArgumentNullException ("title");
-            
+
             ReleaseQueryParameters parameters = new ReleaseQueryParameters ();
             parameters.Title = title;
             return Query (parameters);
@@ -242,17 +242,17 @@ namespace MusicBrainz
         {
             if (title == null) throw new ArgumentNullException ("title");
             if (artist == null) throw new ArgumentNullException ("artist");
-            
+
             ReleaseQueryParameters parameters = new ReleaseQueryParameters ();
             parameters.Title = title;
             parameters.Artist = artist;
             return Query (parameters);
         }
-        
+
         public static Query<Release> Query (Disc disc)
         {
             if (disc == null) throw new ArgumentNullException ("disc");
-            
+
             ReleaseQueryParameters parameters = new ReleaseQueryParameters ();
             parameters.DiscId = disc.Id;
             return Query (parameters);
@@ -267,7 +267,7 @@ namespace MusicBrainz
         public static Query<Release> QueryFromDevice(string device)
         {
             if (device == null) throw new ArgumentNullException ("device");
-            
+
             ReleaseQueryParameters parameters = new ReleaseQueryParameters ();
             parameters.DiscId = LocalDisc.GetFromDevice (device).Id;
             return Query (parameters);
@@ -283,13 +283,13 @@ namespace MusicBrainz
         {
             return release.ToString ();
         }
-        
+
         #endregion
 
     }
-    
+
     #region Ancillary Types
-    
+
     public enum ReleaseType
     {
         None,
@@ -389,7 +389,7 @@ namespace MusicBrainz
             }
         }
     }
-    
+
     #endregion
-    
+
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Track.cs b/src/Libraries/MusicBrainz/MusicBrainz/Track.cs
index 0bf6d17..b23ffdd 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Track.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Track.cs
@@ -30,16 +30,16 @@ namespace MusicBrainz
 {
     public sealed class Track : MusicBrainzItem
     {
-        
+
         #region Private
-        
+
         const string EXTENSION = "track";
         TimeSpan? duration;
         ReadOnlyCollection<Release> releases;
         ReadOnlyCollection<string> puids;
-        
+
         #endregion
-        
+
         #region Constructors
 
         Track (string id) : base (id)
@@ -53,15 +53,15 @@ namespace MusicBrainz
         internal Track (XmlReader reader, Artist artist, bool all_rels_loaded) : base (reader, artist, all_rels_loaded)
         {
         }
-        
+
         #endregion
 
         #region Protected
-        
+
         internal override string UrlExtension {
             get { return EXTENSION; }
         }
-        
+
         internal override void CreateIncCore (StringBuilder builder)
         {
             if (releases == null) AppendIncParameters (builder, "releases");
@@ -105,7 +105,7 @@ namespace MusicBrainz
                 break;
             }
         }
-        
+
         #endregion
 
         #region Public
@@ -141,7 +141,7 @@ namespace MusicBrainz
         public int GetTrackNumber (Release release)
         {
             if (release == null) throw new ArgumentNullException ("release");
-            
+
             foreach (Release r in GetReleases ())
                 if (r.Equals (release))
                     return r.TrackNumber;
@@ -149,7 +149,7 @@ namespace MusicBrainz
         }
 
         #endregion
-        
+
         #region Static
 
         public static Track Get (string id)
@@ -161,7 +161,7 @@ namespace MusicBrainz
         public static Query<Track> Query (string title)
         {
             if (title == null) throw new ArgumentNullException ("title");
-            
+
             TrackQueryParameters parameters = new TrackQueryParameters ();
             parameters.Title = title;
             return Query (parameters);
@@ -171,19 +171,19 @@ namespace MusicBrainz
         {
             if (title == null) throw new ArgumentNullException ("title");
             if (artist == null) throw new ArgumentNullException ("artist");
-            
+
             TrackQueryParameters parameters = new TrackQueryParameters ();
             parameters.Title = title;
             parameters.Artist = artist;
             return Query (parameters);
         }
-        
+
         public static Query<Track> Query (string title, string artist, string release)
         {
             if (title == null) throw new ArgumentNullException ("title");
             if (artist == null) throw new ArgumentNullException ("artist");
             if (release == null) throw new ArgumentNullException ("release");
-            
+
             TrackQueryParameters parameters = new TrackQueryParameters ();
             parameters.Title = title;
             parameters.Artist = artist;
@@ -199,7 +199,7 @@ namespace MusicBrainz
 
         public static Query<Track> QueryLucene (string luceneQuery)
         {
-            if(luceneQuery == null) throw new ArgumentNullException ("luceneQuery"); 
+            if(luceneQuery == null) throw new ArgumentNullException ("luceneQuery");
             return new Query<Track> (EXTENSION, CreateLuceneParameter (luceneQuery));
         }
 
@@ -207,13 +207,13 @@ namespace MusicBrainz
         {
             return track.ToString ();
         }
-        
+
         #endregion
 
     }
-    
+
     #region Ancillary Types
-    
+
     public sealed class TrackQueryParameters : ItemQueryParameters
     {
         string release;
@@ -270,7 +270,7 @@ namespace MusicBrainz
             }
         }
     }
-    
+
     #endregion
-    
+
 }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/Utils.cs b/src/Libraries/MusicBrainz/MusicBrainz/Utils.cs
index ee80dfe..3c1fcb9 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/Utils.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/Utils.cs
@@ -34,22 +34,22 @@ namespace MusicBrainz
             EnumToString (builder, str);
             return builder.ToString ();
         }
-        
+
         public static void EnumToString (StringBuilder builder, string str)
         {
             builder.Append (str [0]);
             for (int i = 1; i < str.Length; i++) {
                 if (str [i] >= 'A' && str [i] <= 'Z')
-                    builder.Append ('-'); 
+                    builder.Append ('-');
                 builder.Append (str [i]);
             }
         }
-        
+
         public static T StringToEnum<T> (string name) where T : struct
         {
             return StringToEnumOrNull<T> (name) ?? default (T);
         }
-        
+
         public static T? StringToEnumOrNull<T> (string name) where T : struct
         {
             if (name != null)
@@ -58,18 +58,18 @@ namespace MusicBrainz
                         return value;
             return null;
         }
-        
+
         public static void PercentEncode (StringBuilder builder, string value)
         {
             foreach (char c in value) {
-                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || 
+                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ||
                     c == '-' || c == '_' || c == '.' || c == '~')
                     builder.Append (c);
                 else {
                     builder.Append ('%');
                     foreach (byte b in Encoding.UTF8.GetBytes (new char [] { c }))
                         builder.AppendFormat ("{0:X}", b);
-                } 
+                }
             }
         }
     }
diff --git a/src/Libraries/MusicBrainz/MusicBrainz/XmlRequestEventArgs.cs b/src/Libraries/MusicBrainz/MusicBrainz/XmlRequestEventArgs.cs
index 9ea5a34..1d4c756 100644
--- a/src/Libraries/MusicBrainz/MusicBrainz/XmlRequestEventArgs.cs
+++ b/src/Libraries/MusicBrainz/MusicBrainz/XmlRequestEventArgs.cs
@@ -28,7 +28,7 @@ namespace MusicBrainz
     {
         public readonly Uri Uri;
         public readonly bool FromCache;
-        
+
         internal XmlRequestEventArgs (Uri uri, bool fromCache)
         {
             Uri = uri;
diff --git a/src/Makefile.in b/src/Makefile.in
index bf30fca..ee42a35 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = AssemblyInfo.cs
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -80,10 +84,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -145,6 +177,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -164,6 +198,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -177,29 +213,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -364,14 +381,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -389,6 +406,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
@@ -422,7 +440,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -456,16 +474,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -473,14 +491,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -492,7 +510,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -501,29 +519,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -544,29 +567,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -596,6 +634,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -615,6 +654,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -623,18 +664,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -655,8 +706,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -677,6 +728,7 @@ run:
 	@pushd $(top_builddir); \
 	make run; \
 	popd;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/tests/Analyzer/Makefile.in b/tests/Analyzer/Makefile.in
index 49dedde..0a202e7 100644
--- a/tests/Analyzer/Makefile.in
+++ b/tests/Analyzer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -133,6 +137,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -152,6 +158,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -165,29 +173,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -356,6 +345,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -459,11 +449,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -481,6 +472,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -507,14 +499,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Analyzer/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  tests/Analyzer/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Analyzer/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Analyzer/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -532,6 +524,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -561,13 +554,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -596,6 +593,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -615,6 +613,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -623,18 +623,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -673,6 +683,7 @@ $(ANALYZER_EXE): Analyzer.cs
 	$(MCS) -r:System.Xml.Linq -r:$(DIR_BIN)/Hyena.dll -debug+ -out:$@ $<
 
 all: $(ALL_TARGETS)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b55433a..c0da6af 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -12,6 +12,7 @@ TEST_ASSEMBLIES = \
 	Migo.dll \
 	Mono.Media.dll \
 	Banshee.Core.dll \
+	Banshee.Gnome.dll \
 	Banshee.Services.dll \
 	Banshee.Dap.Mtp.dll
 
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 90b6432..e87f793 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -51,6 +53,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -70,6 +73,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -81,9 +85,37 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
@@ -145,6 +177,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -164,6 +198,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -177,29 +213,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -368,6 +385,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -471,11 +489,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -493,6 +512,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -517,6 +537,7 @@ DIST_SUBDIRS = \
 @ENABLE_TESTS_TRUE@	Migo.dll \
 @ENABLE_TESTS_TRUE@	Mono.Media.dll \
 @ENABLE_TESTS_TRUE@	Banshee.Core.dll \
+ at ENABLE_TESTS_TRUE@	Banshee.Gnome.dll \
 @ENABLE_TESTS_TRUE@	Banshee.Services.dll \
 @ENABLE_TESTS_TRUE@	Banshee.Dap.Mtp.dll
 
@@ -530,14 +551,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  tests/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -555,6 +576,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -586,7 +608,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -620,16 +642,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -637,14 +659,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -656,7 +678,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -665,29 +687,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -708,29 +735,44 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
@@ -760,6 +802,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -779,6 +822,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -787,18 +832,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -819,8 +874,8 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am check check-am clean clean-generic clean-libtool \
@@ -849,6 +904,7 @@ uninstall-am:
 @ENABLE_TESTS_TRUE@			export TEST_ASSEMBLIES="$$i"; $(RUNNER); \
 @ENABLE_TESTS_TRUE@		fi; \
 @ENABLE_TESTS_TRUE@	done;
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/tests/Performance/Makefile.in b/tests/Performance/Makefile.in
index bf83418..fe88282 100644
--- a/tests/Performance/Makefile.in
+++ b/tests/Performance/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -50,6 +52,7 @@ am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-karma.m4 \
 	$(top_srcdir)/build/m4/banshee/dap-mtp.m4 \
 	$(top_srcdir)/build/m4/banshee/dbus.m4 \
+	$(top_srcdir)/build/m4/banshee/gio.m4 \
 	$(top_srcdir)/build/m4/banshee/gnome-sharp.m4 \
 	$(top_srcdir)/build/m4/banshee/gstreamer.m4 \
 	$(top_srcdir)/build/m4/banshee/gtk-sharp.m4 \
@@ -69,6 +72,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -133,6 +137,8 @@ GDK_QUARTZ_LIBS = @GDK_QUARTZ_LIBS@
 GDK_X11_CFLAGS = @GDK_X11_CFLAGS@
 GDK_X11_LIBS = @GDK_X11_LIBS@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIOSHARP_CFLAGS = @GIOSHARP_CFLAGS@
+GIOSHARP_LIBS = @GIOSHARP_LIBS@
 GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@
 GLIBSHARP_LIBS = @GLIBSHARP_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
@@ -152,6 +158,8 @@ GST_CFLAGS = @GST_CFLAGS@
 GST_LIBS = @GST_LIBS@
 GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
 GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GTKSHARP_BEANS_CFLAGS = @GTKSHARP_BEANS_CFLAGS@
+GTKSHARP_BEANS_LIBS = @GTKSHARP_BEANS_LIBS@
 GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@
 GTKSHARP_LIBS = @GTKSHARP_LIBS@
 GTK_CFLAGS = @GTK_CFLAGS@
@@ -165,29 +173,10 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
-INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
-INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
-INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
-INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
-INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
-INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@
-INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
-INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
-INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
-INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
-INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@
-INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
-INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
-INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
-INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
-INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
-INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
 IPODSHARP_ASSEMBLIES = @IPODSHARP_ASSEMBLIES@
 IPODSHARP_CFLAGS = @IPODSHARP_CFLAGS@
 IPODSHARP_LIBS = @IPODSHARP_LIBS@
@@ -356,6 +345,7 @@ LINK_GLIB = $(GLIBSHARP_LIBS)
 LINK_GTK = $(GTKSHARP_LIBS)
 LINK_GCONF = $(GCONFSHARP_LIBS)
 LINK_GNOME = $(GNOMESHARP_LIBS)
+LINK_GIO = $(GTKSHARP_BEANS_LIBS) $(GIOSHARP_LIBS)
 LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS)
 LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) 
 LINK_TAGLIB = $(TAGLIB_SHARP_LIBS)
@@ -459,11 +449,12 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_INTERNETARCHIVE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MOBLIN = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_SERVICES_DEPS)
+REF_EXTENSION_PLAYER_MIGRATION = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
 LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
@@ -481,6 +472,7 @@ REF_EXTENSION_SAMPLE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_REMOTE_AUDIO = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_ZEROCONF)
 
 # Backends
+REF_BACKEND_GIO = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GIO)
 REF_BACKEND_GNOME = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_GCONF) $(LINK_GNOME)
 REF_BACKEND_GSTREAMER = $(LINK_BANSHEE_SERVICES_DEPS) $(LINK_GLIB)
 REF_BACKEND_UNIX = $(LINK_BANSHEE_CORE_DEPS) $(LINK_MONO_POSIX)
@@ -507,14 +499,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  tests/Performance/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  tests/Performance/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Performance/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Performance/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -532,6 +524,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -561,13 +554,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -596,6 +593,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -615,6 +613,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -623,18 +623,28 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -676,6 +686,7 @@ $(PERFORMANCE_EXE): PerformanceTests.cs
 	$(MCS) -target:exe -r:$(DIR_BIN)/Hyena.dll $(NUNIT_LIBS) $(LINK_BANSHEE_THICKCLIENT_DEPS) -out:$@ $<
 
 all: $(ALL_TARGETS)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:

-- 
banshee



More information about the Pkg-cli-apps-commits mailing list